Rでテキストファイルをセンチメントの時系列データに変換する
目的
テキストファイルから読み取れるセンチメント(感情)を測定したい。そのために、テキストに現れる各単語のセンチメントを出現順に計測し、時系列データとみてグラフを描く。また、その平均・標準偏差・歪度・尖度などを算出する。
手法
感情辞書
単語と感情を対応付ける辞書として、「単語感情極性対応表」(高村大也, 乾孝司, 奥村学, "スピンモデルによる単語の感情極性抽出", 情報処理学会論文誌ジャーナル, Vol.47 No.02 pp. 627--637, 2006. )を用いる。本辞書では、各単語に対する印象を、positive: +1 ~ negative: -1の「感情極性値」で対応付けている。具体的には、辞書はテキストファイルで、55125個の単語に対して、「見出し語:読み:品詞:感情極性値」が記述されている。 なお、本辞書は研究目的に限り公開されている。
・pn_ja.txtの内容
センチメントの計測
感情辞書を用いて、テキストファイルの形態素のセンチメントを割り出し、時系列データとみて、グラフ化・特徴量算出を行う。
・Rのスクリプト(forループ多用してますが、あまりマネしないように。。)
結果
Mr.ChildrenのMarshmallow dayを例に、出力結果を掲載する。縦軸にセンチメント(印象のpositive / negative)を、横軸にテキスト内での単語の順序をとると、以下のようなグラフが出力される。
また、特徴量として、以下のテーブルが出力される。
Rで複数のテキストファイルを二次元にマッピングして可視化する
目的
複数のテキストファイルの関係性をコンパクトに表現し、可視化したい。
手法
自己組織化マップ(SOM)
自己組織化マップは、視覚野のニューラルネットのモデルを元にした学習アルゴリズムであり、高次元データを低次元に非線形射影して表示できる。
http://ja.wikipedia.org/wiki/%E8%87%AA%E5%B7%B1%E7%B5%84%E7%B9%94%E5%8C%96%E5%86%99%E5%83%8F
・Rスクリプト
a <- read.table("C:/LyricsWorkspace/DocMatrix/tf3idf4/Mr.Children_single.txt")
library(kohonen)
set.seed(10) #シードを指定
gr <- somgrid(topo="hexagonal", xdim=3, ydim=3) #蜂の巣上に3x3の出力層を形成, topo=c("hexagonal","rectangular")
a.som <- som(t(a), gr, rlen=100) #入力層a, 出力層grに対して100回学習
# plot.kohonen(a.som, type="codes") #コードマップ
plot.kohonen(a.som, type="mapping",labels=colnames(a)) #個体のマップ
主成分分析(PCA)
主成分分析とは、次元を主要な成分に縮約して表現する手法であるが、可視化の1つであると見ることもできる。
・Rスクリプト
a <- read.table("C:/LyricsWorkspace/DocMatrix/tf3idf4/Mr.Children_single.txt")
# ライブラリのインポート
library(stats)
# 主成分分析を実行
a.pc <- prcomp(t(a))summary(a.pc) #princomp()は(行数)<(列数)で実行不可だが、prcomp()では可能
a.pc$sumarry #サマリ表示
a.pc$rotation #固有ベクトル表示
# 結果のプロット
plot(a.pc$x[,1],a.pc$x[,2],type="n")
text(a.pc$x[,1],a.pc$x[,2],colnames(a))
Rでの主成分分析は以下に詳しい。
http://aoki2.si.gunma-u.ac.jp/R/prcomp2.html
結果
以下のように可視化される。
自己組織化マップ(SOM)
主成分分析(PCA)
Mr.Childrenの歌詞分析(5): フレーズに着目した、シングル曲のクラスタリング
主結果
Mr.Childrenのシングル曲を、歌詞のフレーズに着目してクラスタリングしました。頻出フレーズを書き加えています。
考察
N-gramでの解析では、フレーズがそのまま残るので、結果を見て解釈しやすいですね。全体として、Mr.Childrenの大きなテーマは「生きる」や「自分」であるようです。
- 「君がいた夏」「Sign」「【es】~Theme of es~」「マシンガンをぶっ放せ」「旅立ちの唄」「抱きしめたい」「Replay」「口笛」はラブソングで、「hypnosis」「優しい歌」はその中でも儚さや躊躇いを表現。
- 「箒星」「HERO」「終わりなき旅」「Everything(It's you)」「くるみ」「NOT FOUND」「君が好き」「Any」「innocent world」「fanfare」「GIFT」は、自分を探している歌。
- 「しるし」「CROSS ROAD」「I'LL BE」「ニシエヒガシエ」「光の射す方へ」「祈り~涙の軌跡」「花」「かぞえうた」「掌」「Tomorrow never knows」「フェイク」「シーソーゲーム~勇敢な恋の歌~」「名もなき詩」「youthful days」「花の匂い」はぼくらが生きているということ、「everybody goes~秩序のない現代にドロップキック」「HANABI」は生きること、愛することがテーマ。
手法
フレーズに着目するために、N-gramで特徴行列を作成し、クラスタリングを行います。tf*idf行列では形態素解析で単語を抽出するため、単語の前後関係やフレーズといったものは無視されますが、N-gramでは単語で分割されないため、フレーズを抽出することができます。
詳しくは以下の記事をご覧ください。
Mr.Childrenの歌詞分析(4): 単語の意味を考慮した、シングル曲のクラスタリング
主結果
Mr.Childrenのシングル曲を、歌詞を元にクラスタリングしてみました。
1.単語ベースのクラスタリング
2.概念ベースのクラスタリング
考察
評価
共通する単語や概念を赤字で書いてみました。単語ベースでは、「時代」「社会」や「幸せ」についてきちんとクラスタが形成されていて、いいかんじです。一方で、概念ベースはパッとしないですね。。正解がないので評価はしにくいですが、どちらかと言えば単語ベースのほうがしっくりくる気がします。本来であれば、好調/不調、前向き/後向き、恋愛/社会といった形で分かれてほしかったのですが。さらに言えば、「君が好き」と「抱きしめたい」、「Sign」と「しるし」がくっついてほしいところでした。(関係ないですが、「Mr.Children「Sign」から「しるし」についての解説」では、「Sign」と「しるし」の関係が記号論を交えて述べられていて、とてもおもしろいです。)
課題
歌詞のクラスタリングの難しさは、2つあると思います。
1つは、テキストが短いため、1つのドキュメントにおける情報量が少ないことです。テキストが短いと、tf*idf行列が疎になり、テキスト間の距離が均一となってしまいます。
もう1つは、期待するクラスタリング結果が、「水」や「光」といった分類ではなく、「期待」「悲観」「勇気」といった、より心理的な分類であるということです。
改善策
これらの問題を克服するためには、やはり2つの方策をとる必要があると考えています。
1つは、テキスト間の距離を計算するのに、単語同士の距離を考慮して計算することです。今回の手法では、「愛」と「幸福」の距離と、「愛」と「冷蔵庫」の距離は同じです。ところが、本来、これらの心理的距離は異なります。テキストが短く、情報量が少ないことをカバーするために、単語間の距離を考慮する必要があります。具体的には、WordNetのネットワークを利用すればよいと思います。
もう1つは、単語に感情を紐付けて解析することです。心理的な分類を行うためには、前もってどのような単語がどのような感情に関係するのかを知っておく必要があります。そのために、感情辞書と呼ばれるような辞書を別途用いることが考えられます。実際に、英語ではWordNet-Affectという感情を考慮したWordNetがあります。残念ながら日本語版はありませんが、類似の試みはあるようです。
- 感情辞書の研究(修論):感情辞書は公開されていない…。
http://repository.dl.itc.u-tokyo.ac.jp/dspace/bitstream/2261/35888/1/48086413.pdf - 感情辞書:メールすればもらえるらしいが、敷居が高い…。
http://www.kde.cs.tsukuba.ac.jp/~zjw/wiki/index.php?%E6%84%9F%E6%83%85%E8%BE%9E%E6%9B%B8
今回はこれで一区切りにしますが、まだまだ改善の余地はあります。ひとまず、機械にすべて解かせるのではなく、軸の設定など人間の手も適度に介在させる必要がありそうです。また時間があれば、チャレンジしてみます。何かアドバイス等あれば、コメントお願いします^^
手法
解析は、以下のように行いました。歌詞のテキストファイルからRMeCabを用いてtf*idf行列を作成し、単語ベースの場合はそのままクラスタリングしました。概念ベースの場合は、WordNetを用いて概念ベースのtf*idf行列に変換してから、クラスタリングしました。クラスタリングでは、局所的重みに対数化索引語頻度、大域的重みにエントロピーを用いました。
詳しくは以下の記事をご覧ください。
Mr.Childrenの歌詞分析: ここまでのまとめ
主結果
- Mr.Childrenの歌詞分析(1): よく出てくるワードランキング30
- Mr.Childrenの歌詞分析(2): 多くの楽曲に含まれるワードランキング30
- Mr.Childrenの歌詞分析(3): シングル曲のクラスタリング
- Mr.Childrenの歌詞分析(4): 単語の意味を考慮した、シングル曲のクラスタリング
- Mr.Childrenの歌詞分析(5): フレーズに着目した、シングル曲のクラスタリング(2013/01/07追加)
- Mr.Childrenの歌詞分析(6): 感情に基づくマッピング(2013/01/14追加)
手法
- 歌詞をテキスト形式でダウンロードする
- MeCabで複数のテキストファイルの形態素解析を行う
- RMeCabで複数のテキストファイルの頻出ワードを抽出する
- RとRMeCabでテキストファイルをクラスタリングする(2013/01/02追記)
- PythonでWordNetを利用して、テキストの特徴行列を単語ベース→概念ベースに変換する(2013/01/05追加)
- Rで複数のテキストファイルを二次元にマッピングして可視化する(2013/01/11追加)
- Rでテキストファイルをセンチメントの時系列データに変換する(2013/01/13追加)
- Pythonで日本語WordNetと英語WordNetを利用して、単語間の類似度を測る(2013/01/22追加)
PythonでWordNetを利用して、テキストの特徴行列を単語ベース→概念ベースに変換する
目的
「RとRMeCabでテキストファイルをクラスタリングする」 では、各テキストから単語を抽出し、各単語の出現頻度を元に、各テキストの特徴ベクトルを生成した。このとき、例えば"愛"と"あい"という単語は同一のものとして扱われたが、"愛"と"恋"という単語はまったく別のものとして扱われた。この結果、テキスト間の距離が人間が感じる距離と異なる場合が出てきた。そこで、本稿では、同じ概念の単語をひとまとめにして特徴ベクトルを作成することで、概念レベルでのテキストのクラスタリングを目指す。
手法
クラスタリングの手順は以下のとおり。手順2以外については、以前の記事とほぼ同様なので、ここでは詳細は割愛する。
- Rで複数のテキストファイルからtf*idf行列を作成し、テキストファイルに出力する。
- tf*idf行列の書かれたテキストファイルを、PythonとWordNetを用いて変換し、テキストファイルに出力する。
- 再びRで修正されたtf*idf行列を読込み、クラスタリングを行う。
手順2では、単語ベースのtf*idf行列を、概念ベースのtf*idf行列に変換する。同じ概念の単語をひとまとめにするために、WordNetを用いる。WordNetとは、単語がその意味でグルーピングされ、それらグループの関係性が記述された、概念辞書である。日本語WordNetはver0.9が2009年に公開され、無償で使用、複写、改変、頒布することが許可されている。また、Perl, Python, Java, Ruby等のフロントエンドも用意されている。今回は、Pythonを用いてWordNetを扱う。(このせいで文字コードに大変苦労させられたわけだが…。)WordNetをPythonから使うには、Python2.6(Python3系は不可), sqlite3, WordNet-0.9が必要。
Pythonのスクリプトは以下のように書ける。
・wndriver.py: WordNetの自作ドライバ(WordNetのPythonAPIであるwn.pyを利用)
・convDocMatrix.py: 特徴行列を変換するメインモジュール
# prepare file
# write file
参考ページ
- 日本語WordNet
http://nlpwww.nict.go.jp/wn-ja/ - 日本語WordNetのdbの中身
http://sucrose.hatenablog.com/entry/20110204/p1 - 日本語WordNetのPythonフロントエンド
http://subtech.g.hatena.ne.jp/y_yanbe/20090314/p2 - Pythonの文字コードについて
http://nltk.googlecode.com/svn/trunk/doc/book-jp/ch12.html
http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/encoding.html
http://d.hatena.ne.jp/atsuoishimoto/20110311/1299805971 - sqlite3
http://www.sqlite.org/
Mr.Childrenの歌詞分析(3): シングル曲のクラスタリング
主結果
Mr.Childrenのシングル曲の歌詞をクラスタリングしてみると、このようになりました。(アルバム曲を含めてクラスタリングすると図が煩雑になってしまうため、今回はシングル曲のみで実行しました。)
妥当性の検証
この結果って、どうなんでしょう。クラスタリングの妥当性はどの程度あるのでしょうか。近いと判断されたクラスタごとに、楽曲の歌詞を少し調べてみました。
【街】クラスタ
曲名 | 歌詞 |
---|---|
innocent world | 黄昏の街を背に 抱き合えたあの頃が 胸をかすめる |
旅立ちの唄 | 君の大好きだった歌 街に流れる |
【優しい】クラスタ
曲名 | 歌詞 |
---|---|
口笛 | 優しく響く あの口笛のように |
優しい歌 | 優しい歌 忘れていた 誰かの為に 小さな火をくべるよな |
【現実】クラスタ
曲名 | 歌詞 |
---|---|
マシンガンをぶっ放せ | この現実に目を向けなさい |
hypnosis | もう現実から見捨てられても 構わないさ |
【明日】クラスタ
曲名 | 歌詞 |
---|---|
フェイク | 虚しさを抱えて 夢をぶら下げ 二階建ての明日へとTAKE OFF |
Tomorrow never knows | 心のまま僕はゆくのさ 誰も知ることのない明日へ |
【二人】クラスタ
曲名 | 歌詞 |
---|---|
Replay | 二人で駆け抜けた季節も どんな場面も 振り返れば ほら 微笑み溢れてる |
抱きしめたい | 二人だけの 夢を胸に 歩いてゆこう |