Я использую 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)
Благодарим вас за быстрый ответ. Я запустил код, и у него есть количество документов в 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
Мой плохой. Пропущенный x в 'word_tokenizer (x)', см. Обновленный ответ. –
Теперь он работает, спасибо! – rreedd