〇はじめに
この記事ではRを使って教師あり学習のk近傍法による文書分類を行います。k近傍法とは、各データの特徴量を基に、特徴の近いk個のデータの内の多い方のグループに分類する手法です。基本的な内容は本に沿ってやっているので、詳しい説明は参考書籍をご参照ください。
こぶしとつばきの歌詞を文字・単語に切り分け、曲ごとの出現頻度を特徴量として各グループに分類することに挑戦します。ちなみに、どのパターンでも全然分類できませんでした!!
・分析データ
ハロプロのグループ「こぶしファクトリー」と「つばきファクトリー」の歌詞。詳しくは下の記事をご参照ください。
特徴語の選択について
www.anarchive-beta.com
特徴語の頻度表作成について(前半部分)
www.anarchive-beta.com
・主な参考書籍
『Rによるやさしいテキストマイニング』小林雄一郎,オーム社
〇線形判別分析による文書分類
・処理コード
使用パッケージ
library(class)
k近傍法による分類
result1 <- knn(train_data[, -ncol(train_data)], test_data[, -ncol(test_data)], train_data[, ncol(train_data)], k = 5) result2 <- table(test_data$TYPE, result1) #分類精度 result2 sum(diag(result2)) / sum(result2)
class::knn()
を使って分析を行う。引数に訓練データ(特徴量のみ)、評価データ(特徴量のみ)、訓練データの教師データとなる列(TYPE)、k =
で分類するために用いるデータの数を指定する。教師データを列の一番後ろに付けているので、ncol(各データ)で位置を指定している。
k個から多数決で分類していくので、kは奇数にする。ここでは5個で分析を行った。
・分析結果
文字の出現頻度を特徴量とした場合
相対頻度
両グループから50語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 0 7 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.3846154
ちなみに訓練データでテストしたところ下の結果でした。
> result2 ## result1 ## kbs tbk ## kbs 6 7 ## tbk 0 15 > sum(diag(result2))/sum(result2) ## [1] 0.75
両グループから100語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 2 5 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.5384615
両グループから200語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 2 5 ## tbk 0 6 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
とまぁ、ほぼ全てを「つばき」に分類していますね。両グループがほぼ半数ずつなのでどちらかに全振りすれば分類精度は50%を超えてしまいます。
観測頻度
両グループから50語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 1 6 ## tbk 0 6 > sum(diag(result2))/sum(result2) ## [1] 0.5384615
両グループから100語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 0 7 ## tbk 0 6 > sum(diag(result2))/sum(result2) ## [1] 0.4615385
両グループから200語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 1 6 ## tbk 0 6 > sum(diag(result2))/sum(result2) ## [1] 0.5384615
これも「つばき」に全振り。
単語の出現頻度を特徴量とした場合
相対頻度
両グループから50語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 3 4 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
両グループから100語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 4 3 ## tbk 2 4 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
両グループから200語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 2 5 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.5384615
おおよそ正誤は2分の1なのでテキトーに分類すれば精度は50%近くになります。これは全振りではないですが、この結果もそんな感じ。
相対頻度,品詞限定(名詞,動詞,形容詞,形容動詞)
相対頻度
歌詞の内容によって特徴が出ているのでは、との考えのもと意味的役割を持つ名詞・動詞・形容詞・形容動詞に限定した分析を行う。
両グループから50語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 5 2 ## tbk 4 2 > sum(diag(result2))/sum(result2) ## [1] 0.5384615
両グループから100語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 3 4 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
両グループから200語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 1 6 ## tbk 1 5 > sum(diag(result2))/sum(result2) ## [1] 0.4615385
これも同様の結果。
TF-IDF
TF-IDFはその単語がどれだけ文書を特徴づけているのかに注目した値なので、TF-IDFも基準として使い分析を行う。
両グループから50語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 6 1 ## tbk 2 4 > sum(diag(result2))/sum(result2) ## [1] 0.7692308
両グループか100語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 4 3 ## tbk 2 4 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
両グループか200語ずつを特徴語とした結果
> result2 ## result1 ## kbs tbk ## kbs 4 3 ## tbk 2 4 > sum(diag(result2))/sum(result2) ## [1] 0.6153846
多少いい雰囲気の結果なのだけど、これもたまたまです。
シングル楽曲を訓練データ、アルバム楽曲を評価データに統一して、それぞれの手法を比較するつもりなのでこのようにしていますが、多数決で決める以上同数でなければ結果に影響が出そうです。なので、「こぶし」から10曲(全20曲)、「つばき」から10曲(全21曲)を訓練データとして、またkを3・5・7で分析を行ったところ、特に変化が見られませんでした。
以上です。
〇おわりに
酷い結果なのはいいとして、特に傾向が見えなかったのでどうしたらいいものか悩みます。悔しいので早く理論の勉強をしたいのですが、ひとまず先を進めます。
最後まで読んでいただきありがとうございました!次はナイーブベイズの予定です。ランダムフォレストになりました!