Python入門トップページ


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

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

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

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

読みをカタカナに変換した辞書でスコアを取得する

「単語感情極性対応表を確認する」で見た通り,単語感情極性表では読みにひらがなとカタカナが混在していました.一方で,MeCabで形態素解析を実行して得られる読みの情報はカタカナで統一されています.したがって,単語感情極性表において読みの情報をすべてカタカナに変換することを考えます.なお,カタカナをひらがなに変換する方法についてはこちらを参照してください.


import MeCab as mc
import pandas as pd
import numpy as np
import os

def hiragana2katakana(text):
    """
    ひらがなをカタカナに変換
    """

    # カタカナの Unicode範囲 0x30A1 (ァ) から 0x30F6 (ヶ)
    # ひらがなの Unicode範囲 0x3041 (ぁ) から 0x3096 (ゖ)
    katakana_start = ord("ァ")
    hiragana_start = ord("ぁ")

    # ひらがなをカタカナに変換するための辞書
    hiragana2katakana_map = {
        chr(i): chr(i - hiragana_start + katakana_start) for i in range(hiragana_start, ord("ゖ") + 1)
    }
    # 次を有効にすると辞書の内容を確認できます
    # print(hiragana2katakana_map)

    # str.translate を使用して変換
    return text.translate(str.maketrans(hiragana2katakana_map))


def get_lemma_score(dic_lemma, lemma):
    """
    原型で検索して感情スコアを返す
    """
    results = dic_lemma.get(lemma, {})
    if len(results) == 1:
        return next(iter(results.values()))
    elif len(results) > 1:
        # 「ホーム」などは複数の読みで登録されている
        return results.get(lemma, np.nan)
    return np.nan


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 = get_lemma_score(dic_lemma, lemma)
            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"])

# 読みをカタカナに変換
df_pn['reading'] = [hiragana2katakana(v) for v in df_pn['reading'].tolist()]

# データフレームを辞書に変換
dic_lemma = df_pn.groupby('lemma').apply(lambda x: dict(zip(x['reading'], x['score']))).to_dict()

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

# 辞書からデータフレームを作成
df = pd.DataFrame(results)
df
2024-sentiment-17

このページのプログラムだけでは,読みをカタカナに変換した効果は一切ありません.次のページでは「ホームラン」や「大和撫子」もカタカナに変換した読みを利用して感情極性値が取得できるようにします.

目次に戻る