2012-01-26 18 views
4

パッケージtmを使用して、次のドキュメントからストップワードをフィルタリングしようとしています。私はこのコードを実行するとパッケージtm stop-wordパラメータ

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パッケージのバグですか?

EDIT:私はインゴFeinererに連絡し、彼はそれがバグ技術的ではないことに注意:

ユーザーが提供するオプションが最初に処理した後、残りのすべての オプションされています。したがって、ストップワードの削除はトークン化の前に行われます( は既にstackoverflow.comのVincent Zoonekyndによって書かれています)。 という結果が得られます。

したがって、解決策は、明示的に、たとえば、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

私の意見では、はるかに簡単です:複数のコードに展開するのではなく、1行のコードですべての操作を行います。これにより、(特に複数の変換を適用している場合)、一目で適用されている変換を簡単に読み取ることができます。 –

2

クイックフィックスは、その後、これを実行するには、次のようになります。

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

また、あなたは用語行列を作成する前に、コーパスからストップワードを削除してみてください。

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

これは通常私にとっては役に立ちます。

関連する問題