RWeka NgramTokenizer

Я боролся с пакетом RWeka, особенно с функцией NGramTokenizer для создания биграмм. Изучая Интернет, я видел одного или двух других пользователей с той же проблемой, но без решения (это работает для меня).

Ниже приведен пример: 2-gram и 3 -грамм вместо 1-грамма при использовании 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
  • Обратите внимание, что нет биграмм, только униграммы (дом, это, зеленый).

Я попробовал это на изменчивом корпусе с разделенной функцией токенизатора, а также на том, как я узнал из курса DataCamp, но вместо этого получил следующую проблему.

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

Были и другие обходные решения, которые я видел в Интернете, которые работали нормально, но все же приводили к униграммам, как показано выше.

Запуск Java 1.8 и R 3.4.3 в 64-разрядной версии ОС Windows.

Я попытался установить более старые версии RWeka, но при попытке старой установки tm возникли ошибки, поэтому я не мог заставить это работать для меня (используемые версии, на которые ссылается LukeA в потоке SO, связанном в начале этого вопроса ).


person Shane    schedule 08.02.2018    source источник


Ответы (2)


Вам нужно использовать 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
person clemens    schedule 08.02.2018
comment
Я полностью думал, что сделал VCorpus с таким подходом, но, видимо, это не так. Благодарю вас! Я очень рад, что мне не нужно ничего понижать. - person Shane; 09.02.2018

Эта проблема состояла из двух частей, и я, вероятно, должен был сформулировать ее лучше.
1) Элемент VCorpus, адресованный @clemens — использование только функции корпуса оставит вас с униграммами

2) Однако, увидев это и применив подход к моему большому набору данных, я получил ошибку, указанную ниже:

Ошибка в .jcall("RWekaInterfaces", "[S", "tokenize", .jcast(tokenizer,: java.lang.NullPointerException Вызывается из: .jcheck()

Я думал, что это произошло из-за проблем несовместимости RWeka, Java или версии пакета. Однако, увидев, что с первого шага все работает нормально, я пришел к выводу, что это должен быть мой набор данных. При исследовании и тестировании я нашел односложные ответы и пробелы. После очистки для обоих из них я перестал получать сообщение об ошибке. Обратите внимание, что мне все равно пришлось сделать это, даже если мой Weka Control имел настройки min = 1, max = 2.

person Shane    schedule 09.02.2018