目的
ネット選挙が解禁されて早一年、公職選挙法に反逆するような使い方がちらほらみられる、今日この頃いかがおすごしでしょうか。
さて、今回は、各政党のホームページを解析して、どんな単語が使われているかしらべ、似たような特徴のある政党を抽出してみようと思います。
手順
- 各政党のホームページをダウンロードしてくる。
- ダウンロードしたページをMecabで形態素解析する。
- tf-idfで各単語のスコアを求める
- コサイン類似度による文章の距離の測定を行い、政党間の距離を求める。
- GraphVizで、その関連を表示する。
結果
2014年の各政党のホームページ解析
http://needtec.sakura.ne.jp/analyze_election/page/analyzehp/2014
ソースコード
https://github.com/mima3/analyze_election/tree/master/script_comp_manifesto
ソースコードをダウンロードしてきて以下のスクリプトを実行する。
# ホームページをダウンロードしてDBに格納
python create_parties_db.py parties_hp_2014.sqlite party_hp_json_2014.json
# 形態素解析して単語の数の集計
python create_parties_tokens.py parties_hp_2014.sqlite
# tf-idfとコサイン類似度の計算をして結果をJSONとPNGに記録する。
python create_tf_idf_report.py parties_hp_2014.sqlite party_hp_result_2014.json party_hp_result_2014.png "ms ui gothic"
実行には下記のライブラリをインストールする必要があります。
・nltk
・lxml
・MeCab
・urllib2
・pydot
解説
tf-idfによる文章の解析
文章yにおいて単語xのtf-idfの値は以下のようになる。
tf = 文章y中に単語xが登場した数 / 文章中の単語数
idf = 1.0 + log( 文章の総数 / 単語xが登場する文章の数 )
tf-idf = tf × idf
多くのドキュメントに登場する単語は重要度が下がりスコアが低くなり、特定のドキュメントにしか登場しない単語は重要度があがりスコアが大きくなる
コサイン類似度による文章の距離の測定
文章1が単語(A,B,C)を持っており、その単語のTF-IDFの値が(0.1,0.2,0.3)とする。
文章2が単語(C,D,E)をもっており、その単語のTF-IDFの値が(0,4,0.5,0.6)とする。
文章に存在しない単語のTF-IDFを0とするとして、全ての単語についてのTF-IDFを作成する。
文章1の(A,B,C,D,E)は(0.1,0.2,0.3,0,0)となる。
文章2の(A,B,C,D,E)は(0,0,0.4,0.5,0.6)となる
この文章1と文章2のベクトルの角度のコサインは両者の類似度を表す。
まったく同じ文章の場合は文章1と文章2の角度は0度になる。
Pythonの場合は、nltk.cluster.util.cosine_distanceで計算してくれる。