読者です 読者をやめる 読者になる 読者になる

GibbsLDA++でトピック分析

programming 研究メモ

なぜか唐突にブログを同時更新使用みたいな話が決まってしまったので、無理矢理エントリを書いています。

自然言語処理のトピックモデルの一つの手法であるLDAを使ってみました。
LDAについては以下のスライドが詳しいので、参照ください。

LDA入門

一部引用すると

白鵬が単独首位 琴欧洲敗れる
・人は上の文を見て相撲に関係する文であることを理解できる

  • 文中に相撲という単語は出てこないにもかかわらず

・単語は独立に存在しているのではなく、潜在的なトピックを持つ単語は同じ文章に出現しやすい

といったモデルです。

ギブスサンプリング*1によるLDAをC++で実装したソフトが公開されています*2Pythonによる実装*3もいくつかありましたが、今回は研究室の人が利用しているこちらを。

GibbsLDA++: A C/C++ Implementation of Latent Dirichlet Allocation (LDA) using Gibbs Sampling for Parameter Estimation and Inference

インストール手順

  1. 以下のページからソースコードをダウンロード。
  2. ダウンロードしたファイルを解凍して、そのままmakeコマンドをたたくと失敗します。
  3. 念のため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章 二変量正規分布からのギブスサンプリング

*2:Linux系のOSに対応

*3:Gensim:Topic modekking for humansPythonでLDAを実装してみる-satomacoto