More than 3 years have passed since last update.


はじめに

さだまさし x IT Advent Calendar 2015 - Qiita という素敵な企画があります。

いたく感激し、参加したいと思ったのですが、考えている間に枠が埋まってしまいました(ohtamanさんに24日枠を取られてしまいました)。

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


トピックモデル

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

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


LDA

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

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

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


Digital Humanities

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

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

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

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

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


実装

GensimMalletStanford Topic Modeling Toolboxなどがあります。

ちなみに、Gensimの作者であるRadim Řehůřekさんのインタビュー記事が先日発売された「ハイパフォーマンスPython」という本に載っていました。

Juliaではslycoder/TopicModels.jlというものがありますが、2013年以降更新が止まってしまっているようです。先日の勉強会(JuliaTokyo #5)でもyoshifumi_sekiさんが言っていたように、johnmyleswhite/TextAnalysis.jlのLDAも未実装です。


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

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

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

実装には、奈良先端大Graham Neubig先生のNLPプログラミングチュートリアルなどを参考にさせていただきました。

julia-advent-calendar-2015.ipynb


ステップ

大まかなステップは以下のとおりです(歌詞データの取得についてはここでは述べていません)。ここでの説明より、上の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 ある


今後の課題


おわりに

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


文献


書籍


  • “トピックモデル (機械学習プロフェッショナルシリーズ) ” 岩田具治, 2015

  • “トピックモデルによる統計的潜在意味解析” 佐藤一誠, 2015


論文


スライド、記事、動画