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

めでたしめでたし。

注意点としては、あらゆる環境でこれが動くことは確認していない。
もし「こういうケースでバグる」などあったらコメントに書いて欲しい。

参考