我一直在努力使用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
我已经在一个易失的语料库中尝试了它,其中分离了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线程中引用的已使用版本这个问题的开头)。
答案 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,我仍然必须这样做。