Tech Blog

Information Technology / Machine Learning / Data Analysis / Big Data / System Integration

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スクリプトは以下のように修正しました。

# ファイルごとの単語の出現頻度を合計する
for(i in 1:nrow(a)){
  b[i,1] <- 0
  for(j in 1:ncol(a)){
    if(a[i,j]!=0) b[i,1] <- b[i,1] + 1
  }
}

 

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等を用いて作成しておく。 

# RMeCabの読込み
library(RMeCab)
 
# 指定ディレクトリ中のファイル内に含まれる単語の出現頻度を計算する
a <- docMatrix("C:/LyricsWorkspace/Lyrics")
 
# 全ファイルの単語の合計出現頻度を入れる行列を用意する
b <- matrix(0:0, nrow=nrow(a), ncol=1)
# ファイルごとの単語の出現頻度を合計する
for(i in 1:nrow(a))b[i,1] <- sum(a[i,])
# 行名を単語、列名をtotalにする
rownames(b) <- rownames(a)
colnames(b) <- "total"
 
# 単語を出現頻度順にソートする
c <- b[order(b[,1], decreasing=TRUE),]
 
# 保存
write.table(c,"C:/LyricsWorkspace/DocMatrix/total.txt")

 

結果

すると、単語の出現頻度ランキングが出力される。

f:id:tkdmah:20121231010628p:plain

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

 

結果

すると、 形態素 / 品詞 / 活用形 / 活用型 / 原型 / 読み / 発音等がファイルに出力される。

f:id:tkdmah:20121230170828p:plain

 

歌詞をテキスト形式でダウンロードする

あるアーティストの歌詞をテキスト形式で一括ダウンロードできないかと探していたら、 Lyrics Master というソフトを発見。これは便利!アーティストの歌詞をすべてダウンロードするには、アーティスト名で検索し、右クリック>すべてダウンロードを選択すればよい。

 

Lyrics Materの特徴

  • フリーソフトウェア
  • タイトル / アーティスト / 歌い出しで検索できる
  • テキスト形式で歌詞をダウンロードできる
  • テキストには曲名・作曲者・作詞者・歌詞が含まれている

http://www.kenichimaehashi.com/lyricsmaster/  

 

f:id:tkdmah:20121230113912p:plain