首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >text2vec的词干函数

text2vec的词干函数
EN

Stack Overflow用户
提问于 2016-11-21 11:13:30
回答 1查看 1.7K关注 0票数 8

我在R中使用text2vec,很难编写一个与text2vec包中的itoken函数一起工作的词干函数。text2vec文档显示了这个词干函数:

代码语言:javascript
运行
复制
stem_tokenizer1 =function(x) {
  word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
 }

但是,这一功能不起作用。这是我运行的代码(借用自以前的堆栈溢出答案):

代码语言:javascript
运行
复制
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会生成一个字符向量列表。

代码语言:javascript
运行
复制
mr<-movie_review$review[1]
stem_mr1<-stem_tokenizer1(mr)

雪球C中的错误::wordStem(language= "en"):参数“”缺失,没有默认的

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

代码语言:javascript
运行
复制
stem_tokenizer2 = function(x)  {
  list(unlist(word_tokenizer(x)) %>% SnowballC::wordStem(language='en') )
}

但是,此函数不适用于create_vocabulary函数。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
v$document_count

1 10

此代码:

代码语言:javascript
运行
复制
dtm_train <- create_dtm(it, vectorizer)
dtm_train

产生此错误:

10x3809类"dgCMatrix“错误稀疏矩阵( validObject(x):无效类”dgCMatrix“对象: length(Dimnames1)与Dim1 ( 10 )不同

我的问题是:我编写的函数有什么问题吗?为什么我编写的函数会在create_vocabulary中产生这个错误?我怀疑我的函数的输出格式存在问题,但它看起来与word_tokenizer函数的输出格式相同,而且它与itoken和create_vocabulary的输出格式很好:

代码语言:javascript
运行
复制
mr<-movie_review$review[1]
word_mr<-word_tokenizer(mr)
stem_mr<-stem_tokenizer2(mr)
str(word_mr)
str(stem_mr)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-21 12:21:40

感谢您使用text2vec并报告了问题。文档中有一个错误(您能指出我把这个示例放在哪里,这样我就可以修复它了吗?)茎标记器应该如下所示:

代码语言:javascript
运行
复制
stem_tokenizer1 =function(x) {
  word_tokenizer(x) %>% lapply( function(x) SnowballC::wordStem(x, language="en"))
 }

逻辑如下:

  1. 它接受字符向量并标记它。输出是字符向量列表( list =字符向量的每个元素都是文档)。
  2. 然后对列表中的每个元素应用词干(wordStem可以应用于字符向量)

因此,我在lapply语法上犯了错误,例如您遵循的语法错误。如果我们在普通R中不使用%>%运算符重写它,则Mb将更加清楚,因此它将如下所示:

代码语言:javascript
运行
复制
stem_tokenizer1 =function(x) {
  tokens = word_tokenizer(x)
  lapply(tokens, SnowballC::wordStem, language="en")
}

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40718778

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档