RとRMeCabでテキストファイルをクラスタリングする
目的
今回は、複数のテキストファイルを類似したテキスト同士で分類する。
手法
Rの階層的クラスタリングは、各行がクラスタリング対象の特徴ベクトルからなる行列に対して、各行をクラスタに分ける。そこで、RMeCabでtf*idf行列を作成し、Rで階層的クラスタリングを行う。
・Rスクリプト
library(proxy)
library(RMeCab)
# 指定ディレクトリ中のファイル内に含まれる単語のtf*idfを行列に保持させる
a <- docMatrix("C:/LyricsWorkspace/Lyrics", weight = "tf*idf")
# ミンコフスキ距離を用いて、ウォード法で階層的クラスタリングを実行
# method=c("euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski")
a.d <- dist(t(a), method="minkowski",p=100)
a.hc <- hclust(a.d, method="ward")
# クラスタリング結果を出力、プロット
a.ct <- cutree(a.hc, k=10)
par(ps=1)
plot(a.hc, hang=-1)
write.table(a,"C:/LyricsWorkspace/DocMatrix/tfidf.txt")
write.table(sort(a.ct),"C:/LyricsWorkspace/hcresult.txt")
2013/01/06追記
テキストの特徴行列をtf*idf法ではなくN-gramで解析するには、以下のように変更すればよい。
# 指定ディレクトリ中のファイル内に含まれる単語のtf*idfを行列に保持させる
a <- docNgram("C:/LyricsWorkspace/Lyrics", type=0, N=3)
Mr.Childrenの歌詞分析(2): 多くの楽曲に含まれるワードランキング30
主結果
前回書いた「Mr.Childrenの歌詞分析(1): よく出てくるワードランキング30」の記事ですが、同一楽曲に何度も同じワードが出てきたとき、それを逐一カウントしていました。今回は、各ワードが全楽曲中の何曲に含まれるかをカウントしてみました。すると、このような結果に。
順位 | ワード | ワードを含む曲数 |
---|---|---|
1 | 僕 | 126 |
2 | 君 | 121 |
3 | 何 | 87 |
4 | 人 | 83 |
5 | 中 | 71 |
6 | 誰 | 70 |
7 | 今 | 64 |
7 | 日 | 64 |
9 | 夢 | 63 |
9 | 胸 | 63 |
11 | 手 | 62 |
12 | 心 | 61 |
13 | 自分 | 60 |
14 | いい | 57 |
15 | 僕ら | 49 |
16 | 風 | 48 |
17 | 今日 | 44 |
18 | 一 | 42 |
19 | 目 | 40 |
20 | 明日 | 39 |
20 | 愛 | 39 |
20 | 街 | 39 |
23 | 気 | 38 |
23 | いつ | 38 |
25 | 時 | 37 |
26 | 前 | 35 |
27 | いつか | 34 |
27 | 夜 | 34 |
27 | 優しい | 34 |
30 | 想い | 33 |
「僕」と「君」が逆転した!ふむふむ。
手法
ちなみに、Rスクリプトは以下のように修正しました。
Mr.Childrenの歌詞分析(1): よく出てくるワードランキング30
主結果
Mr.Childrenの歌詞に出てくるワードを出現数でランキングすると、このような結果になりました!
順位 | ワード | 出現数 |
---|---|---|
1 | 君 | 462 |
2 | 僕 | 374 |
3 | 人 | 166 |
4 | 何 | 158 |
5 | 誰 | 147 |
6 | 手 | 121 |
6 | いい | 121 |
8 | 中 | 120 |
9 | 今 | 118 |
10 | 夢 | 115 |
11 | 日 | 114 |
12 | 自分 | 108 |
13 | 胸 | 100 |
14 | 心 | 98 |
15 | I | 92 |
16 | 僕ら | 83 |
17 | 風 | 76 |
17 | 一 | 76 |
19 | Oh | 68 |
20 | 明日 | 67 |
20 | 今日 | 67 |
22 | 目 | 65 |
22 | いつ | 65 |
24 | 前 | 64 |
25 | 街 | 61 |
26 | 愛 | 60 |
26 | 時 | 60 |
26 | you | 60 |
29 | me | 58 |
30 | 男 | 57 |
「僕」よりも「君」のほうが多いんですね。でも「you」よりも「I」のほうが多い。「You」が11回出現してましたが、それを足してもやっぱり「I」のほうが多い。ふむふむ。
手法
分析対象に含まれる楽曲一覧
#2601 / 1999年、夏、沖縄 / 365日 / ALIVE / All by myself / and I close to you / and I love you / Another Mind / Another Story / Any / Asia / Bird Cage / BLUE / Brandnew my lover / CANDY / CENTER OF UNIVERSE / CHILDREN'S WORLD / CROSS ROAD / Dance Dance Dance / Dear wonderful world / DISCOVERY / Distance / Door / Drawing / End of the day / everybody goes ~秩序のない現代にドロップキック~ / Everything (It's you) / Everything -It's you- / Everything is made from a dream / fanfare / Forever / GIFT / Hallelujah / HANABI / Happy Song / Heavenly kiss / HERO / HOWL / hypnosis / I'LL BE / I'm sorry / I'm talking about Lovin' / I / Image / innocent world / It's a wonderful world / Love is Blindness / LOVE はじめました / LOVE / Marshmallow day / Mirror / Monster / Mr.Shining Moon / my confidence song -マイ コンフィデンス ソング- / my life / my sweet heart / NOT FOUND / one two three / Over / PADDLE / PIANO MAN / pieces / Pink~奇妙な夢~ / Prelude / Prism / Sign / Simple / So Let's Get Truth / SUNRISE / Surrender / Tomorrow never knows / Wake me up! / 【es】~Theme of es~ / ありふれた Love Story ~男女問題はいつも面倒だ~ / あんまり覚えてないや / いつでも微笑みを / いつの日にか二人で / かぞえうた / くるみ / こんな風にひどく蒸し暑い日 / さよなら2001年 / さよならは夢の中へ / しるし / その向こうへ行こう / ためいきの日曜日 / つよがり / ひびき / ほころび / アンダーシャツ / イミテーションの木 / インマイタウン / エソラ / クラスメイト / グッバイ・マイ・グルーミーデイズ / シーソーゲーム ~勇敢な恋の歌~ / シーラカンス / ジェラシー / ストレンジ カメレオン / スロースターター / タイムマシーンに乗って / タガタメ / タダダキアッテ / ティーンエイジ・ドリーム(I~II) / デルモ / ニシエヒガシエ / ハル / ファスナー / フェイク / 傘の下の君に告ぐ / 僕が僕であるために / 光の射す方へ / 十二月のセントラルパークブルース / 友とコーヒーと嘘と胃袋 / 友達のままで / 口がすべって / 口笛 / 名もなき詩 / 君がいた夏 / 君が好き / 君の事以外は何も考えられない / 声 / 夏が終わる ~夏の日のオマージュ~ / 天頂バス / 少年 / 常套句 / 幸せのカテゴリー / 彩り / 思春期の夏 ~君との恋が今も牧場に~ / 手を出すな! / 手紙 / 抱きしめたい / 掌 / 擬態 / 旅人 / 旅立ちの唄 / 星になれたら / 東京 / 横断歩道を渡る人たち / 水上バス / 深海 / 渇いたkiss / 潜水 / 独り言 / 祈り ~涙の軌道 / 空風の帰り道 / 箒星 / 終わりなき旅 / 終末のコンフィデンスソング / 羊、吠える / 花─Memento-Mori─ / 花の匂い / 花言葉 / 蒼 / 蘇生 / 虜 / 虹の彼方へ / 蜃気楼 / 血の管 / 言わせてみてぇもんだ / 跳べ / 車の中でかくれてキスをしよう / 逃亡者 / 通り雨 / 過去と未来と交信する男 / 隔たり / 雨のち晴れ / 靴ひも / 風 ~The wind knows how I feel~ / 風と星とメビウスの輪 / 奇跡の地球
RMeCabで複数のテキストファイルの頻出ワードを抽出する
RMeCabとは
形態素解析はMeCabでもできるが、RMeCabを用いると、より手軽にかつ多様な処理を実行することができる。RMeCabは、RでMeCabを呼び出すインタフェースである。Rはオープンソースのデータ解析/マイニング言語であり、以下からインストールできる。
http://www.r-project.org/
RMeCabは、予めMeCabがインストールしてあれば、zipをダウンロードして、RGuiから[パッケージ]>[ローカルにあるzipファイルからのパッケージのインストール]を選択するだけで、インストールできる。
http://rmecab.jp/wiki/index.php?RMeCab
目的と手法
そこで、ここではRMeCabでディレクトリ中ファイルの単語の出現頻度のランキングを作成する。以下のスクリプトをRで実行する。歌詞のテキストファイルはLyrics Master等を用いて作成しておく。
結果
すると、単語の出現頻度ランキングが出力される。
MeCabで複数のテキストファイルの形態素解析を行う
MeCabとは
日本語の文章を分析するとき、まず行うのが「形態素解析」である。形態素解析では、日本語を単語に分割して、それぞれの品詞や読みの解析を行う。これは非常に難しい問題だが、ありがたいことに、 MeCab というオープンソース形態素解析エンジンが公開されている。 MeCab のインストール方法や使い方は、以下の本家サイトに詳しい。
http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html
目的と手法
ここでは、 Mecab を用いて、複数のテキストファイルに対して形態素解析を行う。 以下のバッチファイルをWindowsのコマンドプロンプトで実行する。 mecabはPATHに入れておく。歌詞のテキストファイルはLyrics Master等を用いて作成しておく。
:: AnalyzeMorphemes.bat
:: 歌詞のテキストファイルのディレクトリ
set LYRICS_DIR=C:\LyricsWorkspace\Lyrics
:: 歌詞リストのファイル名
set LYRICS_LIST=C:\LyricsWorkspace\LyricsList.txt
:: 形態素解析の結果を保存するディレクトリ
set MORPHEMES_DIR=C:\LyricsWorkspace\Morphemes
:: 歌詞のテキストファイルのディレクトリを調べて、歌詞リストを作成する
dir /b %LYRICS_DIR%\* > %LYRICS_LIST%
:: Mecabを用いて形態素解析を実行する
for /f "delims=" %%A in (%LYRICS_LIST%) do mecab "%LYRICS_DIR%\%%A" -o "%MORPHEMES_DIR%\%%A"
# バッチファイルコマンドについては以下が詳しい
http://ykr414.com/dos/dos05.html#07
結果
すると、 形態素 / 品詞 / 活用形 / 活用型 / 原型 / 読み / 発音等がファイルに出力される。
歌詞をテキスト形式でダウンロードする
あるアーティストの歌詞をテキスト形式で一括ダウンロードできないかと探していたら、 Lyrics Master というソフトを発見。これは便利!アーティストの歌詞をすべてダウンロードするには、アーティスト名で検索し、右クリック>すべてダウンロードを選択すればよい。
Lyrics Materの特徴
- フリーソフトウェア
- タイトル / アーティスト / 歌い出しで検索できる
- テキスト形式で歌詞をダウンロードできる
- テキストには曲名・作曲者・作詞者・歌詞が含まれている
http://www.kenichimaehashi.com/lyricsmaster/
コミュニティ版Hadoopのインストール
hadoop-0.22系のインストール(メモ)