在使用R和Rweka时,在term-document矩阵中使用bigrams而不是单词。

16
我已经找到了一种使用二元组而不是单个标记在术语-文档矩阵中的方法。该解决方案已经在stackoverflow上提出,链接为:在R中查找多个术语的findAssocs
这个想法大致如下:
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

它对我来说运行良好;我无法重现您的错误消息。您可以尝试更新软件包和 R,以确保您正在使用最新版本的所有内容。 - Ben
再次感谢您的建议。我检查了我的R版本和update.packages,但仍然收到错误消息。我想知道这是否是操作系统问题,因为我在OS X上经常遇到Java问题,所以也许影响了weka?我会在我的Windows机器上尝试一下。我也会尝试这个:https://dev59.com/cWox5IYBdhLWcg3w6oZf - ds10
是的,下一步是确保您的Java安装程序全部就绪(这可能是相当令人沮丧的任务!)。我不使用OSX,也许它不那么糟糕,但Windows并不容易... - Ben
我检查了我的Java安装,没有发现任何异常。现在我不再收到错误消息,但是当我尝试运行代码时,我的Mac会卡住。历史上,我在OS X和各种内置Java的设备上遇到过问题。然而,这段代码在我的Windows电脑上完美地工作。 - ds10
遇到了同样的问题。打开调试并缩小到这一行。使用默认的scan_tokenizer可以正常工作,但即使使用NGramTokenizer也会返回NULL。 parallel::mclapply(corpus, FUN=termFreq, control = list(tokenize = scan_tokenizer)) - Anthony
2个回答

31

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

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

由于NGramTokenizer似乎在parallel::mclapply调用时停顿,改变线程数似乎可以解决这个问题。

Translated:

由于NGramTokenizer似乎在parallel::mclapply调用时停顿,改变线程数似乎可以解决这个问题。


没有在Shinyapps.io上遇到过这个问题,但是这个方法解决了问题。谢谢! - jadianes

5
似乎使用RWekaparallel包存在问题。我在这里找到了解决方法。

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

因此,您的分词器应该如下所示:
BigramTokenizer <- function(x) {RWeka::NGramTokenizer(x, RWeka::Weka_control(min = 2, max = 2))}

有没有NGramTokenizer的替代品?由于某些R / Java版本问题,我的电脑上RWeka无法工作。 - harsha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接