Python入門トップページ


日本語評価極性辞書(名詞編)を用いた感情分析:目次

  1. MeCab で形態素解析を実行する
  2. 日本語評価極性辞書(名詞編)を確認する
  3. 辞書形式のデータを作る
  4. 日本語評価極性辞書(名詞編)を用いて感情分析を実行する

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

日本語評価極性辞書(名詞編)を用いた感情分析

辞書形式のデータを作る

前のページ日本語評価極性辞書(名詞編)をデータフレームに読み込むことができました.ここでは,データフレームから Python の辞書形式のデータに変換すること考えます.

まず日本語評価極性辞書をデータフレームに読み込み,見出しをを半角文字に正規化します.前のページで説明した作業は次の僅かなコードにまとめることができます.


import pandas as pd
import numpy as np
import os
import unicodedata

# 日本語評価極性辞書(名詞編)
path_dic = os.path.sep.join(['dic', 'pn.csv.m3.120408.trim'])
df_pncsv = pd.read_csv(path_dic, sep="\t", names=["term", "sentiment", "semantic_category"])
df_pncsv['term'] = [unicodedata.normalize('NFKC', t) for t in df_pncsv['term'].tolist()] # 内包表記を使って半角文字に正規化する
df_pncsv
2024-sentiment-30

見出し語 (term) をキーに感情 (sentiment) を値にもつ Python の辞書データ形式に変換します.なお,見出し語に4件の重複があったことから13,310件に減少していることに注目してください.


dic_term = df_pncsv.set_index('term')['sentiment'].to_dict()
len(dic_term)
13310

辞書形式のデータを表示してみます.(非常に大きな結果が表示されるので,実行には注意してください.)


print(dic_term)
{
  '2,3日': 'e', '10%': 'e', '100%': 'e', '25%': 'e',
...(中略)...
  '1位': 'p', '1割': 'e', '1時間以上': 'e', '1時間以内': 'e',
...(中略)...
  'あいさつ': 'e', 'あいだ': 'e', 'あいつら': 'e',
...(中略)...
  '魑魅魍魎': 'n', '鮑': 'e', '鹹味': 'e', '麒麟': 'e'
}

辞書形式のデータから「魑魅魍魎」の感情を取得してみます.


print(dic_term["魑魅魍魎"])
n

「あいうえお」のようにキーが存在しない場合はエラーが表示されてプログラムの動作が停止してしまいます.


print(dic_term["あいうえお"])
---------------------------------------------
KeyError   Traceback (most recent call last)
Cell In[11], line 1
----> 1 print(dic_term["あいうえお"])

KeyError: 'あいうえお'

こうした問題に対処するには辞書の get() を利用するとよいでしょう.次のように書くことでキーが存在する場合にはその感情が取得でき,存在しない場合には欠損値として取り扱うことができるようになります.


print(dic_term.get("魑魅魍魎", np.nan))
n

print(dic_term.get("あいうえお", np.nan))
nan

前のページで見たとおり,「規律」「信用」「帳消し」「白濁」という見出し語が重複して登録されていました.詳細は今回無視しますが,「規律」はポジティブ,「白濁」はニュートラルとして取り扱われていることを確認しておきます.


print(dic_term.get("規律", np.nan))
print(dic_term.get("信用", np.nan))
print(dic_term.get("帳消し", np.nan))
print(dic_term.get("白濁", np.nan))
p
p
p
e

もしも「p」「e」「n」という3種類の感情項目だけで分析を行いたい場合には次のコードを利用するとよいでしょう.


dic_term_pen = df_pncsv[(df_pncsv.sentiment=="p") |
  (df_pncsv.sentiment=="e") |
  (df_pncsv.sentiment=="n")
].set_index('term')['sentiment'].to_dict()
len(dic_term_pen)
13261

ここまでの作業で感情分析のための準備ができました.次のページでは実際に感情分析を実行してみましょう.

目次に戻る