見出し画像

osetiによる日本語の感情分析

「oseti」による日本語の感情分析方法をまとめました。

1. oseti

「oseti」は辞書ベースの日本語の感情分析のライブラリです。

辞書には、東北大学の乾・鈴木研究室の「日本語評価極性辞書」が使われています。

2. osetiのインストール

インストール方法は、次のとおりです。

(1) Python 3.7の仮想環境を作成して、依存関係のパッケージをインストール。

$ pip install mecab-python3
$ pip install ipadic
$ pip install sengiri

(2) 「oseti」をクローン。

$ git clone https://github.com/ikegami-yukino/oseti.git

(3) 「oseti/oseki.py」のMeCab.Tagger()とsengiri.tokenize()にipadic.MECAB_ARGSを指定。

import ipadic
self.tagger = MeCab.Tagger(mecab_args)
↓
self.tagger = MeCab.Tagger(ipadic.MECAB_ARGS)


for sentence in sengiri.tokenize(text):
↓
for sentence in sengiri.tokenize(text, mecab_args=ipadic.MECAB_ARGS):
※ 3ヶ所
「NEologd」を使うと、発話「好きだ。」を歌タイトル「好きだ。」と誤判定して「好き」とマッチングしなくなるので、語彙追加が必要な場合は、MeCabのユーザー辞書に随時追加が良さそうです。

3. osetiの使い方

サンプルコードを「oseti.pyが含まれるosetiフォルダ」と同じフォルダに置いて実行します。

・サンプルコード.pyoseti
 ・oseti.py
 ・dic
  ・pn_noun.json
  ・pn_wago.json

◎ ポジネガのスコア
「oseti」でポジネガのスコアを取得するコードは、次のとおりです。

import oseti

analyzer = oseti.Analyzer()
print(analyzer.analyze('私はとっても幸せ'))
print(analyzer.analyze('私はとっても不幸'))
[1.0]
[-1.0]

◎ ポジネガの数
「oseti」でポジネガの数を取得するコードは、次のとおりです。

import oseti

analyzer = oseti.Analyzer()
print(analyzer.count_polarity('私はとっても幸せ'))
print(analyzer.count_polarity('私はとっても不幸'))
[{'positive': 1, 'negative': 0}]
[{'positive': 0, 'negative': 1}]

◎ ポジネガの単語とスコア
「oseti」でポジネガの単語とスコアを取得するコードは、次のとおりです。

import oseti

analyzer = oseti.Analyzer()
print(analyzer.analyze_detail('私はとっても幸せ'))
print(analyzer.analyze_detail('私はとっても不幸'))
[{'positive': ['幸せ'], 'negative': [], 'score': 1.0}]
[{'positive': [], 'negative': ['不幸'], 'score': -1.0}]

◎ 実験用コード
コンソールで文字入力して結果を確認するコードは、次のとおりです。

import oseti

# アナライザー
analyzer = oseti.Analyzer()

# 入力ループ (Ctrl-Cで終了)
while True:
    message = input("入力: ")
    print(analyzer.analyze_detail(message))
入力: このお菓子が美味しい
[{'positive': ['美味しい'], 'negative': [], 'score': 1.0}]
入力: この料理は美味しくない
[{'positive': [], 'negative': ['美味しい-NEGATION'], 'score': -1.0}]

4. 辞書とコンバータのチューニング

希望の結果が得られない場合は、辞書とコンバータをチューニングすることで対応できます。

(1) 「oseti/etc」にあるコンバータ「make_noun_json.py」「make_wago_json.py」を「oseti/oseti/dic」にコピー。

(2) 東北大学の乾・鈴木研究室の「日本語評価極性辞書」を取得し、「oseti/oseti/dic」に配置。

・pn.csv.m3.120408.trim : 名詞のネガポジ辞書。
・wago.121808.pn : 動詞・形容詞のネガポジ辞書。

(3) 辞書とコンバータをチューニング。

(4) 「oseti/oseti/dic」に移動し、以下のコマンドを実行。
「pn_noun.json」と「pn_wago.json」が更新されます。

$ python make_noun_json.py
$ python make_wago_json.py

5. 辞書とコンバータのチューニングの例

5-1. 名詞 + ある・ない

自信がない」はネガティブに感じますが、デフォルト結果はポジティブです。

入力: 自信がない
[{'positive': ['自信', '自信 が'], 'negative': ['自信 が ない'], 'score': 0.3333333333333333}]

これは、「pn_wago.json」で「ある」が消されるため、「自信」「自信 が」で2ポジティブとカウントされ、ポジティブ数が増えてるためです。

◎ カスタマイズ
動詞・形容詞のネガポジ辞書の「ある・ない」を削除して、名詞のネガポジ辞書に判定を任せると良さそうです。

【make_wago_json.py

            word = word.replace(' ある', '')
            
            ↓
            
            if word.endswith(' ある') or word.endswith(' ない'):
                continue

◎ 結果
この変更で、91の語彙が名詞のみで感情分析するようになります。

5-2. ?p?n

機嫌が良い」はポジティブに感じますが、デフォルト結果はニュートラルです。

入力: 機嫌が良い
[{'positive': ['良い'], 'negative': ['機嫌'], 'score': 0.0}]

これは、名詞のネガポジ辞書に「?p?n」があり、デフォルトでは、これをネガティブと処理しているのが原因になります。

◎ カスタマイズ
名詞のネガポジ辞書の「?p?n」を「e」と同じくニュートラル判定にすると良さそうです。

【make_wago_json.py

        if polarity == 'e':
            continueif polarity == 'e' or polarity == '?p?n':
            continue

◎ 結果
この変更で、35の語彙がニュートラルとなります。

この記事が気に入ったらサポートをしてみませんか?