用于text2vec的词干函数

rre*_*edd 7 r text2vec

我在R中使用text2vec并且难以编写一个与text2vec包中的itoken函数一起使用的词干函数.text2vec文档建议了这个词干功能:

stem_tokenizer1 =function(x) {
  word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
 }
Run Code Online (Sandbox Code Playgroud)

但是,此功能不起作用.这是我运行的代码(借用之前的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])
Run Code Online (Sandbox Code Playgroud)

这是它产生的错误:

错误{:argument"words"缺失,没有默认值

我认为问题是wordStem需要一个字符向量,但是word_tokenizer会产生一个字符向量列表.

mr<-movie_review$review[1]
stem_mr1<-stem_tokenizer1(mr)
Run Code Online (Sandbox Code Playgroud)

SnowballC中的错误:: wordStem(language ="en"):缺少参数"words",没有默认值

为了解决这个问题,我编写了这个词干函数:

stem_tokenizer2 = function(x)  {
  list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en') )
}
Run Code Online (Sandbox Code Playgroud)

但是,此函数不适用于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)
Run Code Online (Sandbox Code Playgroud)

没有错误,但是当您查看文档计数时,文档数量与数据中的1000不同,因此您无法创建文档术语矩阵或运行LDA.

v$document_count
Run Code Online (Sandbox Code Playgroud)

[1] 10

这段代码:

dtm_train <- create_dtm(it, vectorizer)
dtm_train
Run Code Online (Sandbox Code Playgroud)

产生此错误:

10 x 3809稀疏矩阵类"dgCMatrix"validObject(x)中的错误:无效的类"dgCMatrix"对象:length(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)
Run Code Online (Sandbox Code Playgroud)

Dmi*_*nov 7

感谢您使用text2vec和报告问题.文档中有一个错误(你能指出我放这个例子的地方,所以我可以解决它吗?).词干标记符应如下所示:

stem_tokenizer1 =function(x) {
  word_tokenizer(x) %>% lapply( function(x) SnowballC::wordStem(x, language="en"))
 }
Run Code Online (Sandbox Code Playgroud)

逻辑如下:

  1. 它采用字符向量并将其标记化.输出是字符向量列表(列表的每个元素=字符向量是文档).
  2. 然后我们对列表的每个元素应用词干(wordStem可以应用于字符向量)

因此,lapply在您遵循的示例中存在我的语法错误.Mb如果我们%>%在普通R中没有运算符的情况下重写它会更清楚,所以它看起来像:

stem_tokenizer1 =function(x) {
  tokens = word_tokenizer(x)
  lapply(tokens, SnowballC::wordStem, language="en")
}
Run Code Online (Sandbox Code Playgroud)

我还将解释为什么你要接收10个文件而不是1000个.默认情况下,text2vec::itoken将数据分成10个块(这可以在itoken功能中调整)并按块处理它.因此,当您unlist在每个块上应用时,实际上是递归地取消列出100个文档并创建1个字符向量.