このレポジトリに輪講で紹介したトピックモデルについてのサンプルプログラムを設置( ☝՞ਊ ՞)☝. 参考図書はレジュメの最後にも記載しているが,2016年の輪講本である実践 機械学習システム(研究室の本棚にある).
今回使用するデータセットとして,Associated Press (AP) データセット
(トピックモデル研究の初期から使われている,ニュースレポートのデータセット)
を使用する.データのダウンロードは./data
ディレクトリ内で以下のシェルスクリプトを実行.
$ cd data
$ ./download_ap.sh
解凍されたディレクトリ内にap.dat
, ap.txt
, vocab.txt
の三つのファイルが生成される.
スクリプト群は全てPythonの3系で動作する. 必要なパッケージは以下の通り.
-
word_cloud/lda_model.py
- LDAモデルの構築,モデルが生成するトピックのワードクラウド結果を可視化.
-
word_cloud/hdp_model.py
- HDPモデルの構築,モデルが生成するトピックのワードクラウド結果を可視化.
-
figure/figure.py
- 雑多(上記二つと被っている部分有)
- 生成したモデルの類似文書を計算
- 類似トピックのワードクラウド化
- トピック分布の出力
- perplexityの計算
ダウンロードしたデータからLDA,HDPモデルの作成を行う. データセットからgensimライブラリを用いてコーパスを作成するコードは以下の通り.
from gensim import corpora
corpus = corpora.BleiCorpus('./data/ap/ap.dat', './data/ap/vocab.txt')
コーパスからgensimを用いてLDAモデルを作成するコードは以下の通り(生成トピック数: 100個).
model = models.ldamodel.LdaModel(corpus, num_topics=100, id2word=corpus.id2word)
生成されたモデルからある文書のトピックの構成を観測する.
topics = [model[c] for c in corpus]
print(topics[0])
[(3, 0.023607255776894751),
(13, 0.11679936618551275),
(19, 0.075935855202707139),
(92, 0.10781541687001292)]
上記のコードでは文書のインデックスが0番目の文書のトピックの構成を確率値で出力している.
model[doc]
はdocが持つトピックを(topic_index, topic_weight)
のリスト形式で返す.
HDPのモデル生成もLDAとほぼ同様に実装が可能である.
所々関数の使用が異なるので注意(詳しくはドキュメントを参照).
単語群からワードクラウドをwordcloudパッケージを用いて生成する. 画像の生成は以下のコードで実現可能.
import matplotlib.pyplot as plt
from wordcoud import WordCloud
wordcloud = WordCloud(background_color="black", font_path=fpath,
width=900, height=500).generate_from_frequencies(text)
plt.imshow(wordcloud)
plt.show()
WordCloud
クラスを呼び出す時にfontのpathの指定が必要である.
また画像の表示にmatplotlib
が必要である.
実際のサンプル結果を示す.
One of the topic in LDA model:
上図は実際に生成されたLDAモデルのトピックの一つをwordcloudに出力した例である. データセットが昔のニュース記事であるので,1988年アメリカ合衆国大統領選挙の候補者であった マイケル・デュカキスとジョージ・H・W・ブッシュの名前が同一topic内に含まれていることがわかる.
Alpha Parameter of LDA model:
AlphaはLDAモデル内のディリクレ分布のパラメータであり,数値を大きくすることでトピック数を増やすことができる.
上図グラフでは,Alphaの数値を大きくすることでトピック数の偏りが平滑化されている.
Alphaのgensimデフォルト値は1.0 / len(corpus)
.
Number of topics between LDA model and HDP model:
同一コーパスでモデルを生成した時のLDAとHDPのトピック分布の違いを示す. LDAは手動で100トピックと設定,HDPはトピック数は自動決定であり150トピックとなった.
- 実践 機械学習システム Willi Richert (著), Luis Pedro Coelho (著), 斎藤 康毅 (翻訳)
- 自然言語処理概論 黒橋 禎夫 (著), 柴田 知秀 (著)