我找到了一种在术语 - 文档矩阵中使用bigrams而不是单个令牌的方法。该解决方案已在stackoverflow上提出:findAssocs for multiple terms in 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))
然而,最后一行给出了错误:
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'
如果我从最后一行删除了tokenizer,它会创建一个常规的tdm,所以我猜问题是在BigramTokenizer函数中的某个地方,尽管这与Weka网站在此提供的示例相同:http://tm.r-forge.r-project.org/faq.html#Bigrams。
答案 0 :(得分:31)
受Anthony的评论启发,我发现您可以指定parallel
库默认使用的线程数(在调用NgramTokenizer
之前指定它):
# Sets the default number of threads to use
options(mc.cores=1)
由于NGramTokenizer
似乎挂在parallel::mclapply
调用上,因此更改线程数似乎可以解决它。
答案 1 :(得分:5)
使用 RWeka 和并行包时似乎存在问题。我找到了解决方法here.
最重要的一点是不加载RWeka包并在封装函数中使用命名空间。
所以你的tokenizer应该看起来像
BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}