某些词不会使用 tm("easier" 或 "easiest")进行词干提取
Some words won't be stemmed using tm ("easier" or "easiest")
我有一个很大的调查问卷数据集,其中一些特征需要被提取出来,目的是为每个回复分配一个主题。但是,我在使用包 tm
.
来提取一些词时遇到了问题
这是一个可重现(简化)的例子:
library(tm)
# Words that need to be stemmed
test_vec <- c("easier","easy","easiest","closest","close","closer","near","nearest")
# Preprocessing function to clean corpus
# Note that, this is my full pipeline, but only the last command will be used in this case example
clean_corpus<- function(corpus){
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus,stemDocument)
return(corpus)
}
# Create corpus with test_vec
test_corpus <- VCorpus(VectorSource(test_vec))
# Apply cleaning
test_corpus <- clean_corpus(test_corpus)
# Print out stemmed values
for(i in 1:length(test_corpus)){
print(test_corpus[[i]]$content)
}
[1] "easier"
[2] "easi"
[3] "easiest"
[4] "closest"
[5] "close"
[6] "closer"
[7] "near"
[8] "nearest"
问题 1
为什么 [1] "easier"
和 [3] "easiest"
不是 "easi"
(就像 "easy"
一样)。同样,为什么 "close"
或 "near"
没有词干。我错过了什么吗?
问题 2
这是一个附带问题,但是有没有一种方法可以将字典中的 "close"
和 "near"
之类的词关联起来,从而能够验证这些词是否是同义词。例如,如果它们是同义词,"near"
的所有实例将被更改为 "close"
。
有多个词干提取器(快速概览 here),但使用最多的是 porter。 Python 也有 Lancaster 词干提取,它会 return 根据您的 test_vec
:
easier easy
easy easy
easiest easiest
closest closest
close clos
closer clos
near near
nearest nearest
但仍然存在问题,因为 iest
没有缩短。
但您也可以使用词形还原,return 如下:
library(textstem)
lemmatize_words(test_vec)
"easy" "easy" "easy" "close" "close" "close" "near" "near"
对于主题分配,词形还原可能优于词干提取,因为它可以更好地分组。但是你需要知道两者之间的区别。
语言学中的词形还原(或词形还原)是将词的变形形式组合在一起的过程,以便可以将它们作为单个项目进行分析,由词的词元或字典形式识别。
Wikipedia: lemmatisation
词干提取是将变形(或有时派生)词还原为词干、词根或词根形式(通常是书面词形式)的过程。词干不必与词的形态词根相同;相关词映射到同一个词干通常就足够了,即使这个词干本身不是有效的词根。
Wikipedia: stemming
关于你的第二个问题,有一个名为 syn
的包(仅适用于英语),其中包含所有同义词,但它会创建所有同义词的列表,并为“关闭”或“ near”这是一个很长的列表。
或者包 qdap
,也有同义词功能。
我有一个很大的调查问卷数据集,其中一些特征需要被提取出来,目的是为每个回复分配一个主题。但是,我在使用包 tm
.
这是一个可重现(简化)的例子:
library(tm)
# Words that need to be stemmed
test_vec <- c("easier","easy","easiest","closest","close","closer","near","nearest")
# Preprocessing function to clean corpus
# Note that, this is my full pipeline, but only the last command will be used in this case example
clean_corpus<- function(corpus){
corpus <- tm_map(corpus, stripWhitespace)
corpus <- tm_map(corpus, removePunctuation)
corpus <- tm_map(corpus, removeNumbers)
corpus <- tm_map(corpus, content_transformer(tolower))
corpus <- tm_map(corpus, removeWords, stopwords("en"))
corpus <- tm_map(corpus,stemDocument)
return(corpus)
}
# Create corpus with test_vec
test_corpus <- VCorpus(VectorSource(test_vec))
# Apply cleaning
test_corpus <- clean_corpus(test_corpus)
# Print out stemmed values
for(i in 1:length(test_corpus)){
print(test_corpus[[i]]$content)
}
[1] "easier"
[2] "easi"
[3] "easiest"
[4] "closest"
[5] "close"
[6] "closer"
[7] "near"
[8] "nearest"
问题 1
为什么 [1] "easier"
和 [3] "easiest"
不是 "easi"
(就像 "easy"
一样)。同样,为什么 "close"
或 "near"
没有词干。我错过了什么吗?
问题 2
这是一个附带问题,但是有没有一种方法可以将字典中的 "close"
和 "near"
之类的词关联起来,从而能够验证这些词是否是同义词。例如,如果它们是同义词,"near"
的所有实例将被更改为 "close"
。
有多个词干提取器(快速概览 here),但使用最多的是 porter。 Python 也有 Lancaster 词干提取,它会 return 根据您的 test_vec
:
easier easy
easy easy
easiest easiest
closest closest
close clos
closer clos
near near
nearest nearest
但仍然存在问题,因为 iest
没有缩短。
但您也可以使用词形还原,return 如下:
library(textstem)
lemmatize_words(test_vec)
"easy" "easy" "easy" "close" "close" "close" "near" "near"
对于主题分配,词形还原可能优于词干提取,因为它可以更好地分组。但是你需要知道两者之间的区别。
语言学中的词形还原(或词形还原)是将词的变形形式组合在一起的过程,以便可以将它们作为单个项目进行分析,由词的词元或字典形式识别。 Wikipedia: lemmatisation
词干提取是将变形(或有时派生)词还原为词干、词根或词根形式(通常是书面词形式)的过程。词干不必与词的形态词根相同;相关词映射到同一个词干通常就足够了,即使这个词干本身不是有效的词根。 Wikipedia: stemming
关于你的第二个问题,有一个名为 syn
的包(仅适用于英语),其中包含所有同义词,但它会创建所有同义词的列表,并为“关闭”或“ near”这是一个很长的列表。
或者包 qdap
,也有同义词功能。