text2vec 的词干提取函数
Stemming function for text2vec
我在 R 中使用 text2vec,但在编写与 text2vec 包中的 itoken 函数一起使用的词干提取函数时遇到困难。 text2vec 文档建议使用此词干提取功能:
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
}
但是,这个功能不起作用。这是我 运行 的代码(借用之前的 Whosebug 答案):
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(语言="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 稀疏矩阵 class "dgCMatrix"
validObject(x) 错误:
无效 class “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)
感谢您使用 text2vec
并报告问题。
文档中有一个错误(你能指出我把这个例子放在哪里,所以我可以修复它吗?)。
词干分词器应如下所示:
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply( function(x) SnowballC::wordStem(x, language="en"))
}
逻辑如下:
- 它采用字符向量并将其标记化。输出是列表
字符向量(列表的每个元素 = 字符向量是一个文档)。
- 然后我们对列表的每个元素应用词干提取(
wordStem
可以应用于字符向量)
因此,在您遵循的示例中,lapply
是我的语法错误。 Mb 如果我们在普通 R 中不使用 %>%
运算符重写它会更清楚,所以它看起来像:
stem_tokenizer1 =function(x) {
tokens = word_tokenizer(x)
lapply(tokens, SnowballC::wordStem, language="en")
}
我还将解释为什么您收到 10 个文档而不是 1000 个文档。默认情况下 text2vec::itoken
将数据分成 10 个块(这可以在 itoken
函数中调整)并逐块处理.
因此,当您在每个块上应用 unlist
时,您实际上是在递归地取消列出 100 个文档并创建 1 个字符向量。
我在 R 中使用 text2vec,但在编写与 text2vec 包中的 itoken 函数一起使用的词干提取函数时遇到困难。 text2vec 文档建议使用此词干提取功能:
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply(SnowballC::wordStem(language='en'))
}
但是,这个功能不起作用。这是我 运行 的代码(借用之前的 Whosebug 答案):
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(语言="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 稀疏矩阵 class "dgCMatrix" validObject(x) 错误: 无效 class “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)
感谢您使用 text2vec
并报告问题。
文档中有一个错误(你能指出我把这个例子放在哪里,所以我可以修复它吗?)。
词干分词器应如下所示:
stem_tokenizer1 =function(x) {
word_tokenizer(x) %>% lapply( function(x) SnowballC::wordStem(x, language="en"))
}
逻辑如下:
- 它采用字符向量并将其标记化。输出是列表 字符向量(列表的每个元素 = 字符向量是一个文档)。
- 然后我们对列表的每个元素应用词干提取(
wordStem
可以应用于字符向量)
因此,在您遵循的示例中,lapply
是我的语法错误。 Mb 如果我们在普通 R 中不使用 %>%
运算符重写它会更清楚,所以它看起来像:
stem_tokenizer1 =function(x) {
tokens = word_tokenizer(x)
lapply(tokens, SnowballC::wordStem, language="en")
}
我还将解释为什么您收到 10 个文档而不是 1000 个文档。默认情况下 text2vec::itoken
将数据分成 10 个块(这可以在 itoken
函数中调整)并逐块处理.
因此,当您在每个块上应用 unlist
时,您实际上是在递归地取消列出 100 个文档并创建 1 个字符向量。