GibbsLDA++でトピック分析
なぜか唐突にブログを同時更新使用みたいな話が決まってしまったので、無理矢理エントリを書いています。
自然言語処理のトピックモデルの一つの手法であるLDAを使ってみました。
LDAについては以下のスライドが詳しいので、参照ください。
一部引用すると
・白鵬が単独首位 琴欧洲敗れる
・人は上の文を見て相撲に関係する文であることを理解できる
- 文中に相撲という単語は出てこないにもかかわらず
・単語は独立に存在しているのではなく、潜在的なトピックを持つ単語は同じ文章に出現しやすい
といったモデルです。
ギブスサンプリング*1によるLDAをC++で実装したソフトが公開されています*2。Pythonによる実装*3もいくつかありましたが、今回は研究室の人が利用しているこちらを。
インストール手順
- 以下のページからソースコードをダウンロード。
- ダウンロードしたファイルを解凍して、そのままmakeコマンドをたたくと失敗します。
- GibbsLDA++-0.2のmakeのエラーについて - Screaming Loudを参考にファイルを修正。
- 念のためmake clean したあとにmake allでインストール完了。
使い方
satomacoto: LDAの実装を試してみるを参考にして貰うのがいいと思いますが。
LDAで解析するテキストデータを用意します。以下サンプルです。
n {文書1} {文書2} {文書3} {文書…} {文書n} 文書i=単語1 単語2 単語3…単語m
形式は、1行目に解析対象とする文書数。2行目以降に1行1文書としてスペース区切りで単語を並べます。
1行目で定義した文書数より全体の文書数が少ないとエラーがおきて解析できません。
その後、ターミナルからGibbsLDA++のSRCフォルダ内にあるLDAを実行します。
src/lda -est -alpha 0.5 -beta 0.1 -ntopics 5 -niters 1000 -savestep 500 -twords 20 -dfile pyscript/result.txt
いろいろとオプションを指定しています。
主なオプションは以下のようなものです。
- -est…ゼロからLDAモデルを推定。(-estcオプションや-infオプションですでに構築したモデルを利用することもできます)
- alpha・-beta…LDAの為のパラメータ。アルファのデフォルト値は50/K(Kはトピック数)。
- -ntopics…分割するトピック数の指定。デフォルトは100。
- -niters…ギブスサンプリングの試行回数。デフォルトは2000。
- -savestep…指定した回数ごとに結果を保存。デフォルトは200。
- -twords…各トピックの特徴語を出力する個数。
- -dfile…データファイルの指定。実行結果も同じ場所に保存されます。
実行するとsavestepで指定したステップごとに5つのファイルが出力されます。
- model-name.others…αやθなど各パラメータ
- model-name.phi…トピックごとの単語の出現確率。
- model-name.theta…文書ごとの各トピックである確率。
- model-name.tassign…文書ごとに単語ID:トピック。
- model-name.twords…各トピックごとの特徴語。
また、単語と単語IDの組であるwordmap.txtというファイルも出力されます。
CiNii Articlesでトピック分析
CiNii Articlesで"IR"を検索した結果をトピック分析した結果です。文献数10000でトピックを10個、トピックの中で特徴的な単語を5個抜き出した結果です。
Topic 0th: IR 0.007441 ), 0.007109 acid 0.007052 NMR 0.006914 )- 0.006365 Topic 1th: larvae 0.000222 superstructure 0.000188 pyrophyllite 0.000188 calculus 0.000188 Studied 0.000154 Topic 2th: HEMA 0.000325 Andosols 0.000257 anodes 0.000222 BTC 0.000222 allophanic 0.000188 Topic 3th: VC 0.000730 vitamin 0.000221 SR 0.000221 binders 0.000187 kaolin 0.000187 Topic 4th: こと 0.012453 IR 0.008112 検索 0.007279 測定 0.005234 研究 0.005169 Topic 5th: tlae 0.002876 ir 0.001369 tl 0.000600 Tlae 0.000477 [' 0.000477 Topic 6th: 無し 0.001094 タイトル 0.001094 virus 0.000421 silk 0.000320 mosaic 0.000320 Topic 7th: наклонения 0.001031 что 0.000904 на 0.000809 пересказывательного 0.000809 времени 0.000809 Topic 8th: 大豆 0.000836 煮汁 0.000393 bentonite 0.000324 ACE 0.000256 ニコチアナミン 0.000222 Topic 9th: 品種 0.012668 IR 0.009663 こと 0.006451 細胞 0.005535 抵抗 0.005449 Topic 10th: Ir 0.020523 領域 0.009596 相関 0.009087 _< 0.008022 Co 0.007744 Topic 11th: IR 0.011768 system 0.005076 using 0.004087 method 0.004012 paper 0.003056 Topic 12th: 治療 0.005279 照射 0.004992 Ir 0.004322 線量 0.002951 組織 0.001994 Topic 13th: _??_ 0.001301 ]_ 0.000807 il 0.000774 del 0.000609 passato 0.000609 Topic 14th: IR 0.030421 企業 0.010087 特集 0.008930 -- 0.008591 情報 0.007713 Topic 15th: IR 0.012067 temperature 0.005610 films 0.005380 Si 0.004885 FT 0.004631 Topic 16th: IR 0.015041 cells 0.005403 ), 0.004770 ). 0.004047 patients 0.003404 Topic 17th: SUB 0.075021 </ 0.069534 SUP 0.025550 >- 0.007334 >< 0.005725 Topic 18th: UWB 0.015344 方式 0.011665 IR 0.011287 通信 0.007707 こと 0.007389 Topic 19th: BPH 0.000755 pesticide 0.000553 Meeting 0.000453 pesticides 0.000419 Society 0.000419
IRでは情報検索なり、機関リポジトリなり、インベスター・リレーションズなり、さまざまな意味があるので、それが分類できないかなと思っていました。英語がグルーピングされてしまったので、そんなにわかりやすい結果になっていませんでしたが、Topic4や14などは検索や企業に関するトピックというのが提示されています。
*1:ギブスサンプリングについては、こちらのページなどを参照ください。PRML 11章 二変量正規分布からのギブスサンプリング
*3:Gensim:Topic modekking for humans ・PythonでLDAを実装してみる-satomacoto