Создание N-грамм с помощью tm и RWeka — работает с VCorpus, но не с Corpus

Следуя многочисленным руководствам по созданию biGram с использованием пакетов 'tm' и 'RWeka', я был разочарован тем, что в tdm возвращались только 1-Gram. . Путем долгих проб и ошибок я обнаружил, что надлежащее функционирование достигается с помощью «VCorpus», но не с использованием «Corpus». Кстати, я почти уверен, что это работало с «Корпусом» ~ 1 месяц назад, но сейчас это не так.

R (3.3.3), RTools (3.4), RStudio (1.0.136) и все пакеты (tm 0.7-1, RWeka 0.4-31) обновлены до последней версии.

Я был бы признателен за любое понимание того, что это не будет работать с Корпусом, и есть ли у других такая же проблема.

#A Reproducible example
#
#Weka bi-gram test
#

library(tm)
library(RWeka)

someCleanText <- c("Congress shall make no law respecting an establishment of",
                    "religion, or prohibiting the free exercise thereof or",
                    "abridging the freedom of speech or of the press or the",
                    "right of the people peaceably to assemble and to petition",
                    "the Government for a redress of grievances")

aCorpus <- Corpus(VectorSource(someCleanText))   #With this, only 1-Grams are created
#aCorpus <- VCorpus(VectorSource(someCleanText)) #With this, biGrams are created as desired

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min=2, max=2))

aTDM <- TermDocumentMatrix(aCorpus, control=list(tokenize=BigramTokenizer))

print(aTDM$dimnames$Terms)

Результат с «Корпусом»

 [1] "congress"      "establishment" "law"           "make"         
 [5] "respecting"    "shall"         "exercise"      "free"         
 [9] "prohibiting"   "religion"      "the"           "thereof"      
[13] "abridging"     "freedom"       "press"         "speech"       
[17] "and"           "assemble"      "peaceably"     "people"       
[21] "petition"      "right"         "for"           "government"   
[25] "grievances"    "redress"

Результат с «VCorpus»

 [1] "a redress"        "abridging the"    "an establishment" "and to"          
 [5] "assemble and"     "congress shall"   "establishment of" "exercise thereof"
 [9] "for a"            "free exercise"    "freedom of"       "government for"  
[13] "law respecting"   "make no"          "no law"           "of grievances"   
[17] "of speech"        "of the"           "or of"            "or prohibiting"  
[21] "or the"           "peaceably to"     "people peaceably" "press or"        
[25] "prohibiting the"  "redress of"       "religion or"      "respecting an"   
[29] "right of"         "shall make"       "speech or"        "the free"        
[33] "the freedom"      "the government"   "the people"       "the press"       
[37] "thereof or"       "to assemble"      "to petition"

person Paul_J    schedule 13.03.2017    source источник
comment
не воспроизводится, какую версию R / RWeka вы используете?   -  person Sandipan Dey    schedule 13.03.2017
comment
Спасибо за попытку. Означает ли «невоспроизводимость», что вы не можете выполнить для воспроизведения или что вы получили ожидаемые результаты, в отличие от меня? Версии, которые я использую, перечислены в исходном вопросе: R (3.3.3), RWeka (0.4-31). В дополнение к «tm», RTools и RStudio были обновлены в течение дня после исходного сообщения до последних доступных версий.   -  person Paul_J    schedule 14.03.2017
comment
У меня такая же проблема, как у Paul_J. Это не имеет ничего общего с Weka, потому что я могу добиться аналогичного поведения с самописными токенизаторами. Я использую R версии 3.3.2 (2016-10-31) и tm 0.7.1   -  person Funkwecker    schedule 25.04.2017
comment
привет @SandipanDey, @paul-j, кажется, есть связанный с этим вопрос о SO здесь. Я столкнулся с этой проблемой сегодня, когда R, RWeka, RStudio все использовали текущую версию на момент написания этой статьи.   -  person hongsy    schedule 08.06.2017
comment
Вы можете сделать sessionInfo() для нас?   -  person hongsy    schedule 01.08.2017
comment
Я воспроизвел точно такой же результат с помощью этого (усеченного) sessionInfo(): R версия 3.4.0 (2017-04-21) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия) другие прикрепленные пакеты: [1] LDAvis_0. 3.2 stringi_1.1.5 dplyr_0.7.2 topicmodels_0.2-6 bindrcpp_0.2 tm_0.7-1 [7] magrittr_1.5 openNLPmodels.en_1.5-1 RWeka_0.4-34 openNLP_0.2-6 NLP_0.1-10   -  person user1603472    schedule 10.08.2017
comment
С Корпусом я получаю униграммы; С VCorpus я получаю сообщение об ошибке, когда я вызываю TermDocumentMatrix(). Я получаю следующее: Ошибка в .jcall(man, Ljava/lang/Object;, objectForName, as_qualified_name(name)) : java.lang.IncompiledClassChangeError: Implementing class   -  person Brandon Loudermilk    schedule 09.05.2018


Ответы (2)


Я работал с R.3.4.1 и перешел на R3.3.3, теперь у меня заработало решение VCorpus. И TM, и RWeka правильно создают биграммы.

sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
person Jesús Sánchez    schedule 28.08.2017


Я смог воспроизвести точно такие же результаты, как у вас.

Когда я начал читать о Corpus и VCorpus, в большинстве ссылок указывалось, что разница в основном заключалась в том, что VCorpus был изменчивым корпусом, который остается в памяти, но это не единственная разница. Корпус использует SimpleCorpus по умолчанию, который не имеет всех свойств, которые имеет VCorpus, поэтому вы можете получить 2-граммы, используя VCorpus, а не обычный Корпус. Для получения дополнительной информации об этом перейдите к этой публикации в stackexchange: https://stats.stackexchange.com/questions/164372/what-is-vectorsource-and-vcorpus-in-tm-text-mining-package-in-r

person Efrain Plaza    schedule 26.10.2019