Edited at

MeCab の結果を Pandas DataFrame として得る

近年の自然言語処理といえば SentencePiece でバラして BERT にドーン!らしいが (?)、品詞情報を用いた素朴な自然言語処理ではいまだに MeCab などの従来の形態素解析器は便利なものである。

その MeCab について、形態素解析した結果を Pandas の DataFrame として得たいと思ったものの意外と面倒臭かったので、ここにメモしておく。

前提として、MeCab と mecab-python は入っているものとする。

また、辞書は ipadic 形式のものを用いる前提。(この例では mecab-ipadic-NEologd を利用している)

import MeCab

import pandas as pd

class CustomMeCabTagger(MeCab.Tagger):

COLUMNS = ['表層形', '品詞', '品詞細分類1', '品詞細分類2', '品詞細分類3', '活用型', '活用形', '原形', '読み', '発音']

def parseToDataFrame(self, text: str) -> pd.DataFrame:
"""テキストを parse した結果を Pandas DataFrame として返す"""
results = []
for line in self.parse(text).split('\n'):
if line == 'EOS':
break
surface, feature = line.split('\t')
feature = [None if f == '*' else f for f in feature.split(',')]
results.append([surface, *feature])
return pd.DataFrame(results, columns=type(self).COLUMNS)

まずこういう MeCab.Tagger を継承したクラスを作っておいて、使うときはこうじゃ。

tagger = CustomMeCabTagger()

tagger.parseToDataFrame('メロスは激怒した。')

表層形
品詞
品詞細分類1
品詞細分類2
品詞細分類3
活用型
活用形
原形
読み
発音

0
メロス
名詞
一般
None
None
None
None
None
None
None

1

助詞
係助詞
None
None
None
None


2
激怒
名詞
サ変接続
None
None
None
None
激怒
ゲキド
ゲキド

3

動詞
自立
None
None
サ変・スル
連用形
する

4

助動詞
None
None
None
特殊・タ
基本形


5

記号
句点
None
None
None
None


めでたしめでたし。

注意点としては、あらゆる環境でこれが動くことは確認していない。

もし「こういうケースでバグる」などあったらコメントに書いて欲しい。


参考