日本語の文章から感情分析を行うためには,まず文章を単語(厳密には形態素)に分割する作業,つまり形態素解析が必要です.ここでは,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': 'た'}]