2 грамма и 3 грамма вместо 1 грамма при использовании RWeka

Я пытаюсь извлечь 1 грамм, 2 грамма и 3 грамма из корпуса поезда, используя функцию RWeka NGramTokenizer. К сожалению, получаю только 1-грамм. Вот мой код:

train_corpus
# clean-up
cleanset1<- tm_map(train_corpus, tolower)
cleanset2<- tm_map(cleanset1, removeNumbers)
cleanset3<- tm_map(cleanset2, removeWords, stopwords("english"))
cleanset4<- tm_map(cleanset3, removePunctuation)
cleanset5<- tm_map(cleanset4, stemDocument, language="english")
cleanset6<- tm_map(cleanset5, stripWhitespace)

# 1-gram
NgramTokenizer1 <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 1))
train_dtm_tf_1g <- DocumentTermMatrix(cleanset6, control=list(tokenize=NgramTokenizer1))
dim(train_dtm_tf_1g)
[1]  5905 15322

# 2-gram
NgramTokenizer2 <- function(x) NGramTokenizer(x, Weka_control(min = 2, max = 2))
train_dtm_tf_2g <- DocumentTermMatrix(cleanset6, control=list(tokenize=NgramTokenizer2))
dim(train_dtm_tf_2g)
[1]  5905 15322

# 3-gram
NgramTokenizer3 <- function(x) NGramTokenizer(x, Weka_control(min = 3, max = 3))
train_dtm_tf_3g <- DocumentTermMatrix(cleanset6, control=list(tokenize=NgramTokenizer3))
dim(train_dtm_tf_3g)
[1]  5905 15322

Каждый раз получая один и тот же результат, что, очевидно, неправильно.

# combining together 1-gram, 2-gram and 3-gram from corpus 
    NgramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 3))
train_dtm_tf_ng <- DocumentTermMatrix(cleanset6, control=list(tokenize=NgramTokenizer))
dim(train_dtm_tf_ng)
[1]  5905 15322

# A numeric for the maximal allowed sparsity in the range from bigger zero to smaller one
train_rmspa_m_tf_ng_95<-removeSparseTerms(train_dtm_tf_ng, 0.95)
    [1] 5905  172

# creat bag of words (BOW) vector of these terms for use later
train_BOW_3g_95 <- findFreqTerms(train_rmspa_m_tf_3g_95)

# take a look at the terms that appear in the last 5% of the instances
train_BOW_3g_95

  [1] "avg"        "februari"   "januari"    "level"      "nation"     "per"        "price"     
  [8] "rate"       "report"     "reserv"     "reuter"     "also"       "board"      "export"    
  [15] "march"      "may"        "month"      "oil"        "product"    "total"      "annual"    
  [22] "approv"     "april"      "capit"      "common"     "compani"    "five"       "inc"       
  [29] "increas"    "meet"       "mln"        "record"     "said"       "share"      "sharehold" 
  [36] "stock"      "acquir"     "addit"      "buy"        "chang"      "complet"    "continu" 

     ...

Всего 1 грамм. Я попытался переписать свою команду следующим образом:

NgramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 3))

Но не получилось. Также попытался добавить еще одну строку:

options(mc.cores=1)

перед командой NgramTokenizer, но никаких изменений. Любая помощь?


person QuestSolver    schedule 14.04.2017    source источник
comment
Попробуйте это, чтобы применить функцию tolower: cleant1 ‹- tm_map(train_corpus, content_transformer(tolower))   -  person lbcommer    schedule 14.04.2017
comment
NGramTokenizer работает как положено. Сделайте свой пример минимальным и воспроизводимым, чтобы получить квалифицированную помощь.   -  person lukeA    schedule 14.04.2017
comment
lbcommer, не помогло. Все еще только 1-грамм.   -  person QuestSolver    schedule 14.04.2017
comment
lukeA, что вы имеете в виду, что он работает так, как ожидалось? Почему у меня нет 2-грамм и 3-грамм?   -  person QuestSolver    schedule 14.04.2017
comment
Я имею в виду то, что я сказал: 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))) дает 2 грамма.   -  person lukeA    schedule 14.04.2017
comment
lukeA, я выполнил твой код. Есть вывод r: Условия документов txt1 txt2 house 1 1 this 1 0 green 0 1 Извините, здесь нет 2-граммов   -  person QuestSolver    schedule 14.04.2017
comment
мой packageVersion("tm") — это ‘0.6.2’, а мой packageVersion("RWeka") — это ‘0.4.30’. Использование tm::Terms() на выходе из приведенного выше дает "house is" "is green" "is my" "my house" "thi\f\vs is", что составляет 2 грамма - как и ожидалось.   -  person lukeA    schedule 14.04.2017


Ответы (1)


Сегодня я столкнулся с той же проблемой. Кажется, "tm_map" по некоторым причинам плохо работает с SimpleCorpus.

Я изменил свой код с

corpus = Corpus(VectorSource(pd_cmnt$QRating_Explaination))

to

corpus = VCorpus(VectorSource(pd_cmnt$QRating_Explaination))

И теперь он работает и исправно отдает 2 грамма.

person Frank Lin    schedule 01.05.2017