3

目的:一部のキーワードとして複合語 (バイグラム) を含む辞書を使用して、用語とドキュメントのマトリックスを 作成したいと考えています。

Web 検索: テキスト マイニングと のtmパッケージは初めてなRので、これを行う方法を理解するために Web にアクセスしました。以下は、私が見つけた関連リンクです。

背景: これらのうち、NGramTokenizerRWekaパッケージでR使用するソリューションを好みましたが、問題が発生しました。以下のサンプル コードでは、3 つのドキュメントを作成し、コーパスに配置します。Docs 1and に2はそれぞれ 2 つの単語が含まれ ていることに注意してください。Doc 3は 1 つの単語のみを含みます。私の辞書のキーワードは、2 つのバイグラムと 1 つのユニグラムです。

問題:上記のリンクのNGramTokenizer解決策では、 の unigram キーワードが正しくカウントされませんDoc 3

library(tm)
library(RWeka)

my.docs = c('jedi master', 'jedi grandmaster', 'jedi')
my.corpus = Corpus(VectorSource(my.docs))
my.dict = c('jedi master', 'jedi grandmaster', 'jedi')

BigramTokenizer <- function(x) NGramTokenizer(x, Weka_control(min = 1, max = 2))

inspect(DocumentTermMatrix(my.corpus, control=list(tokenize=BigramTokenizer,
                                                  dictionary=my.dict)))

# <<DocumentTermMatrix (documents: 3, terms: 3)>>
# ...
# Docs  jedi  jedi grandmaster  jedi master
#    1     1                 0            1
#    2     1                 1            0
#    3     0                 0            0

私は、他の2人のために、ギブDoc 3する1ための行を期待していました。私が誤解していることはありますか?jedi0

4

2 に答える 2

3

私は同じ問題に遭遇し、TM パッケージのトークン カウント関数がwordLengthsというオプションに依存していることがわかりました。これは、追跡するトークンの最小長と最大長の 2 つの数値のベクトルです。デフォルトでは、TM は 3 文字の最小単語長を使用します ( wordLengths = c(3, Inf))。このオプションは、次のようにDocumentTermMatrixへの呼び出しでコントロールリストに追加することでオーバーライドできます。

DocumentTermMatrix(my.corpus,
                   control=list(
                       tokenize=newBigramTokenizer,
                       wordLengths = c(1, Inf)))

ただし、あなたの「ジェダイ」の単語は 3 文字を超えています。ただし、ngram をカウントする方法を理解しようとしているときに、おそらく以前にオプションの値を調整したので、これを試してください。また、boundsオプションを見てください。これは、TM に、指定された値より頻度の低い、または頻度の高い単語を破棄するように指示します。

于 2015-07-26T12:19:19.537 に答える
1

1単語の文字列が入力として送信され、ユニグラムとバイグラムを返すように求められると、 がNGramTokenizer返されることに気付きました。character(0)NGramTokenizer

NGramTokenizer('jedi',  Weka_control(min = 1, max = 2))
# character(0)

jediなぜこれが出力なのかはわかりませんが、この動作がキーワードが にカウントされなかった理由だと思いますDoc 3。ただし、if-then-elseサンプル セットと実際のデータ セットの両方で、私の状況では簡単な解決策が機能するようです。

library(tm)
library(RWeka)    

my.docs = c('jedi master', 'jedi grandmaster', 'jedi')
my.corpus = Corpus(VectorSource(my.docs))
my.dict = c('jedi master', 'jedi grandmaster', 'jedi')

newBigramTokenizer = function(x) {
  tokenizer1 = NGramTokenizer(x, Weka_control(min = 1, max = 2))
  if (length(tokenizer1) != 0L) { return(tokenizer1)
  } else return(WordTokenizer(x))
} # WordTokenizer is an another tokenizer in the RWeka package.

inspect(DocumentTermMatrix(my.corpus, control=list(tokenize=newBigramTokenizer,
                                                 dictionary=my.dict)))

# <<DocumentTermMatrix (documents: 3, terms: 3)>>
# ...
# Docs jedi jedi grandmaster jedi master
#   1    1                0           1
#   2    1                1           0
#   3    1                0           0

上記のコードで私が考慮していない「落とし穴」を誰かが見つけた場合はお知らせください。また、上記の私の観察でNGramTokenizer返される理由についての洞察もいただければ幸いです。character(0)

于 2015-01-19T20:33:18.247 に答える