LoginSignup
14
16

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-10-15

近年の自然言語処理といえば 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

めでたしめでたし。

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

参考

14
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
16