我有一个向量字符串(“句子”),其中每个句子中有不同数量的不同单词:
sentences <- c("word01 word02",
"word01 word04 word03",
"word10",
"",
"word02 word07 word08 word09",
...)
我还有一个感兴趣的单词向量:
wordsOfInterest <- c("word01", "word02", ...)
我想知道是否在每个句子中至少找到了wordsInterest中的一个。输出应该是逻辑向量,其长度与句子向量的长度相同。因此,鉴于上述向量,输出向量应具有值
TRUE TRUE FALSE FALSE TRUE ...
句子的数量取决于数据集,并且可以是从几到十万之间的任何值,每个句子中的单词数可以是从零到十万之间的任何值,并且Interest的单词数可以是从一到零的任何内容到一百左右。
此外,我有几个要分析的数据集,每个数据集都有几个单独的句子向量。然后,我需要将几套wordsOfInterest向量应用于每个数据集中的每个句子向量,因此累积的计算需求开始累积。
到目前为止,我唯一成功的解决方案是对每个wordOfInterest分别使用str_detect并将其应用于各种句子矢量,但是当然我想找到另一种解决方案。我试图使用本机矢量化以及R中的FOR循环来解决这个问题,但无济于事。因此,我有两个问题,一开始是怎么做的,然后是如何尽快地做到这一点(包括计算和键入方式)。我感谢所有帮助。
答案 0 :(得分:1)
您可以使用grepl()
并折叠wordsOfInterest
,以在每个单词周围包含|
和\\b
单词检查的边缘。这样可以防止部分匹配,例如当感兴趣的单词是“ the”时找到“ then”。
matchString <- paste0(wordsOfInterest, collapse = "\\b|")
matchString <- paste0("\\b", matchString, "\\b")
grepl(pattern = matchString, x = sentences)
使用以下确认:
wordsOfInterest <- sample(1:1000000, 100)
sentences <- ""
for(i in 1:sample(1:100, 1)){
sentences <- c(sentences,paste(sample(1:1000000, sample(0:100)), collapse = " "))
}
matchString <- paste(wordsOfInterest, collapse = "\\s+|")
grepl(pattern = matchString, x = sentences)
关于grepl()
调用的吞吐量:对于您指定长度的64,000个句子,它花费了约1.36秒。
> length(sentences)
[1] 63470
> microbenchmark::microbenchmark(grepl(pattern = matchString, x = sentences), times = 10)
Unit: seconds
min lq mean median uq max neval
1.280757 1.317157 1.357845 1.337714 1.374004 1.554918 10