r - 查找字符串是否包含给定关键字集中的单词的方法
问题描述
我有一个包含工单详细信息的数据集,包括 Short_Description 和 Notes 列,我还有一个包含关键字和相应类别的数据集。我必须通过关键字运行 Short_Description 和 Notes 并查找我们是否有可用的关键字并选择相应的类别。
问题是数据很大(超过1500行),关键字大约有600行不同类别和5列关键字。当我使用 FOR 循环时,运行代码需要大量时间(超过 5 小时)。
有什么方法或任何其他功能可以用来优化代码吗?
我正在使用 str_detect() 获得 600 行单张票的输出,并且
Data= read.csv("Open_tickets.csv")
k= read_excel("Keywords_All.xlsx")
setDT(k)[, Seq := rowid(Assignment.Group)]
k[,4:13]=tolower(unlist(k[,4:13]))
k[,4:13]=str_replace_all(unlist(k[,4:13]),"[^a-zA-Z\\s]","")
sd= data.frame()
notes=data.frame()
for (i in 1:NROW(Data1))
{
for (j in 1:NROW(k))
{
Data$Short_Description[i]=tolower(Data$Short_Description[i])
str1=str_replace_all(Data$Short_Description[i],"[^a-zA-Z\\s]","")
newd1 = str_detect(str1,unlist(k[j,4:8]))
newd1=as.data.frame(t(newd1))
newd1$Assignment_Group= Data$Assignment_Group[i]
newd1$inc= Data1$Number[i]
newd1$Short_Description = Data$Short_Description[i]
newd1$Notes=Data$Notes[i]
newd1$Subcategory=k$`Sub Category`[j]
newd1$Category=k$Category[j]
newd1$seq = k$Seq[j]
sd=rbind(sd,newd1)
Data$Notes[i]=tolower(Data$Notes[i])
str2= str_replace_all(Data$Notes[i],"[^a-zA-Z\\s]","")
newd2 = str_detect(str2,unlist(k[j,4:8]))
newd2=as.data.frame(t(newd2))
newd2$Assignment_Group= Data1$Assignment_Group[i]
newd2$inc= Data1$Number[i]
newd2$Short_Description = Data1$Short_Description[i]
newd2$Notes=Data1$Notes[i]
newd2$Subcategory=k$`Sub Category`[j]
newd2$Category=k$Category[j]
newd2$seq = k$Seq[j]
notes=rbind(notes,newd2)
}
}
我得到带有相应关键字的 True 和 False 值的输出数据帧。
解决方案
为此,您可以使用 Aho-Corasick 算法,它是一种复杂度为 O(n) 的文本搜索算法,您可以在此处找到用 R 语言实现它的包,
对于 bioc: https ://rdrr.io/bioc/Starr/man/match_ac.html
对于 CRAN: https ://rdrr.io/cran/AhoCorasickTrie/ 。
推荐阅读
- html - CSS中的居中块
- mysql - AWS RDS只读机——如何添加新用户
- spring-cloud - 为什么 zipkin 中没有显示服务?
- c# - 是否可以在没有 AddMvc 的 ASP.Net Core 2.1 中创建路由映射?
- java - 如何将数组从一个类传输到另一个类,特别是源类数组中的 int 字段
- nativescript - NativeScript:未呈现的简单模板
- java - 如何将一串数字、空格和逗号更改为整数数组列表
- c# - Linq 如何返回匿名类型的 IQueryable 以获取其记录数?
- linux - 编译JDK8错误。''找不到freetype''
- reactjs - 如何正确延迟渲染