我正在清理文本挖掘的数据.这涉及删除数字,标点符号和停用词(在数据挖掘中只是噪声的常用词),以及后来的词干.
使用R中的tm包,您可以删除停用词,例如使用tm_map(myCorpus,removeWords,stopwords(‘english’)). tm手册本身演示了使用停用词(“英语”)).这个单词列表包含诸如“我”和“我将”之类的收缩,以及非常常见的单词“I”:
> library(tm)
> which(stopwords('english') == "i")
[1] 1
> which(stopwords('english') == "i'd")
[1] 69
(在删除停用词之前,文本被假定为小写.)
但是(据推测)因为“i”在列表中排在第一位,所以收缩从未被删除:
> 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"
另一个解决方案是找到/制作更好的词表.
是否有更好/更正确的方法来使用停用词(‘english’)?
最佳答案 这里的问题来自您使用的工具所带来的欠定工作流程.简单地说,删除停用词意味着过滤令牌,但是你删除停用词的文本尚未被标记化.
具体来说,i是从我移除的,因为令牌器在撇号上分裂.在文本分析包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),这是一种更好的方法来删除英语和大多数其他语言的停用词.