我有一个非常长的向量的简短文本R(例如,长度1千万)。清单的前五项如下:
我有一本字典,我们会说它是由“生气”和“不快乐”两个词组成的。
在文本向量上,从这本词典中获得匹配数的最快方法是什么?在这种情况下,正确的答案将是向量[1, 1, 2, 2, 0]。
我尝试过涉及quanteda和tm的解决方案,它们基本上都失败了,因为我无法在内存中存储任何大型文档功能矩阵。任何使用qdap、dplyr和termco的解决方案都可以加分。
发布于 2017-01-02 08:55:05
使用stringi包,
library(stringi)
stri_count_regex(v1, paste(v2, collapse = '|'))
#[1] 1 1 2 2 0数据
dput(v1)
c("I am an angry tiger.", "I am unhappy clam.", "I am an angry and unhappy tiger.",
"I am an angry, angry, tiger.", "Beep boop.")
dput(v2)
c("angry", "unhappy")发布于 2017-01-02 08:49:37
我们可以将base R方法与regexpr和Reduce结合使用
Reduce(`+`, lapply(dict, function(x) lengths(regmatches(txt, gregexpr(x, txt)))))
#[1] 1 1 2 2 0或者更快的方法是
Reduce(`+`, lapply(dict, function(x) vapply(gregexpr(x, txt),
function(y) sum(attr(y, "match.length")>0), 0)))
#[1] 1 1 2 2 0注意:对于大量的数据集和大量的字典元素,此方法不会有任何限制。
数据
txt <- c("I am an angry tiger.", "I am unhappy clam.", "I am an angry and unhappy tiger.",
"I am an angry, angry, tiger." ,"Beep boop.")
dict <- c("angry", "unhappy")https://stackoverflow.com/questions/41423668
复制相似问题