形態素を解析する
英語は文章を作る際に単語と単語の間に空白があるため,区切れ目が分かりやすい.
一方,日本語のような言語はそういった空白がないため文章を処理する際には形態素解析という単語に分割する作業が必要になる.
今回はその形態素解析を楽に行うことができる.
import MeCab
import unidic_lite
def rich_morphological_analysis(text: str):
"""
unidic‑lite 辞書を利用して形態素解析を行い、各トークンの詳細情報を日本語のキーで抽出する関数です。
"""
# -r /dev/null を指定して空の mecabrc を利用し、辞書パスは unidic_lite.DICDIR を指定
tagger = MeCab.Tagger("-r /dev/null -d " + unidic_lite.DICDIR)
tagger.parse("") # 初回呼び出し(GC問題回避のため)
node = tagger.parseToNode(text)
tokens = []
while node:
# BOS/EOS ノードはスキップ
if node.stat in (MeCab.MECAB_BOS_NODE, MeCab.MECAB_EOS_NODE):
node = node.next
continue
# unidic の出力はカンマ区切りの文字列になっているので、それを分割して各情報を取得する
features = node.feature.split(",")
token_info = {
"表示形": node.surface,
"品詞": features[0] if len(features) > 0 else "",
"品詞細分類1": features[1] if len(features) > 1 else "",
"品詞細分類2": features[2] if len(features) > 2 else "",
"品詞細分類3": features[3] if len(features) > 3 else "",
# unidicの場合、原形がfeaturesの6番目にある(※環境により異なる場合あり)
"原形": features[6] if len(features) > 6 and features[6] != "*" else node.surface,
"読み": features[7] if len(features) > 7 else "",
"発音": features[8] if len(features) > 8 else ""
}
tokens.append(token_info)
node = node.next
return tokens
if __name__ == "__main__":
sample_text = "私は昨日、東京で美味しいラーメンを食べました。"
analysis_result = rich_morphological_analysis(sample_text)
for token in analysis_result:
print(token)
{‘表示形’: ‘私’, ‘品詞’: ‘代名詞’, ‘品詞細分類1’: ‘‘, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘*’, ‘原形’: ‘ワタクシ’, ‘読み’: ‘私-代名詞’, ‘発音’: ‘私’}
{‘表示形’: ‘は’, ‘品詞’: ‘助詞’, ‘品詞細分類1’: ‘係助詞’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ‘ハ’, ‘読み’: ‘は’, ‘発音’: ‘は’}
{‘表示形’: ‘昨日’, ‘品詞’: ‘名詞’, ‘品詞細分類1’: ‘普通名詞’, ‘品詞細分類2’: ‘副詞可能’, ‘品詞細分類3’: ‘*’, ‘原形’: ‘キノウ’, ‘読み’: ‘昨日’, ‘発音’: ‘昨日’}
{‘表示形’: ‘、’, ‘品詞’: ‘補助記号’, ‘品詞細分類1’: ‘読点’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ”, ‘読み’: ‘、’, ‘発音’: ‘、’}
{‘表示形’: ‘東京’, ‘品詞’: ‘名詞’, ‘品詞細分類1’: ‘固有名詞’, ‘品詞細分類2’: ‘地名’, ‘品詞細分類3’: ‘一般’, ‘原形’: ‘トウキョウ’, ‘読み’: ‘トウキョウ’, ‘発音’: ‘東京’}
{‘表示形’: ‘で’, ‘品詞’: ‘助詞’, ‘品詞細分類1’: ‘格助詞’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ‘デ’, ‘読み’: ‘で’, ‘発音’: ‘で’}
{‘表示形’: ‘美味しい’, ‘品詞’: ‘形容詞’, ‘品詞細分類1’: ‘一般’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ‘オイシイ’, ‘読み’: ‘美味しい’, ‘発音’: ‘美味しい’}
{‘表示形’: ‘ラーメン’, ‘品詞’: ‘名詞’, ‘品詞細分類1’: ‘普通名詞’, ‘品詞細分類2’: ‘一般’, ‘品詞細分類3’: ‘*’, ‘原形’: ‘ラーメン’, ‘読み’: ‘ラーメン-Rahmen’, ‘発音’: ‘ラーメン’}
{‘表示形’: ‘を’, ‘品詞’: ‘助詞’, ‘品詞細分類1’: ‘格助詞’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ‘ヲ’, ‘読み’: ‘を’, ‘発音’: ‘を’}
{‘表示形’: ‘食べ’, ‘品詞’: ‘動詞’, ‘品詞細分類1’: ‘一般’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ‘タベル’, ‘読み’: ‘食べる’, ‘発音’: ‘食べ’}
{‘表示形’: ‘まし’, ‘品詞’: ‘助動詞’, ‘品詞細分類1’: ‘‘, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘*’, ‘原形’: ‘マス’, ‘読み’: ‘ます’, ‘発音’: ‘まし’}
{‘表示形’: ‘た’, ‘品詞’: ‘助動詞’, ‘品詞細分類1’: ‘‘, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘*’, ‘原形’: ‘タ’, ‘読み’: ‘た’, ‘発音’: ‘た’}
{‘表示形’: ‘。’, ‘品詞’: ‘補助記号’, ‘品詞細分類1’: ‘句点’, ‘品詞細分類2’: ‘‘, ‘品詞細分類3’: ‘‘, ‘原形’: ”, ‘読み’: ‘。’, ‘発音’: ‘。’}