からっぽのしょこ

読んだら書く!書いたら読む!読書読読書読書♪同じ事は二度調べ(たく)ない

【テキストマイニング入門】R言語でこぶつば楽曲を線形判別分析して分類できなかった【やってみた】

〇はじめに

 前回はこぶつば楽曲を分類(クラスタリング)しました。
www.anarchive-beta.com
 今回は分類(カテゴライズ)です。線形判別分析(linear discriminant analysis)に挑戦します。線形判別分析とは、AかBかが分かっている訓練データを用いてAとBを分ける判別モデル(線)を推定し、AかB分からない評価データをそのモデルを使って(その線よりあっちはAこっちはBというように)判別します。今回もこぶつば楽曲を分類します。

が、全然できませんでした!えぇ分かっていましたよ、だってこぶしとつばきの歌詞にそれぞれある程度の明確な特徴があって、その境界線を引けなきゃいけないわけですから、、、

とまぁこんな感じですが、分析の流れとコード的な勉強のため強引にやってみましたのでまとめておきます。

参考書籍
  • 『Rによるテキストマイニング入門』石田基広,森北出版株式会社
  • 『Rによるやさしいテキストマイニング』シリーズ,小林雄一郎,オーム社

 

〇やってみた

・線形判別分析

分析データ

 ハロー!プロジェクトのグループの「こぶしファクトリー」と「つばきファクトリー」の楽曲の歌詞を用います。
テキストファイル名は、こぶし:kbs、つばき:tbk、シングル曲:s、アルバム曲:a、作品の通し番号1,2,3...、トラック番号1,2,3...:a,b,c...としました。ディレクトリはkbtb。(例:つばきファクトリー4thシングルA面:kbtb/tbk_s4a.txt)
 シングル楽曲を訓練データ、アルバム楽曲を評価データとしました。

利用したパッケージ
library(RMeCab)
#docMatrix2()
library(dplyr)
#%>%
library(MASS)
#lda()
data1 <- docMatrix2("kbtb", pos = c("名詞"))
data2 <- t(data1)
write.csv(data2, "kbtb1.csv")

 RMeCab::docMatrix2で単語と頻度を調べ、単語文書行列を作成します。分類用のタイプ列に"kbs"と"tbk"と訓練テストに分ける用列に"s"と"a"を一旦ファイルを書き出してExcelで打ち込みました。(Rでしたかったが調べる余裕がなかった…)

f:id:anemptyarchive:20181206015847p:plain
前処理後データ

data3 <- read.csv("kbtb2.csv")
training_data0 <- subset(data3, type_sa == "s")
training_data1 <- training_data0[, -c(1, 2)]
test_data0 <- subset(data3, type_sa == "a")
test_data1 <- test_data0[, -c(1, 2)]
result1 <- lda(type ~ ., data = training_data1)

で、判別式が求まるはずなのですが、このようなエラーメッセージが出ました。

Error in lda.default(x, grouping, ...) :
  variables    3    6    7   11   25   29   31   32   33   46   54   55 ~~~ 1222 1225 appear to be constant within groups

なので、とりあえず該当する列を削除して継続。

training_data2 <- training_data1[, -c(3,6,7,11,~~~,1416,1418,1421)]
result1 <- lda(type ~ ., data = training_data2)

すると、次のメッセージが出ましたがとりあえず継続。

Warning message:
In lda.default(x, grouping, ...) : variables are collinear
result2 <- predict(result1, test_data1)
result3 <- table(test_data1$type, result2$class)
result3
sum(diag(result3))/sum(result3)

f:id:anemptyarchive:20181206021659p:plain
分析結果
 結果は、評価データ13曲中11曲をこぶし、2曲をつばきと分類し、こぶし6曲、つばき1曲が正しく、分類精度は53.8%。ではなく、ほぼ全てをこぶしと分類しただけでしょうね。

〇さいごに

 自分にとって今回やったこと自体ももちろん勉強なのですが、何をどう勉強すべきなのかを探している段階ですので、今回の結果自体は特に流していいのかなという感じです。次は『Rによるやさしいテキストマイニング[機械学習編]』に本格的に進みたかったのですが、データハンドリングの方を先にやります。

 拙いブログを最後まで読んでいただきありがとうございました!またよろしくお願いします。

2019.01.10追記:再挑戦しました。
www.anarchive-beta.com