さだとJuliaでLDA

## はじめに

[さだまさし x IT Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/sadatech) という素敵な企画があります。

いたく感激し、参加したいと思ったのですが、考えている間に枠が埋まってしまいました（[ohtaman](http://qiita.com/ohtaman@github)さんに[24日枠](http://qiita.com/ohtaman@github/items/faa49812195a73a01b9a)を取られてしまいました）。

ともかく、Juliaで簡単なLDAを実装し、さだまさしさんの歌詞に適用してみました。


## トピックモデル

「トピックモデル」とは、データの潜在的な”トピック”を見つけ出すための手法です。これだけ言われてもなんのことかさっぱり分からないとは思いますが、世の中にはとても素晴らしい解説資料が沢山あるので、興味がある方はぜひ記事末の文献一覧を参照ください。

トピックモデルといっても色々なものがありますが、最も有名で、よく使われているものが、今回の題材となるLDAです。


### LDA

Latent Dirichet allocation（LDA, 潜在的ディリクレ配分法）は、David Bleiさんらが2003年ごろに提唱した手法です [[Blei+ 2003]](https://www.cs.princeton.edu/~blei/papers/BleiNgJordan2003.pdf) 。同じような考えは、別の分野（たしか人口学かなにか）でもその数年前に提案されていたそうです。

たとえば、以下の様な応用例があります。

* [マンションポエムで新築マンションをクラスタリング - About connecting the dots.](http://smrmkt.hatenablog.jp/entry/2014/12/25/205630)
* [太宰治の文学の変化をTopic Modelで分析する · Naoki Orii's blog](http://mrorii.github.io/blog/2013/12/27/analyzing-dazai-osamu-literature-using-topic-models/)
* [小説家になろうのランキングをトピックモデルで解析(gensim) - 唯物是真 @Scaled_Wurm](http://sucrose.hatenablog.com/entry/2013/04/27/225218)
* [What do Vegans do in their Spare Time? Latent Interest Detection in Multi-Community Networks](http://www.cs.cornell.edu/~jhessel/projectPages/latentInterest.htm)


LDAはもともと人間が読み書きする文章を対象としたものですが、今では動画や音声解析、バイオインフォマティクスやネットワーク分析といった分野でも活用されているそうです。


### Digital Humanities 


その中でも、最近では人文科学の各種分野でもトピックモデル・LDAやその他NLP技術が積極的に活用され始めているそうです。

例えば、Franco Morettiという方は「Distant Reading」という概念を提唱しています。これは従来の「Close Reading」、つまり人間が文献を読み込む作業と逆の方向性のもので、大量のデータを計算機に食わせて（例えばトピックモデルにかけて）その結果を参考にしよう、というものです。Distant Readingが従来の方法に取って代わるわけではないですが、人間が読める分量には限りがあるのだから、計算機が役に立つなら存分に活用しよう、という考え方です。

この分野で有名なのは、[David Mimno](http://mimno.infosci.cornell.edu/)さんでしょう。自身は機械学習・自然言語処理の研究者として理論的な研究も進めつつ、たとえば英文学者と協力して、19世紀の英文学作品を考察する（[[Jockers&Mimno 2013]](http://digitalcommons.unl.edu/englishfacpubs/105/)）といったことを行っています。

先日、「Talking Machines」というPodcastにMimnoさんが出演されていましたが、経歴から上の研究の話や、今やっている「民話をリバースエンジニアリングする」研究の話など、興味深いエピソードでした。

* [Probabilistic Programming and Digital Humanities — Talking Machines](http://www.thetalkingmachines.com/blog/2015/11/5/probabilistic-programming-and-digital-humanities)


JuliaConでも発表していたセントルイス大学のグループは、TextMining.jlというパッケージをつくり、文学作品の時間変化などを調査しているそうです。

* [SLU-TMI/TextMining.jl](https://github.com/SLU-TMI/TextMining.jl)
* [St. Louis University - Text Mining Research Group: TextMining.jl - YouTube](https://www.youtube.com/watch?v=dgfIIZ5yA4E&list=PLP8iPy9hna6Sdx4soiGrSefrmOPdUWixM&index=46)


### 実装

[Gensim](https://radimrehurek.com/gensim/)、[Mallet](http://mallet.cs.umass.edu/)、[Stanford Topic Modeling Toolbox](http://nlp.stanford.edu/software/tmt/)などがあります。

ちなみに、Gensimの作者であるRadim Řehůřekさんのインタビュー記事が先日発売された「[ハイパフォーマンスPython](https://www.oreilly.co.jp/books/9784873117409/)」という本に載っていました。

Juliaでは[slycoder/TopicModels.jl](https://github.com/slycoder/TopicModels.jl)というものがありますが、2013年以降更新が止まってしまっているようです。先日の勉強会（[JuliaTokyo #5](http://juliatokyo.connpass.com/event/21715/)）でもyoshifumi_sekiさんが言っていたように、[johnmyleswhite/TextAnalysis.jl](https://github.com/johnmyleswhite/TextAnalysis.jl)のLDAも[未実装](https://github.com/johnmyleswhite/TextAnalysis.jl/blob/master/src/lda.jl)です。


## JuliaでLDAをつくって歌詞に適用

ここまで特にさだまさしさんと関係のない話を脈略なくつらつらと書きました。

それではここで、簡単なLDAをJuliaで作り、さだまさしの歌詞に適用してみましょう。

実装には、奈良先端大Graham Neubig先生の[NLPプログラミングチュートリアル](http://phontron.com/teaching.php)などを参考にさせていただきました。

[julia-advent-calendar-2015.ipynb](https://gist.github.com/sorami/60b1aa2e358f98454625)

### ステップ

大まかなステップは以下のとおりです（歌詞データの取得についてはここでは述べていません）。ここでの説明より、上のNeubigさんによる資料を見たほうがよっぽどわかりやすいかと思います。

* 歌詞データ読み込み
	* TinySegmenter.jlで文を分割
	* ストップワード（手動設定）を除外
		* ランダムな初期トピックを各単語に付与
* トピックごとに初期カウント
	* トピックの出現回数
	* トピックごとの語彙分布
* ギブズサンプリングによるパラメータ推定
	* 単語をひとつ消す
	* 消した状態で再カウント
	* トピックの選ばれる確率を計算
	* 前ステップの分布からトピックをひとつ選択
	* 新しく選んだトピックをもとに再カウント

### 結果の例

ハイパーパラメータの設定や、イテレーション数で結果はかなり変わるかと思います。

「僕」「私」「俺」をどう使い分けているのかが気になります。

```
Topic 1
0.0088	彼
0.0073	娘
0.0069	俺
0.0060	1
0.0053	子供
0.0047	恋
0.0047	して
0.0045	出来
0.0045	がんばれ
0.0044	5

Topic 2
0.0153	人
0.0125	こと
0.0099	ある
0.0098	私
0.0097	あなた
0.0091	生き
0.0068	心
0.0067	夢
0.0065	いる
0.0065	だろ

Topic 3
0.0252	君
0.0217	僕
0.0171	愛
0.0151	夢
0.0116	こと
0.0098	人
0.0092	恋
0.0080	空
0.0080	いる
0.0076	この

Topic 4
0.0452	君
0.0210	僕
0.0073	様
0.0068	二
0.0067	いる
0.0061	別れ
0.0057	風
0.0055	日
0.0053	時
0.0053	恋
```

```
Topic 1
0.0109	彼
0.0090	娘
0.0074	1
0.0066	恋
0.0054	子供
0.0054	5
0.0053	たち
0.0051	4
0.0049	帰っ
0.0049	出来

Topic 2
0.0199	こと
0.0146	生き
0.0116	それ
0.0103	この
0.0094	だろ
0.0092	人
0.0085	自分
0.0083	心
0.0074	忘れ
0.0074	何

Topic 3
0.0525	君
0.0320	僕
0.0092	いる
0.0090	時
0.0075	愛
0.0073	町
0.0069	忘れ
0.0065	風
0.0063	人
0.0059	手

Topic 4
0.0159	人
0.0136	私
0.0134	あなた
0.0117	こと
0.0100	ある
0.0091	日
0.0084	夢
0.0079	花
0.0064	愛
0.0062	時

Topic 5
0.0133	がんばらんば
0.0079	がんばれ
0.0065	明日
0.0065	Bye
0.0061	何
0.0056	来
0.0056	日
0.0051	せ
0.0049	今
0.0049	ある
```


### 今後の課題


* 収束判定
* ハイパーパラメータのチューニング
	* 参考：[[Tang+ 2014]](http://jmlr.org/proceedings/papers/v32/tang14.pdf)
* 発展的モデル：HDP [[Teh+ 2005]](http://www.cs.berkeley.edu/~jordan/papers/hdp.pdf)、Dynamic [[Blei+ 2006]](http://www.stat.uchicago.edu/~lafferty/pdf/dtm.pdf)、Supervised [[Blei&McAuliffe 2007]](https://www.cs.princeton.edu/~blei/papers/BleiMcAuliffe2007.pdf)、...
* 語彙のID化
* 前処理
	* 単語を基本形に戻す、機能語・ストップワードを除外
		* 参考：[MeCabで基本形の内容語のみで分かち書きを行うオプションを追加 — KiyuHub](http://kiyukuta.github.io/2013/09/05/mecab_wakati_content.html)
	* 提出言語の除外
	* 数字の置換
	* ...


## おわりに


明日のJuliaアドベントカレンダーは、@chezouさんがマイナー言語の広め方について紹介してくださるそうです。



## 文献


### 書籍

* “トピックモデル (機械学習プロフェッショナルシリーズ) ” 岩田具治, 2015
* “トピックモデルによる統計的潜在意味解析” 佐藤一誠, 2015

### 論文

* [[Blei&Lafferty 2009] Topic Models](http://www.cs.princeton.edu/~blei/papers/BleiLafferty2009.pdf)
* [[Blei 2011] Introduction to Probabilistic Topic Models](https://www.cs.princeton.edu/~blei/papers/Blei2011.pdf)
* [[Blei 2012] Review Articles: Probabilistic Topic Models](http://www.cs.princeton.edu/~blei/papers/Blei2012.pdf), Communications of The ACM
* [[Blei 2012] Probabilistic Topic Models](http://www.cs.princeton.edu/~blei/blei-mlss-2012.pdf), Machine Learning Summer School
* [Links to the Papers Related to Topic Models by Tomonori Masada](http://tmasada.wikispaces.com/Links+to+the+Papers+Related+to+Topic+Models)



### スライド、記事、動画

* [Topic Models by David Blei (video)](https://www.youtube.com/watch?v=DDq3OVp9dNA)
* [Tokyo Webmining 46th 『トピックモデルことはじめ』by @yamano357](https://speakerdeck.com/yamano357/tokyowebmining46th)
* [What is a good explanation of Latent Dirichlet Allocation? - Quora](http://www.quora.com/What-is-a-good-explanation-of-Latent-Dirichlet-Allocation)
* [The LDA Buffet is Now Open by Matthew L. Jockers](http://www.matthewjockers.net/2011/09/29/)
* [[佐藤 2012] 私のブックマーク Latent Topic Model (潜在的トピックモデル)](http://www.ai-gakkai.or.jp/my-bookmark_vol27-no3/)
* [[持橋&石黒 2013] 確率的トピックモデル](http://www.ism.ac.jp/~daichi/lectures/ISM-2012-TopicModels-daichi.pdf), 統計数理研究所 H24年度公開講座
* [[Tang+ 2014] "Understanding the Limiting Factors of Topic Modelling via Posterior Contraction Analysis" by sorami](https://speakerdeck.com/sorami/tang-plus-2014-understanding-the-limiting-factors-of-topic-modelling-via-posterior-contraction-analysis)
* [トピックモデル - AS^2 LT by sorami](https://speakerdeck.com/sorami/topitukumoderu-as-2-lt)