Python入門トップページ


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

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

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

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

MeCab で形態素解析を実行する

日本語の文章から感情分析を行うためには,まず文章を単語(厳密には形態素)に分割する作業,つまり形態素解析が必要です.ここでは,MeCab を利用して形態素解析を行うことにします.あらかじめ,このページを参照して MeCab を利用できるようにしてください.

MeCab のインストールができたら Python で形態素解析を実行します.ここでは「本日ホームで開催された試合ではエースが良く投げて大和撫子のホームランで勝利した」という文を形態素解析してみます.


import MeCab as mc

t = mc.Tagger()  # for Windows
# t = mc.Tagger('-r /dev/null -d /opt/homebrew/lib/mecab/dic/ipadic')  # for macOS
sent = "本日ホームで開催された試合ではエースが良く投げて大和撫子のホームランで勝利した"
print(t.parse(sent))
本日	名詞,副詞可能,*,*,*,*,本日,ホンジツ,ホンジツ
ホーム	名詞,一般,*,*,*,*,ホーム,ホーム,ホーム
で	助詞,格助詞,一般,*,*,*,で,デ,デ
開催	名詞,サ変接続,*,*,*,*,開催,カイサイ,カイサイ
さ	動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ
れ	動詞,接尾,*,*,一段,連用形,れる,レ,レ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
試合	名詞,サ変接続,*,*,*,*,試合,シアイ,シアイ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
エース	名詞,一般,*,*,*,*,エース,エース,エース
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
良く	形容詞,自立,*,*,形容詞・アウオ段,連用テ接続,良い,ヨク,ヨク
投げ	動詞,自立,*,*,一段,連用形,投げる,ナゲ,ナゲ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
大和撫子	名詞,一般,*,*,*,*,大和撫子,ヤマトナデシコ,ヤマトナデシコ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ホームラン	名詞,一般,*,*,*,*,ホームラン,ホームラン,ホームラン
で	助詞,格助詞,一般,*,*,*,で,デ,デ
勝利	名詞,サ変接続,*,*,*,*,勝利,ショウリ,ショーリ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
EOS

形態素解析の実行ができることを確認したら,解析結果から表層形 (surface),原型 (lemma),読み (reading),品詞 (pos: part_of_speech) を辞書形式として,すべてをリスト化した結果を返す関数 mecab_analysis() を作成してみます.


import MeCab as mc
import pandas as pd
from pprint import pprint

def mecab_analysis(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 読み
            w = {
                'surface': node.surface, # 表層形
                'lemma': lemma,
                'reading': reading,
                'pos': pos
            }
            words.append(w)
        node = node.next
        if node is None:
            break
    return words

sent = "本日ホームで開催された試合ではエースが良く投げて大和撫子のホームランで勝利した"
results = mecab_analysis(sent)
pprint(results)
[{'lemma': '本日', 'pos': '名詞', 'reading': 'ホンジツ', 'surface': '本日'},
 {'lemma': 'ホーム', 'pos': '名詞', 'reading': 'ホーム', 'surface': 'ホーム'},
 {'lemma': 'で', 'pos': '助詞', 'reading': 'デ', 'surface': 'で'},
 {'lemma': '開催', 'pos': '名詞', 'reading': 'カイサイ', 'surface': '開催'},
 {'lemma': 'する', 'pos': '動詞', 'reading': 'サ', 'surface': 'さ'},
 {'lemma': 'れる', 'pos': '動詞', 'reading': 'レ', 'surface': 'れ'},
 {'lemma': 'た', 'pos': '助動詞', 'reading': 'タ', 'surface': 'た'},
 {'lemma': '試合', 'pos': '名詞', 'reading': 'シアイ', 'surface': '試合'},
 {'lemma': 'で', 'pos': '助詞', 'reading': 'デ', 'surface': 'で'},
 {'lemma': 'は', 'pos': '助詞', 'reading': 'ハ', 'surface': 'は'},
 {'lemma': 'エース', 'pos': '名詞', 'reading': 'エース', 'surface': 'エース'},
 {'lemma': 'が', 'pos': '助詞', 'reading': 'ガ', 'surface': 'が'},
 {'lemma': '良い', 'pos': '形容詞', 'reading': 'ヨク', 'surface': '良く'},
 {'lemma': '投げる', 'pos': '動詞', 'reading': 'ナゲ', 'surface': '投げ'},
 {'lemma': 'て', 'pos': '助詞', 'reading': 'テ', 'surface': 'て'},
 {'lemma': '大和撫子', 'pos': '名詞', 'reading': 'ヤマトナデシコ', 'surface': '大和撫子'},
 {'lemma': 'の', 'pos': '助詞', 'reading': 'ノ', 'surface': 'の'},
 {'lemma': 'ホームラン', 'pos': '名詞', 'reading': 'ホームラン', 'surface': 'ホームラン'},
 {'lemma': 'で', 'pos': '助詞', 'reading': 'デ', 'surface': 'で'},
 {'lemma': '勝利', 'pos': '名詞', 'reading': 'ショウリ', 'surface': '勝利'},
 {'lemma': 'する', 'pos': '動詞', 'reading': 'シ', 'surface': 'し'},
 {'lemma': 'た', 'pos': '助動詞', 'reading': 'タ', 'surface': 'た'}]

目次に戻る