首页 > 解决方案 > 查找字符串是否包含给定关键字集中的单词的方法

问题描述

我有一个包含工单详细信息的数据集,包括 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 值的输出数据帧。

标签: r

解决方案


为此,您可以使用 Aho-Corasick 算法,它是一种复杂度为 O(n) 的文本搜索算法,您可以在此处找到用 R 语言实现它的包,

对于 bioc: https ://rdrr.io/bioc/Starr/man/match_ac.html

对于 CRAN: https ://rdrr.io/cran/AhoCorasickTrie/ 。


推荐阅读