某些词不会使用 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,也有同义词功能。