23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 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

論文

スライド、記事、動画

23
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?