感情極性辞書の「単語感情極性対応表」を用いてテキスト感情分析処理を作ってみたいと思います。
単語感情極性対応表とは
東工大の高村教授が公開されている「単語感情極性対応表」で以下のように単語に(ポジティブ)1~(ネガティブ)-1の感情値が振ってある表になります。
優れる:すぐれる:動詞:1
良い:よい:形容詞:0.999995
喜ぶ:よろこぶ:動詞:0.999979
・
・
・
病気:びょうき:名詞:-0.999998
死ぬ:しぬ:動詞:-0.999999
悪い:わるい:形容詞:-1
##実装
それでは、これに形態素解析ツールjanomeと組み合わせて実装していきます。
(janomeをインストールしていなければpipでインストールしておいて下さい。)
まずは下記から単語感情極性対応表をダウンロードしてコードと同じ場所に置きます。
まずはpythonで単語をキー、感情値を値とした辞書を作成します。
sentiment_dic = {}
with open('pn_ja.dic', 'r') as f:
lines = f.readlines()
for line in lines:
line_components = line.split(':')
sentiment_dic[line_components[0]] = line_components[3]
次にテキストを引数として戻り値で感情値(1~-1)を返す関数を作ります。
内容としてはjanomeを使って形態素解析で取り出した単語を辞書で引いて感情値を取得し平均を取って戻り値で返します。
from janome.tokenizer import Tokenizer
def sentiment_analyse(text):
t = Tokenizer()
tokens = t.tokenize(text)
sentiment_val = 0
word_cnt = 1e-6 #割り算で使うので0に近い値
for token in tokens:
#単語の基本形を取り出し
word = token.surface
if word in sentiment_dic:
sentiment_val = sentiment_val + float(sentiment_dic[word])
word_cnt += 1
return round(sentiment_val/word_cnt, 5)
それでは簡単な例で確認します。
ポジティブな文章
sentiment_analyse("ご飯が美味しい")
出力
0.99136
次にネガティブな文章
sentiment_analyse("注射が痛いくて泣いた")
出力
-0.82049
それなりの値が出ていると思われます。
それでは私の好きな漫画のセリフも入れてみましょう。
①
sentiment_analyse("友達になるのにだって資格なんていらない!!")
出力
0.16587
②
sentiment_analyse("死は全く怖くない一番恐れるのはこの怒りがやがて風化してしまわないかということだ")
出力
-0.69687
③
sentiment_analyse("友達が友達を助けるのは当然だろ。")
出力
0.63386
④
sentiment_analyse("金がありゃオレの友達は死ななかった!!")
出力
-0.49139
⑤
sentiment_analyse("そんな目でみつめるなよ。興奮しちゃうじゃないか。")
出力
-0.83872
どうでしょうか?個人的には⑤はそれほどネガティブではないような気がしますが、それ以外はまあまあだと思います。でも性能を求めるならosetiなどのOSSを使ったり、APIを使ったほうが良いかな。