字典中的单词匹配快速计数为R中的文本向量

mla*_*ans 4 text r

我在R中有很长的简短文本(比如,长度为1000万).清单的前五项如下:

  1. "我是一只愤怒的老虎."
  2. "我是不高兴的蛤蜊."
  3. "我是一个愤怒而不快乐的老虎."
  4. "我生气,愤怒,老虎."
  5. "哔哔喳喳."

我有一本字典,我们会说它是由"愤怒"和"不快乐"组成的.

在文本向量上从这本字典中获取匹配计数的最快方法是什么?在这种情况下,正确的答案是矢量[1, 1, 2, 2, 0].

我试图解决方案包括quantedatm,基本上他们都失败了,因为我不能存储在内存中的任何大型文档特征矩阵.对于任何解决方案奖励积分使用qdap,dplyr,和termco.

Sot*_*tos 8

使用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)


akr*_*run 6

我们可以使用和的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)

  • 这不会重现所需的输出(请参阅第4个字符串的结果).猜猜`Reduce("+",lapply(v2,stringr :: str_count,string = v1))`就是答案. (2认同)