MALLETでトピックモデリング(LDA)
ここ最近、LDA関連のツールを動かしていたのでメモ。
使ったのはgensimとMALLET。
まずはgensimから。
ストップワードや記号の除去などを全部自分でやらなければならない。
最初は、ストップワード処理をしていなかったため、語彙数が膨大になり、メモリエラーをはくという事態。
ストップワード、記号除去の処理などをしたら動いた。
しかしながら、トピック-単語の分布を見ても結果は納得できない。
数字が除去できていなかったためなのかもしれないが。
で、LDAを使う際に欲しいのは、文書-トピック行列もしくは、トピック-単語行列であると思う。
その2つの行列の取得方法は公式のチュートリアルを見てもらえると簡単にわかると思う。
次にMALLET。
これの便利なところは、文書に対してストップワード処理を簡単にしてくれるところ。
そして何より早い。すごく早い。
しかしながら、公式のドキュメントを見てもトピック-単語行列の取得方法がいまいちわからないところが難点。
色々調べたら、
--word-topic-counts-file
というコマンドで単語-トピックのカウントファイルが出力されるとのこと。
つまり、このファイルを編集すれば、トピック単語行列も取得可能な模様。
コマンドラインの操作も簡単で以下の2つのコマンドを打つだけでok
●文書をmallet形式のファイルに変換
bin/mallet import-dir --input /data/topic-input --output topic-input.mallet --keep-sequence --remove-stopwords
●mallet形式のファイルに対してLDAを適用
bin/mallet train-topics --input topic-input.mallet --num-topics 200 --output-state topic-state.gz --optimize-interval 10 --output-model topic.model --output-doc-topics doc-topics --output-topic-keys topic-keys --word-topic-counts-file word-topics.txt
doc-topicsファイルに文書トピック行列が
word-topicsファイルに各単語が各トピックに何回出現したかのデータが出力される。
結果も良好で例えば、あるトピックには
car autos rec cars engine ford speed drive miles driving article auto tires tech power honda mph mustang toyota
のような車関係の語が集まったりしている。
とりあえずLDAを使ってみたい人にはMALLETを勧める。
【追記】
公式には書かれていないが、--topic-word-weights-fileを指定すれば、トピック単語行列の出力も可能な模様。
これでMALLETでLDAを使う際の懸念がなくなった。