【问题标题】:RWeka NgramTokenizerRWeka NgramTokenizer
【发布时间】:2018-07-18 15:19:10
【问题描述】:

我一直在努力使用 RWeka 包,特别是使用 NGramTokenizer 函数来制作二元组。通过搜索互联网,我看到一两个其他用户遇到同样的问题但没有解决方案(这对我有用)。

下面是一个例子: 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
  • 注意没有二元组,只有一元组(house、this、green)。

我已经在一个 volatile 语料库上尝试了它,其中分离出分词器功能以及我如何从 DataCamp 课程中学习,但得到了以下问题。

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

我在 Internet 上看到的其他解决方案运行良好,但仍然产生了像上面这样的 unigrams。

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

我尝试安装旧版本的 RWeka,但在尝试旧版本的 tm 安装时,它出现了错误,所以我无法为我工作(使用由 LukeA 在开头链接的 SO 线程中引用的版本这个问题)。

【问题讨论】:

    标签: r rweka


    【解决方案1】:

    您需要使用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
    

    【讨论】:

    • 我完全以为我在这种方法上做了 VCorpus - 但显然我没有。谢谢!我很高兴我不需要降级任何东西。
    【解决方案2】:

    这个问题有两个部分,我可能应该更好地表达它。
    1) @clemens 解决的 VCorpus 元素 - 仅使用语料库函数将为您提供 unigrams

    2) 但是,在看到这一点并将该方法应用于我的更大数据集之后,我得到了以下引用的错误:

    .jcall("RWekaInterfaces", "[S", "tokenize", .jcast(tokenizer, :java.lang.NullPointerException 调用自:.jcheck()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-17
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2018-01-26
      相关资源
      最近更新 更多