我在 R 中使用 text2vec 并且难以编写与 text2vec 包中的 itoken 函数一起使用的词干函数。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])
这是它产生的错误:
{ 中的错误:缺少参数“words”,没有默认值
我认为问题在于 wordStem 需要一个字符向量,但 word_tokenizer 会生成一个字符向量列表。
mr<-movie_review$review[1]
stem_mr1<-stem_tokenizer1(mr)
SnowballC::wordStem(language = "en") 中的错误:缺少参数“words”,没有默认值
为了解决这个问题,我写了这个词干函数:
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
产生此错误:
10 x 3809 类“dgCMatrix”的稀疏矩阵 validObject(x) 中的错误:无效类“dgCMatrix”对象:长度(Dimnames[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)