Python入門トップページ


単語感情極性対応表を用いた感情分析:目次

  1. MeCab で形態素解析を実行する
  2. 単語感情極性対応表を確認する
  3. 見出し語の重複を無視して作成した辞書で感情を分析する
  4. 見出し語の重複を考慮した辞書を作成する
  5. 見出し語の重複を考慮して作成した辞書で感情を分析する
  6. 読みをカタカナに変換した辞書でスコアを取得する
  7. 見出し語と読みの情報を利用して感情を分析する

Python で感情分析をしてみよう

単語感情極性対応表を用いた感情分析

見出し語の重複を無視して作成した辞書で感情を分析する

前のページでは見出し語の重複を無視して,とりあえず見出し語から単語感情極性実数値を得るための辞書を作成しました.この辞書では「ホーム」や「大和」などについては正しい値を取得できないことは明らかですが,一旦単語ごとに環境極性実数値を得るコードを記述してみましょう.


import MeCab as mc
import pandas as pd
import numpy as np
import os
# from pprint import pprint

def get_sentiment_score(dic_lemma, text):
    """
    形態素解析した後に,単語感情極性実数値を取得し,辞書のリスト形式で返す
    """
    t = mc.Tagger()  # for Windows
    # t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/ipadic')  # for macOS
    node = t.parseToNode(text)
    words = []
    while(node):
        if node.surface != "":  # ヘッダとフッタを除外
            pos = node.feature.split(",")[0] # pos (part_of_speech) 品詞
            lemma = node.feature.split(",")[6]  # lemma 原型
            reading = node.feature.split(",")[7] # reading 読み
            score = dic_lemma.get(lemma, np.nan)  ## 原型からスコアを参照していることに注意
            # print(node.surface, lemma, reading, pos, score)
            w = {
                'surface': node.surface, # 表層形
                'lemma': lemma,
                'reading': reading,
                'pos': pos,
                'score': score
            }
            words.append(w)
        node = node.next
        if node is None:
            break
    return words

# 単語感情極性対応表
path_dic = os.path.sep.join(['dic', 'pn_ja.dic'])
df_pn = pd.read_csv(path_dic, encoding="sjis", sep=":", names=["lemma", "reading", "pos", "score"])

# 辞書の作成
dic_lemma = df_pn.set_index('lemma')['score'].to_dict()

# 辞書の表示
# print(dic_lemma)

sent = "本日ホームで開催された試合ではエースが良く投げて大和撫子のホームランで勝利した"
results = get_sentiment_score(dic_lemma, sent)
print(results)

# 辞書からデータフレームを作成
df = pd.DataFrame(results)
df
[
  {'surface': '本日', 'lemma': '本日', 'reading': 'ホンジツ', 'pos': '名詞', 'score': 0.602377},
  {'surface': 'ホーム', 'lemma': 'ホーム', 'reading': 'ホーム', 'pos': '名詞', 'score': -0.408128},
  {'surface': 'で', 'lemma': 'で', 'reading': 'デ', 'pos': '助詞', 'score': nan},
  {'surface': '開催', 'lemma': '開催', 'reading': 'カイサイ', 'pos': '名詞', 'score': -0.223521},
  {'surface': 'さ', 'lemma': 'する', 'reading': 'サ', 'pos': '動詞', 'score': nan},
  {'surface': 'れ', 'lemma': 'れる', 'reading': 'レ', 'pos': '動詞', 'score': nan},
  {'surface': 'た', 'lemma': 'た', 'reading': 'タ', 'pos': '助動詞', 'score': nan},
  {'surface': '試合', 'lemma': '試合', 'reading': 'シアイ', 'pos': '名詞', 'score': -0.549245},
  {'surface': 'で', 'lemma': 'で', 'reading': 'デ', 'pos': '助詞', 'score': nan},
  {'surface': 'は', 'lemma': 'は', 'reading': 'ハ', 'pos': '助詞', 'score': nan},
  {'surface': 'エース', 'lemma': 'エース', 'reading': 'エース', 'pos': '名詞', 'score': -0.180239},
  {'surface': 'が', 'lemma': 'が', 'reading': 'ガ', 'pos': '助詞', 'score': nan},
  {'surface': '良く', 'lemma': '良い', 'reading': 'ヨク', 'pos': '形容詞', 'score': 0.999995},
  {'surface': '投げ', 'lemma': '投げる', 'reading': 'ナゲ', 'pos': '動詞', 'score': -0.882987},
  {'surface': 'て', 'lemma': 'て', 'reading': 'テ', 'pos': '助詞', 'score': nan},
  {'surface': '大和撫子', 'lemma': '大和撫子', 'reading': 'ヤマトナデシコ', 'pos': '名詞', 'score': nan},
  {'surface': 'の', 'lemma': 'の', 'reading': 'ノ', 'pos': '助詞', 'score': nan},
  {'surface': 'ホームラン', 'lemma': 'ホームラン', 'reading': 'ホームラン', 'pos': '名詞', 'score': nan},
  {'surface': 'で', 'lemma': 'で', 'reading': 'デ', 'pos': '助詞', 'score': nan},
  {'surface': '勝利', 'lemma': '勝利', 'reading': 'ショウリ', 'pos': '名詞', 'score': 0.640964},
  {'surface': 'し', 'lemma': 'する', 'reading': 'シ', 'pos': '動詞', 'score': nan},
  {'surface': 'た', 'lemma': 'た', 'reading': 'タ', 'pos': '助動詞', 'score': nan}
]
2024-sentiment-11

上の結果を確認すると名詞の大半と「投げる」という動詞について感情極性値が得られていることがわかります.ただし,「ホーム」については「ホームヘルパー」の感情極性値を取得してしまっています.また,「大和撫子」と「ホームラン」については感情極性値を取得できていません.


dic_lemma['ホーム']
-0.408128


df_pn[df_pn.lemma == "ホーム"]
2024-sentiment-12

次のページ以降では見出し語の重複を考慮した辞書を作成することで,「ホーム」について正しい感情極性値が取得でき,見出し語に存在しない「ホームラン」,「大和撫子」などについても読みの情報から値が得られるように作業を進めます.

目次に戻る