以前石垣島の5ちゃんの書き込みを使って感情分析してみました。せっかく前処理したデータがあるので、これを使ってクラスタリングができないか、やってみました。
まず、各書き込みについて、抽出した単語(各書き込み毎に5~20)の1つ1つを単語分散表現でベクトル化します。今回はWord2Vecを使って1つの単語を200次元のベクトルにしました。
でもこのままではKMeansは動きません。この時点では、縦がデータ(書き込み)の数、横(特徴量)が単語の数、奥行きが各単語のベクトル200の多次元配列になっています(エクセルのシートが200枚重なっているイメージ)。それから、書き込みによって単語の数が異なるため、特徴量つまり横の長さがまちまち。
これを、以下のようにして処理しました。
各単語がベクトルになっているので、足し算が可能です。
ネガティブな単語+ネガティブな単語=ネガティブな何か
ポジティブ+ポジティブ=ポジティブな何か
ネガティブ+ポジティブ=ニュートラルな(あるいはそれに近い)何か
になると考えられます。
そこで、各書き込みについて、単語ベクトルを全部足しました。このままでは奥行きが200と深い特徴量が1個できるだけなので、これを転置し、縦が書き込みの数、横が200個の特徴量の1枚のエクセルのシートみたいな形に整えました。
これを標準化して準備完了。クラスタリング(KMeans)した結果は、
cluster 0 207 1 46 2 608
となり、osetiで感情分析した時のポジティブ、ネガティブ、ニュートラルの数とだいぶ異なっています。
osetiのグラフをみるとネガティブと判定したものは-1.00あたりが200をちょい割る程度。これに0未満のものを足すと200を少し超える程度で、今回のcluster0がネガティブと仮定するとほぼ合致します。
次回に続く...