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

时间:2014-11-13 01:32:55

标签: r data-mining text-mining tm

我正在清理文本挖掘的数据。这包括删除数字,标点符号和停用词(在数据挖掘中只是噪声的常用词),以及后来的词干。

使用tm中的R包,您可以删除停用词,例如使用tm_map(myCorpus, removeWords, stopwords('english'))tm手册本身演示了使用stopwords("english"))。这个单词列表包含收缩,例如" I' d"和"我"",以及非常常见的词"我":

> library(tm)
> which(stopwords('english') == "i")
[1] 1
> which(stopwords('english') == "i'd")
[1] 69

(在删除停用词之前,假定文本为小写。)

但是(大概)因为"我"在列表中排在第一位,收缩从未被删除:

> removeWords("i'd like a soda, please", stopwords('english'))
[1] "'d like  soda, please"

快速破解是颠倒词汇表:

> removeWords("i'd like a soda, please", rev.default(stopwords('english')))
[1] " like  soda, please"

另一种解决方案是找到/制作更好的词表。

是否有更好/更正确的方法来使用停用词('英语')?

1 个答案:

答案 0 :(得分:2)

这里的问题来自您使用的工具所带来的欠定工作流程。简单地说,删除停用词意味着过滤令牌,但是你删除停用词的文本尚未被标记化。

具体而言,i已从i'm中移除,因为令牌系统会在撇号上分割。在文本分析包 quanteda 中,您需要先对文本进行标记,然后才能根据令牌匹配删除要素。例如:

require(quanteda)
removeFeatures(tokenize("i'd like a soda, please"), c("i'd", "a"))
# tokenizedText object from 1 document.
# Component 1 :
# [1] "like"   "soda"   ","      "please"

quanteda 还有一个最常见的停用词的内置列表,所以这也有效(在这里,我们也删除了标点符号):

removeFeatures(tokenize("i'd like a soda, please", removePunct = TRUE),
               stopwords("english"))
# tokenizedText object from 1 document.
# Component 1 :
# [1] "like"   "soda"   "please"

在我看来(有抱负的,因为我设计了 quanteda ),这是一种更好的方法来删除英语和大多数其他语言的停用词。