我正在清理文本挖掘的数据。这包括删除数字,标点符号和停用词(在数据挖掘中只是噪声的常用词),以及后来的词干。
使用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"
另一种解决方案是找到/制作更好的词表。
是否有更好/更正确的方法来使用停用词('英语')?
答案 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 ),这是一种更好的方法来删除英语和大多数其他语言的停用词。