More than 1 year has 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

論文

スライド、記事、動画