我在R中有很长的简短文本(比如,长度为1000万).清单的前五项如下:
我有一本字典,我们会说它是由"愤怒"和"不快乐"组成的.
在文本向量上从这本字典中获取匹配计数的最快方法是什么?在这种情况下,正确的答案是矢量[1, 1, 2, 2, 0].
我试图解决方案包括quanteda和tm,基本上他们都失败了,因为我不能存储在内存中的任何大型文档特征矩阵.对于任何解决方案奖励积分使用qdap,dplyr,和termco.
使用stringi包,
library(stringi)
stri_count_regex(v1, paste(v2, collapse = '|'))
#[1] 1 1 2 2 0
Run Code Online (Sandbox Code Playgroud)
数据
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")
Run Code Online (Sandbox Code Playgroud)
我们可以使用和的base R方法regexprReduce
Reduce(`+`, lapply(dict, function(x) lengths(regmatches(txt, gregexpr(x, txt)))))
#[1] 1 1 2 2 0
Run Code Online (Sandbox Code Playgroud)
或者更快的方法
Reduce(`+`, lapply(dict, function(x) vapply(gregexpr(x, txt),
function(y) sum(attr(y, "match.length")>0), 0)))
#[1] 1 1 2 2 0
Run Code Online (Sandbox Code Playgroud)
注意:对于大型数据集和大量字典元素,此方法不会有任何限制.
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")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
537 次 |
| 最近记录: |