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 | 。 | 。 | 。 |
めでたしめでたし。
注意点としては、あらゆる環境でこれが動くことは確認していない。
もし「こういうケースでバグる」などあったらコメントに書いて欲しい。
参考
-
MeCab辞書について | Yuta Hayashibe
- カラム名の参考にした
-
PythonでのMeCabを速くするtips - Qiita
-
parseToNode
は遅いらしいのでparse
を使うことにした - この記事のように並列処理を実装してみてもいいかもしれない
-
Author And Source
この問題について(MeCab の結果を Pandas DataFrame として得る), 我々は、より多くの情報をここで見つけました https://qiita.com/hoto17296/items/97c7ec64923625addf01著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .