16

我找到了一种在术语文档矩阵中使用二元组而不是单个标记的方法。该解决方案已在此处的 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'

如果我从最后一行删除标记器,它会创建一个常规 tdm,所以我猜问题出在 BigramTokenizer 函数中,尽管这与 Weka 网站在此处给出的示例相同:http://tm.r-forge.r -project.org/faq.html#Bigrams

4

2 回答 2

31

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

# Sets the default number of threads to use
options(mc.cores=1)

由于NGramTokenizer似乎挂在parallel::mclapply电话上,因此更改线程数似乎可以解决它。

于 2013-11-27T19:09:09.020 回答
5

似乎将RWeka并行包一起使用存在问题。我在这里找到了解决方法

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

所以你的标记器应该看起来像

BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}
于 2014-03-26T13:54:22.403 回答