使用 tm-package 进行文本挖掘 - 词干提取

Posted

技术标签:

【中文标题】使用 tm-package 进行文本挖掘 - 词干提取【英文标题】:Text-mining with the tm-package - word stemming 【发布时间】:2013-04-10 18:26:18 【问题描述】:

我正在使用tm-package 在 R 中进行一些文本挖掘。一切都很顺利。但是,在词干提取后会出现一个问题 (http://en.wikipedia.org/wiki/Stemming)。显然,有些词具有相同的词干,但重要的是不要将它们“放在一起”(因为这些词的含义不同)。

例如,请参阅下面的 4 个文本。在这里,您不能互换使用“讲师”或“演讲”(“协会”和“关联”)。但是,这是在第 4 步中完成的。

是否有任何优雅的解决方案如何手动为某些案例/单词实现这一点(例如,“讲师”和“演讲”被保留为两个不同的东西)?

texts <- c("i am member of the XYZ association",
"apply for our open associate position", 
"xyz memorial lecture takes place on wednesday", 
"vote for the most popular lecturer")

# Step 1: Create corpus
corpus <- Corpus(DataframeSource(data.frame(texts)))

# Step 2: Keep a copy of corpus to use later as a dictionary for stem completion
corpus.copy <- corpus

# Step 3: Stem words in the corpus
corpus.temp <- tm_map(corpus, stemDocument, language = "english")  

inspect(corpus.temp)

# Step 4: Complete the stems to their original form
corpus.final <- tm_map(corpus.temp, stemCompletion, dictionary = corpus.copy)  

inspect(corpus.final)

【问题讨论】:

这是词干的重点。你这样做是为了获得词根。如果您想保留差异,请不要停止。 我知道。但是在某些情况下是否有一种优雅的方式可以将其改回来? 【参考方案1】:

我不是 100% 你所追求的,也不完全了解 tm_map 的工作原理。如果我理解,那么以下工作。据我了解,您想提供一个不应被阻止的单词列表。我使用 qdap 包主要是因为我很懒,它有一个我喜欢的函数mgsub

请注意,我对使用 mgsubtm_map 感到很沮丧,因为它一直抛出错误,所以我只使用了 lapply

texts <- c("i am member of the XYZ association",
    "apply for our open associate position", 
    "xyz memorial lecture takes place on wednesday", 
    "vote for the most popular lecturer")

library(tm)
# Step 1: Create corpus
corpus.copy <- corpus <- Corpus(DataframeSource(data.frame(texts)))

library(qdap)
# Step 2: list to retain and indentifier keys
retain <- c("lecturer", "lecture")
replace <- paste(seq_len(length(retain)), "SPECIAL_WORD", sep="_")

# Step 3: sub the words you want to retain with identifier keys
corpus[seq_len(length(corpus))] <- lapply(corpus, mgsub, pattern=retain, replacement=replace)

# Step 4: Stem it
corpus.temp <- tm_map(corpus, stemDocument, language = "english")  

# Step 5: reverse -> sub the identifier keys with the words you want to retain
corpus.temp[seq_len(length(corpus.temp))] <- lapply(corpus.temp, mgsub, pattern=replace, replacement=retain)

inspect(corpus)       #inspect the pieces for the folks playing along at home
inspect(corpus.copy)
inspect(corpus.temp)

# Step 6: complete the stem
corpus.final <- tm_map(corpus.temp, stemCompletion, dictionary = corpus.copy)  
inspect(corpus.final)

基本上它的工作原理是:

    为提供的“NO STEM”字词替换一个唯一标识符键(mgsub) 然后你干(使用stemDocument) 接下来将其反转并使用“NO STEM”字样(mgsub)子标识键 最后完成 Stem (stemCompletion)

输出如下:

## >     inspect(corpus.final)
## A corpus with 4 text documents
## 
## The metadata consists of 2 tag-value pairs and a data frame
## Available tags are:
##   create_date creator 
## Available variables in the data frame are:
##   MetaID 
## 
## $`1`
## i am member of the XYZ associate
## 
## $`2`
##  for our open associate position
## 
## $`3`
## xyz memorial lecture takes place on wednesday
## 
## $`4`
## vote for the most popular lecturer

【讨论】:

感谢您的帮助。效果很好。【参考方案2】:

您还可以使用以下包来提取词:https://cran.r-project.org/web/packages/SnowballC/SnowballC.pdf。

您只需要使用函数wordStem,传递要词干的词向量以及您正在处理的语言。要知道您需要使用的确切语言字符串,您可以参考 getStemLanguages 方法,该方法将返回所有可能的选项。

亲切的问候

【讨论】:

以上是关于使用 tm-package 进行文本挖掘 - 词干提取的主要内容,如果未能解决你的问题,请参考以下文章

R tm 文本挖掘中的自冲突停用词

使用 Spacy、Bert 时是不是需要对文本分类进行停用词去除、词干/词形还原?

文本挖掘:窥探南方公园中的对话

Python NLTK 中用于情感分析的德语词干

词干会损害文本分类的精度吗?

如何使用 tm 包从非英语语料库中删除常用词尾?