RMeCabを使う (4)

 前回に引き続き、RMeCabパッケージの使い方を紹介します。前回は単語の頻度を用いた文書分類を行いましたが、今回はn-gramの頻度を用いた文書分類を行います。
 複数ファイルにおけるn-gramの頻度を集計するには、docNgram関数を使います。文書分類には、前回と同じく、主成分分析と階層型クラスター分析を使います。

# 複数ファイルの解析
# パッケージの読み込み
library(RMeCab)
# データが保存されているフォルダの指定
setwd("C:/PM")
# 文字n-gramの集計
docNgram.result <- docNgram("C:/PM", type = 0)
# 頻度を標準化
docNgram.scale <- scale(docNgram.result)
# 行列を転置
docNgram.scale.t <- t(docNgram.scale)
# 主成分分析
pca <- prcomp(docNgram.scale.t)
# 散布図の描画
biplot(pca)
# クラスター分析
# ユークリッド距離
d <- dist(docNgram.scale.t, "euclidean")
# 最長一致法
hc <- hclust(d, "complete")
# 樹形図の描画
plot(hc, hang = -1)

 上記のスクリプトを実行すると、以下のような散布図と樹形図が作成されます。

f:id:langstat:20141112151110p:plain

f:id:langstat:20140812181035p:plain

 そして、特定のn-gramの頻度を知りたい場合はwhich関数を使います。*1

# 特定のn-gramの頻度を確認
docNgram.result[which(rownames(docNgram.result) == "[経-済]"), ]

 上記のスクリプトを実行すると、以下のような結果が表示されます。

     Abe.txt      Aso.txt   Fukuda.txt Hatoyama.txt      Kan.txt     Noda.txt 
          11           14            9           31           14           21 

 さらに、一部のn-gramだけを使ったクラスター分析を行うことも可能です。*2 *3

# 一部のn-gramだけを抽出
docNgram.result.2 <- docNgram.result[rownames(docNgram.result) %in% c("[震-災]", "[経-済]", "[雇-用]", "[行-政]", "[企-業]", "[外-交]", "[憲-法]"), ]
# 頻度を標準化
docNgram.scale.2 <- scale(docNgram.result.2)
# 行列を転置
docNgram.scale.t.2 <- t(docNgram.scale.2)
# 主成分分析
pca.2 <- prcomp(docNgram.scale.t.2)
biplot(pca.2)
# クラスター分析
d2 <- dist(docNgram.scale.t.2, "euclidean")
hc2 <- hclust(d2, "complete")
plot(hc2, hang = -1)

f:id:langstat:20141112151309p:plain

f:id:langstat:20140814143848p:plain

*1:データに含まれるn-gramの一覧を確認するには、rownames(docNgram.result) とします。また、n-gramの頻度の集計結果をファイルに書き出すには、write.table(docNgram.result, file = "result.csv", sep = ",") などとします。

*2:以下の樹形図に鎖効果が見られますが、あくまで「スクリプトの例」としてご覧ください。

*3:因みに、石田 (2008) のように、"[と-、]", "[て-、]", "[は-、]", "[が-、]", "[で-、]", "[に-、]", "[ら-、]", "[も-、]"といった文字と読点の2-gramを使った著者推定を行うこともできます。

広告を非表示にする