読者です 読者をやめる 読者になる 読者になる

潜在的意味解析による分類

 今回は、複数のテキストから作成した文書ターム行列に潜在的意味解析を行う方法を紹介します。*1 分析データは、石田 (2008)サンプルデータにおける森鴎外夏目漱石のテキスト(合計8編)とします。また、潜在的意味解析には、各テキストにおける名詞、動詞、形容詞の頻度を使います。*2

# 文書ターム行列の作成
# パッケージの読み込み
library(RMeCab)
# 頻度集計と重み付け
DM <- docMatrix("writers", pos = c("名詞", "動詞", "形容詞"), weight = "tf * idf")
# 解析に不要な情報を削除
DM <- DM[row.names(DM) !=  "[[LESS-THAN-1]]" , ]
DM <- DM[row.names(DM) !=  "[[TOTAL-TOKENS]]" , ]
# 特異値分解
DM.svd <- svd(DM)
DM.svd.t <- t(DM.svd$u[, 1:3])
# 色分けの準備
DM.col <- substring(colnames(DM), 1, 3)
# ラベルの準備(ファイル名から拡張子を削除)
DM.names <- unlist(strsplit(colnames(DM), ".txt"))

# 視覚化
# パッケージの読み込み
library(rgl)
# ウィンドウの準備
rgl.open()
# 背景の指定
rgl.bg(color = c("white", "black"))
# 座標軸の描画
rgl.lines(c(-1, 1), 0, 0, color = "gold")
rgl.lines(0, c(-1, 1), 0, color = "gray")
rgl.lines(0, 0, c(-1, 1), color = "black")
# 座標目盛の色と3次元空間の背景色の指定
rgl.bbox(color = "blue", emission = "green")
# 描画
rgl.texts(DM.svd.t[1, ], DM.svd.t[2, ], DM.svd.t[3, ], DM.names, color = as.numeric(as.factor(DM.col)))

 上記のスクリプトを実行すると、以下のような3次元プロットが作成されます。そして、この図は、マウス操作で拡大・縮小したり、回転させたりすることが可能です。*3

f:id:langstat:20141110215032p:plain

*1:今回の記事は、石田 (2008) を参考にしています。

*2:RMeCabのdoxMatrix関数は、デフォルトで名詞、動詞、形容詞のみを抽出しますが、ここでは明示的に指定しています。

*3:鴎外のテキストと漱石のテキストが綺麗に分かれていませんが、今回の記事はあくまでスクリプトの例なので、見逃してください。