MALLETでトピックモデリング(LDA)

ここ最近、LDA関連のツールを動かしていたのでメモ。

使ったのはgensimとMALLET。

 

まずはgensimから。

ストップワードや記号の除去などを全部自分でやらなければならない。

最初は、ストップワード処理をしていなかったため、語彙数が膨大になり、メモリエラーをはくという事態。

 

ストップワード、記号除去の処理などをしたら動いた。

しかしながら、トピック-単語の分布を見ても結果は納得できない。

数字が除去できていなかったためなのかもしれないが。

 

で、LDAを使う際に欲しいのは、文書-トピック行列もしくは、トピック-単語行列であると思う。

その2つの行列の取得方法は公式のチュートリアルを見てもらえると簡単にわかると思う。

radimrehurek.com

 

 

次にMALLET。

これの便利なところは、文書に対してストップワード処理を簡単にしてくれるところ。

そして何より早い。すごく早い。

 

しかしながら、公式のドキュメントを見てもトピック-単語行列の取得方法がいまいちわからないところが難点。

Topic Modeling

 

色々調べたら、

--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を使う際の懸念がなくなった。