RWeka NgramTokenizer

时间:2018-02-08 06:27:20

标签: r rweka

我一直在努力使用RWeka软件包,特别是使用NGramTokenizer函数来制作bigrams。从网上搜索,我看到一两个用户遇到同样的问题,但没有解决方案(对我有用)。

以下是一个例子: 2-gram and 3-gram instead of 1-gram using RWeka

所以跑步:

library(RWeka) 
library(tm)

as.matrix(TermDocumentMatrix(Corpus(VectorSource(c(txt1 = "This is my house",
                                               txt2 = "My house is green"))),
                         list(tokenize = function(x) NGramTokenizer(x, 
                                                                    Weka_control(min=2, 
                                                                                 max=2)),
                              tolower = TRUE)))

我明白了:

       Docs
Terms   txt1 txt2
  house    1    1
  this     1    0
  green    0    1
  • 注意没有bigrams,只有unigrams(房子,这个,绿色)。

我已经在一个易失的语料库中尝试了它,其中分离了tokenizer功能以及我从DataCamp课程中学到了什么,但是却得到了以下问题。

Error in .jcall("RWekaInterfaces", "[S", "tokenize", .jcast(tokenizer,
:    java.lang.NullPointerException Called from: .jcheck()

我在互联网上看到的解决方案还有其他工作正常,但仍然导致像上面这样的unigrams。

在64位Windows操作系统上运行Java 1.8和R 3.4.3都是64位。

我尝试安装较旧版本的RWeka,但是在尝试旧版本的tm时,它出现了错误,因此我无法为我做这项工作(LukeA在SO线程中引用的已使用版本这个问题的开头)。

2 个答案:

答案 0 :(得分:0)

您需要使用VCorpus代替Corpus才能使用NGramTokenizer

因此,如果您将代码更改为:

as.matrix(TermDocumentMatrix(VCorpus(VectorSource(c(txt1 = "This is my house",
                                                    txt2 = "My house is green"))),
                             list(tokenize = function(x) NGramTokenizer(x, 
                                                                        Weka_control(min=2, 
                                                                                     max=2)),
                                  tolower = TRUE)))

它将返回:

          Docs
Terms      1 2
  house is 0 1
  is green 0 1
  is my    1 0
  my house 1 1
  this is  1 0

答案 1 :(得分:0)

这个问题有两个部分,我可能应该更清楚地表达出来 1)由@clemens处理的VCorpus元素 - 仅使用语料库函数将为你留下unigrams

2)然而,在看到并在我的大型数据集上应用该方法后,我得到了下面引用的错误:

  

.jcall错误(" RWekaInterfaces"," [S"," tokenize",。jcast(tokenizer,   :java.lang.NullPointerException从:.jcheck()

调用

我认为这是由于RWeka,Java或包版本不兼容问题。然而,在看到它从第1步工作正常后,我得出结论它必须是我的数据集。在调查和测试中,我找到了一个单词的答案和空白。清理完这两个后,我停止收到错误消息。注意即使我的Weka Control设置为min = 1,max = 2,我仍然必须这样做。