LoginSignup
4
1

More than 1 year has passed since last update.

Pythonで感情極性辞書を用いたテキスト感情分析をつくってみた

Posted at

 感情極性辞書の「単語感情極性対応表」を用いてテキスト感情分析処理を作ってみたいと思います。

単語感情極性対応表とは

東工大の高村教授が公開されている「単語感情極性対応表」で以下のように単語に(ポジティブ)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を使ったほうが良いかな。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1