decadence

個人のメモ帳

Mallet TopicModeling

Mallet is MAchine Learning for LanguagE Toolkit

MALLETはstatistical NLP, Document Classification, クラスタリング,トピックモデリング,情報抽出,及びその他のテキスト向け機会学習アプリケーションを行うためのJavaツール
特にLDAなどを含めたトピックモデルに関して得意としているようだ

これらの処理を行う際に,すぐにpythonだ,GenSimだ,と言ってしまわないよう
Javaでも出来る事を空いた時間に遊びも兼ねて触ってみようと思う.

公式のQuickStartも良いが,今回は以下のものを軽く翻訳しながらsample-dataをいじる
Getting Started with Topic Modeling and MALLET


データのインポート.enディレクトリ以下に,各文書ファイルが個々にtxtとして保存されている

bin/mallet import-dir --input sample-data/web/en --output tutorial.mallet --keep-sequence --remove-stopwords

トピック数20でトピックモデル構築後,結果を各ファイルへ出力(デフォルトはトピック数10)

bin/mallet train-topics --input tutorial.mallet --num-topics 20 --output-state topic-state.gz --output-topic-keys tutorial_keys.txt --output-doc-topics tutorial_compostion.txt --inferencer-filename tutorial.inferencer 

topic-state.gzへ,各コーパスにおける全ての語が出力されている
tutorial_keys.txtは,各トピックにおけるキーとなる語が順に列挙されている
tutorial_composition.txtへは,元の各入力ファイルにおける各トピックの分布が0~1で与えられている.
tutorial.inferencerは,推論用に生成したファイル

以下のようにoptionを指定する事で,ハイパーパラメータを最適化

--optimize-interval 20

実際に付けた所,下記のように結果が変わるだろう

0 0.02995 xi ness regular asia online cinema established alvida acclaim veenr commercial

初めの数字はトピックの番号を,2番目の値はトピックに対する重みが付与される
回す回数を増やす事で,より最適な重みが得られたのである.

入力ファイルは一つのフォルダの中に.txtという拡張子で保存させよう
もしパラグラフ毎にトピックを割り当てたいなら,全てのパラグラフを別ファイルとして保存させなくてはならない
各パラグラフをcsvとして保存した後にエクセルなどで個別ファイルに分割保存する事も出来る
注意として,フォルダ名やファイル名にスペースは用いないように

MalletのGUI版もあるらしい
Topic Modeling With the JAVA GUI + Gephi | Electric Archaeology


日本語を利用する際には出来なくもないが,以下のように文節が微妙な事になるかもしれない.
> MALLET currently does not support Chinese or Japanese word segmentation.
一先ず,使う際には以下のオプションを追加

--token-regex '[\p{L}\p{M}]+'

stoplistsの中にja.txtもあるので必要な際には使うと良い

上記チュートリアルではなかったTopicModelingに関する他オプション

  • サンプリングの回数を変化させる.増やすと時間かかるけど良いサンプリングを必要とする際には値を指定.
--num-iterations [NUMBER]
  • ハイパーパラメータを最適化させる前の回す回数.デフォルトはoptimize interavalの2倍
--optimize-burn-in [NUMBER]
  • 中間データの出力.途中で終了したデータを再開する際に用いる事が出来る.
--output-model [FILENAME]
  • 学習されたデータを元にしたトピック推論用ファイルを作成
--inferencer-filename [FILENAME]

推論を行う際には以下により使い方を確認する事

bin/mallet infer-topics --help

推論時には,新しいデータが教師データに対し適したものであるかを確認した上で,--use-pipe-from [MALLET TRAINING FILE]のオプションをimport-file/import-dicの際に利用する事

  • Topic Held-out Probability...勉強不足で保留
evaluator-filename [FILENAME]

次回はjavaを使ってデータimportする所から
Data Import Developer's Guide