2016-11-21 6 views
6

Я использую text2vec в R и затрудняюсь написать функцию стебля, которая работает с функцией itoken в пакете text2vec. Документация text2vec предлагает эту функцию:Функция Stemming для text2vec

stem_tokenizer1 =function(x) { 
    word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en')) 
} 

Однако эта функция не работает. Это код, который я бегала (заимствованные из предыдущих ответов StackOverflow):

library(text2vec) 
library(data.table) 
library(SnowballC) 
data("movie_review") 
train_rows = 1:1000 
prepr = tolower 
stem_tokenizer1 =function(x) { 
    word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en')) 
} 
tok = stem_tokenizer1 
it <- itoken(movie_review$review[train_rows], prepr, tok, ids = movie_review$id[train_rows]) 

Это ошибка производит:

Ошибка {: аргумент «слова» отсутствует, не по умолчанию

Я считаю, что проблема в том, что wordStem нуждается в символьном векторе, но word_tokenizer создает список векторов символов.

mr<-movie_review$review[1] 
stem_mr1<-stem_tokenizer1(mr) 

Ошибка в SnowballC :: wordStem (язык = "EN"): аргумент "слова" отсутствует, не по умолчанию

Чтобы устранить эту проблему, я написал эту функцию, вытекающие:

stem_tokenizer2 = function(x) { 
    list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en')) 
} 

Однако эта функция не работает с функцией create_vocabulary.

data("movie_review") 
train_rows = 1:1000 
prepr = tolower 
stem_tokenizer2 = function(x) { 
    list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en')) 
} 
tok = stem_tokenizer2 
it <- itoken(movie_review$review[train_rows], prepr, tok, ids = movie_review$id[train_rows]) 
v <- create_vocabulary(it) %>% prune_vocabulary(term_count_min = 5) 

Нет ошибок, но когда вы смотрите на счет документов, количество документов, отличается от 1000 в данных, и поэтому вы не можете создать курсовую матрицу документа или запустить LDA.

v$document_count 

[1] 10

Этот код:

dtm_train <- create_dtm(it, vectorizer) 
dtm_train 

Producess эта ошибка:

10 х 3809 разреженная матрица класса "dgCMatrix" Ошибка в validObject (x): Недопустимый класс "dgCMatrix" объект: длина (Dimnam es [1]) отличается от Dim [1], который составляет 10

Мои вопросы: есть ли что-то неправильно с функцией, которую я написал, и почему функция, которую я написал, выдает эту ошибку с помощью create_vocabulary? Я подозреваю, что проблема с форматом вывода моей функции, но она выглядит идентично формату вывода функция word_tokenizer, и что прекрасно работает с itoken и create_vocabulary:

mr<-movie_review$review[1] 
word_mr<-word_tokenizer(mr) 
stem_mr<-stem_tokenizer2(mr) 
str(word_mr) 
str(stem_mr) 

ответ

5

Спасибо за использование text2vec и отчетности проблема. В документах есть ошибка (можете ли вы указать мне, где я помещаю этот пример, чтобы я мог исправить это?). Стебель токенизатор должен выглядеть следующим образом:

stem_tokenizer1 =function(x) { 
    word_tokenizer(x) %>% lapply(function(x) SnowballC::wordStem(x, language="en")) 
} 

Логика следующая:

  1. Он принимает вектор символов и разметить его. Вывод - это список векторов символов (каждый элемент списка = символ-символ - это документ).
  2. Затем мы применяем вытекающие на каждый элемент списка (wordStem может быть применен на вектор символов)

Так что мой синтаксис ошибка для lapply в примере вы следовали. Мб он будет более понятным, если переписать его без %>% оператора в простом R так будет выглядеть следующим образом:

stem_tokenizer1 =function(x) { 
    tokens = word_tokenizer(x) 
    lapply(tokens, SnowballC::wordStem, language="en") 
} 

Я также объяснить, почему вы получаете 10 докторов вместо 1000. По умолчанию text2vec::itoken расщепленных данных в 10 (это можно отрегулировать в функции itoken) и обработать его куском куском. Итак, когда вы применяете unlist на каждом фрагменте, вы фактически рекурсивно списываете 100 документов и создаете 1 символьный вектор.

+0

Благодарим вас за быстрый ответ. Я запустил код, и у него есть количество документов в 30, это та же проблема, о которой вы говорили при создании 1 символьного вектора? Код: 'data (" movie_review ") train_rows = 1: 1000 prepr = tolower stem_tokenizer1 = function (x) { word_tokenizer%>% lapply (function (x) SnowballC :: wordStem (x, language =" en ")) } Tok = stem_tokenizer1 это <- itoken (movie_review $ обзор [train_rows], Препр, Tok, идентификаторы = movie_review $ ID [train_rows]) v <- create_vocabulary (это)%>% prune_vocabulary (term_count_min = 5) v $ document_count' – rreedd

+0

Мой плохой. Пропущенный x в 'word_tokenizer (x)', см. Обновленный ответ. –

+0

Теперь он работает, спасибо! – rreedd