「見出し語の重複を無視して作成した辞書で感情を分析する」では見出し語の重複を無視していたために「ホーム」の感情極性値が「ホームヘルパー」の感情極性値である -0.408128 となるような誤った分析結果になっていました.ここでは「見出し語の重複を考慮した辞書を作成する」の辞書を用いることで,正しい結果 -0.263255 が得られることを確認します.
import MeCab as mc
import pandas as pd
import numpy as np
import os
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:
# 「ホーム」などは複数の読みで登録されている
# print(f"{results}")
score = results.get(lemma, np.nan)
return score
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"])
# データフレームを辞書に変換
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
上の結果を確認すると「ホーム」の「score」は -0.263255 になっています.この値が正しいことは次の結果と照らし合わせて確認してください.
df_pn[df_pn.lemma == "ホーム"]