2012-01-26 95 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) 

這通常適用於我。