使用R和Rweka在termdocument矩阵中使用bigrams而不是单个单词

ds1*_*s10 16 text r text-mining

我找到了一种在术语 - 文档矩阵中使用bigrams而不是单个令牌的方法.解决方案已在stackoverflow上提出: findAssocs用于R中的多个术语

这个想法是这样的:

library(tm)
library(RWeka)
data(crude)

#Tokenizer for n-grams and passed on to the term-document matrix constructor
BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
txtTdmBi <- TermDocumentMatrix(crude, control = list(tokenize = BigramTokenizer))
Run Code Online (Sandbox Code Playgroud)

但最后一行给出了错误:

Error in rep(seq_along(x), sapply(tflist, length)) : 
  invalid 'times' argument
In addition: Warning message:
In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'
Run Code Online (Sandbox Code Playgroud)

如果我从最后一行删除了tokenizer它会创建一个常规的tdm,所以我猜问题是在BigramTokenizer函数中的某个地方,尽管这是Weka网站在这里给出的相同例子:http://tm.r-forge.r -project.org/faq.html#Bigrams.

bri*_*eng 31

在Anthony的评论的启发下,我发现您可以指定parallel库默认使用的线程数(在调用之前指定它NgramTokenizer):

# Sets the default number of threads to use
options(mc.cores=1)
Run Code Online (Sandbox Code Playgroud)

由于NGramTokenizer似乎挂起了parallel::mclapply电话,因此改变线程数似乎可以解决它.


Dmi*_*nov 5

似乎使用带有并行包的RWeka存在问题.我在这里找到了解决方法.

最重要的一点是不加载RWeka包并在封装函数中使用命名空间.

所以你的tokenizer应该是这样的

BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}
Run Code Online (Sandbox Code Playgroud)