MeCabの出力形式を整理して、Pandasで扱えるようにした

# 概要
[MeCab](https://github.com/taku910/mecab)の返り値の意味が分からなかったので調査してまとめてみました.その上で、[Pandas](https://pandas.pydata.org/)にその結果を移して簡便に処理するためのコードを書いて[GitHub](https://github.com/smn-ailab/hasoya-qiita/blob/master/mecab_pandas/mecab_pandas.py)にて公開しました.

# 実行環境
- Python: 3.6.5
- MeCab: 0.996
- Neologd: 2018/5/8現在の最新版
- mecab-python3: 0.7
- pandas: 0.22.0

# 困ったところ
MeCabで「スプラトゥーンでウデマエXにならなくて悔しい。」という文字列を入力すると以下の結果が返ってくる。

```
スプラトゥーン	名詞,固有名詞,一般,*,*,*,Splatoon,スプラトゥーン,スプラトゥーン
で	助詞,格助詞,一般,*,*,*,で,デ,デ
ウデマエ	名詞,一般,*,*,*,*,腕前,ウデマエ,ウデマエ
X	名詞,固有名詞,一般,*,*,*,X,エックス,エックス
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
なら	動詞,自立,*,*,五段・ラ行,未然形,なる,ナラ,ナラ
なく	助動詞,*,*,*,特殊・ナイ,連用テ接続,ない,ナク,ナク
て	助詞,接続助詞,*,*,*,*,て,テ,テ
悔しい	形容詞,自立,*,*,形容詞・イ段,基本形,悔しい,クヤシイ,クヤシイ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

タブ区切り以降のカンマ区切りの要素のそれぞれの意味がよく分からない…「MeCab 返り値」とか「MeCab 結果 見方」とか「MeCab フォーマット」とかぐぐっても出てこない…

# 返り値のフォーマット
[CaboChaの記事](https://qiita.com/nezuq/items/f481f07fc0576b38e81d#2%E8%A1%8C%E7%9B%AE)が参考になりました。そこから類推するとMeCabの形式は以下の形です。

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

CaboChaの出力とは活用型と活用形の順番が逆になっていることに注意です。

# 応用例
## 活用の解決
同じ単語でも活用形が異なると違う文字列になってしまい、分析内容によっては不都合が生じます。例えば、文章中にどのようなキーワードが含まれているかを抽出するタスクです。以下の文章だと、「持ち」と「持つ」が異なる単語になり、期待した結果と異なる要因になりえます。

```
コントローラーの持ち方を変えて、ガチホコを持ったら勝てるようになった。
コントローラー	名詞,一般,*,*,*,*,コントローラー,コントローラー,コントローラー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
持ち	動詞,自立,*,*,五段・タ行,連用形,持つ,モチ,モチ
方	名詞,接尾,特殊,*,*,*,方,カタ,カタ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
変え	動詞,自立,*,*,一段,連用形,変える,カエ,カエ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
ガチホコ	名詞,固有名詞,一般,*,*,*,ガチホコ,ガチホコ,ガチホコ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
持っ	動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
たら	助動詞,*,*,*,特殊・タ,仮定形,た,タラ,タラ
勝てる	動詞,自立,*,*,一段,基本形,勝てる,カテル,カテル
よう	名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
なっ	動詞,自立,*,*,五段・ラ行,連用タ接続,なる,ナッ,ナッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
```

ここで、「原形」の要素を見に行けば、共に「持つ」に変換されているので、活用で頭を悩ませる必要はありません。

## 読みや発音に注目した解析
日本語は同じ読みや発音でも、ひらがな・カタカナ・漢字と異なる表記手法があります。発話したときにどのようなリズム感になるのかを解析したいなど(例えば詩の良し悪し判定とか)のタスクでは、この日本語の仕様は不都合です。

```
サンフランで土師さんが箸を持って橋の端を渡る
サンフラン	名詞,一般,*,*,*,*,*
で	助詞,格助詞,一般,*,*,*,で,デ,デ
土師	名詞,固有名詞,人名,姓,*,*,土師,ハジ,ハジ
さん	名詞,接尾,人名,*,*,*,さん,サン,サン
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
箸	名詞,一般,*,*,*,*,箸,ハシ,ハシ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
持っ	動詞,自立,*,*,五段・タ行,連用タ接続,持つ,モッ,モッ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
橋	名詞,一般,*,*,*,*,橋,ハシ,ハシ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
端	名詞,一般,*,*,*,*,端,ハジ,ハジ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡る	動詞,自立,*,*,五段・ラ行,基本形,渡る,ワタル,ワタル
EOS
```

「読み」や「発音」の要素を見に行けば、漢字をカタカナに変換してくれるので、処理が非常に楽になります。元々カタカナの場合は「\*」になってしまうので、注意です。その際は表層形を代わりに持って来れば良いです。

# Pandasで扱えるようにしました
[GitHub](https://github.com/smn-ailab/hasoya-qiita/blob/master/mecab_pandas/mecab_pandas.py)にサンプルコードを置いたので、よろしければ使ってみてください。下のように使えます！

```python
Python 3.6.5 |Anaconda custom (64-bit)| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mecab_pandas import MeCabParser
>>> mp = MeCabParser()
>>> mp.parse("ケルビン強化されたと思ったけど、やっぱスパッタリー最強だわ。")
   surface_form word_class class_detail1 class_detail2 class_detail3  \
0          ケルビン         名詞            一般          None          None   
1            強化         名詞          サ変接続          None          None   
2             さ         動詞            自立          None          None   
3             れ         動詞            接尾          None          None   
4             た        助動詞          None          None          None   
5             と         助詞           格助詞            引用          None   
6            思っ         動詞            自立          None          None   
7             た        助動詞          None          None          None   
8            けど         助詞          接続助詞          None          None   
9             、         記号            読点          None          None   
10          やっぱ         副詞            一般          None          None   
11       スパッタリー         名詞            一般          None          None   
12           最強         名詞            一般          None          None   
13            だ        助動詞          None          None          None   
14            わ         助詞           終助詞          None          None   
15            。         記号            句点          None          None   

   conjugational_type conjugational_form original_form katakana pronunciation  
0                None               None          ケルビン     ケルビン          ケルビン  
1                None               None            強化     キョウカ          キョーカ  
2               サ変・スル             未然レル接続            する        サ             サ  
3                  一段                連用形            れる        レ             レ  
4                特殊・タ                基本形             た        タ             タ  
5                None               None             と        ト             ト  
6            五段・ワ行促音便              連用タ接続            思う      オモッ           オモッ  
7                特殊・タ                基本形             た        タ             タ  
8                None               None            けど       ケド            ケド  
9                None               None             、        、             、  
10               None               None           やっぱ      ヤッパ           ヤッパ  
11               None               None          None     None          None  
12               None               None            最強    サイキョウ         サイキョー  
13               特殊・ダ                基本形             だ        ダ             ダ  
14               None               None             わ        ワ             ワ  
15               None               None             。        。             。
```

# あとがき
コード書いたりするのは簡単でしたが、結果のフォーマットを探すのにやたらと苦労しました:sweat:これはぼくのぐぐり力不足なんでしょうか:thinking: 基本、普段プログラミングに関する情報は英語 :flag_us: リソースを活用しているので、やり方間違っている説がありますね。「ここにあるよ」みたいな情報があれば是非コメントください！ではでは:wave: