2012-01-26 49 views
4

我试图使用包tm过滤来自以下文档的停用词。包tm停止词参数

library(tm) 
documents <- c("the quick brown fox jumps over the lazy dog", "i am the walrus") 
corpus <- Corpus(VectorSource(documents)) 
matrix <- DocumentTermMatrix(corpus,control=list(stopwords=TRUE)) 

然而,当我运行此代码,我仍然可以在DocumentTermMatrix以下。

colnames(matrix) 
[1] "brown" "dog" "fox" "jumps" "lazy" "over" "quick" "the" "walrus" 

“的”被列为停止词列表中的那个包tm用途。我在stopwords参数上做错了什么,或者这是tm软件包中的错误?

编辑:我接触英戈Feinerer,他指出,这在技术上是不是一个错误:

用户提供的选项被首先处理,然后将所有剩余的 选项。因此,在标记化之前完成停用词的删除(因为Vincent Zoonekynd在stackoverflow.com上已经编写了 ),因此 就是您的结果。

因此,解决的办法是明确列出前stopwords参数的默认符号化的选项,例如:

library(tm) 
documents <- c("the quick brown fox jumps over the lazy dog", "i am the walrus") 
corpus <- Corpus(VectorSource(documents)) 
matrix <- DocumentTermMatrix(corpus,control=list(tokenize=scan_tokenizer,stopwords=TRUE)) 
colnames(matrix) 
+0

感谢您的问题和答案......虽然他们都没有在我的问题上工作。似乎TM中的停用词在这个时候只是一个头痛的问题。 –

回答

3

这是一个错误:你可能想将其报告给包的作者( S)。 termFreq函数将各种过滤器应用于文本,但并不总是以正确的顺序。在您的示例中,代码尝试在标记化之前删除停用词,即在文本被切成单词之前 - 它应该在之后,一旦我们知道这些单词是什么。

+0

如何让'control'列表应用于单词一旦被标记化? –

+0

直到错误得到解决,最简单的工作是Sacha的答案。将标记器添加到控制列表(在停用词之前:顺序很重要)也可能有效,但看起来不必要的复杂。 –

+0

在我看来,它更简单:您将所有操作放在一行代码中,而不是将它们分散在多个代码中。这使得阅读快速浏览中正在应用的转换变得更加简单(特别是在应用多个转换时)。 –

2

速战速决将是以后运行此:

matrix <- matrix[,!colnames(matrix)%in%stopwords()] 
4

您也可以尝试从语料库去除禁用词创建项矩阵之前。

text_corpus <- tm_map(text_corpus, removeWords, stopwords("english")) 
dtm <- DocumentTermMatrix(text_corpus) 

这通常适用于我。