pythonで利用可能な様々な形態素解析器(の一部)とその実行例

## この記事について

自然言語処理について勉強しながら、色々な形態素解析器に出会ったので、~~基本MeCabでいいじゃんと思いつつ~~最低限の実行例をまとめてみた。
MeCabのインストール方法とかはほかにも数多く記事があるので割愛します。

## MeCab
まずはみなさんおなじみのMeCab。
pythonでの実行例はこちら。

```.py
import MeCab
m = MeCab.Tagger("-Ochasen")
sentence = 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'

print(m.parse(sentence))
>>ある日 アルヒ ある日 名詞-一般      
>>の   ノ   の   助詞-連体化     
>>暮方  クレガタ    暮方  名詞-副詞可能    
>>の   ノ   の   助詞-連体化     
>>事   コト  事   名詞-非自立-一般      
>>で   デ   だ   助動詞 特殊・ダ    連用形
>>ある  アル  ある  助動詞 五段・ラ行アル 基本形
>>。   。   。   記号-句点      
>>一人  ヒトリ 一人  名詞-一般      
>>の   ノ   の   助詞-連体化     
>>下人  ゲニン 下人  名詞-一般      
>>が   ガ   が   助詞-格助詞-一般      
>>、   、   、   記号-読点      
>>羅生門 ラショウモン  羅生門 名詞-固有名詞-一般     
>>の   ノ   の   助詞-連体化     
>>下   シタ  下   名詞-一般      
>>で   デ   で   助詞-格助詞-一般      
>>雨   アメ  雨   名詞-一般      
>>やみ  ヤミ  やみ  名詞-一般      
>>を   ヲ   を   助詞-格助詞-一般      
>>待っ  マッ  待つ  動詞-自立   五段・タ行   連用タ接続
>>て   テ   て   助詞-接続助詞    
>>い   イ   いる  動詞-非自立  一段  連用形
>>た   タ   た   助動詞 特殊・タ    基本形
>>。   。   。   記号-句点      
>>EOS
```

## janome

pythonで実装されている形態素解析器。
pythonで実装が完結しているため、pipから一発でインストールが可能。
お手軽に形態素解析を試したいときは選択肢に上がるんじゃないでしょうか。

```.py
from janome.tokenizer import Tokenizer
t = Tokenizer()
s = 'ある日の暮方の事である。一人の下人が、羅生門の下で雨やみを待っていた。'

tokens = t.tokenize(s)
for token in tokens:
    print(token.surface, token.base_form, token.part_of_speech)
 
>>ある ある 連体詞,*,*,*
>>日 日 名詞,非自立,副詞可能,*
>>の の 助詞,連体化,*,*
>>暮方 暮方 名詞,副詞可能,*,*
>>の の 助詞,連体化,*,*
>>事 事 名詞,非自立,一般,*
>>で だ 助動詞,*,*,*
>>ある ある 助動詞,*,*,*
>>。 。 記号,句点,*,*
>>一 一 名詞,数,*,*
>>人 人 名詞,接尾,助数詞,*
>>の の 助詞,連体化,*,*
>>下人 下人 名詞,一般,*,*
>>が が 助詞,格助詞,一般,*
>>、 、 記号,読点,*,*
>>羅生門 羅生門 名詞,固有名詞,一般,*
>>の の 助詞,連体化,*,*
>>下 下 名詞,一般,*,*
>>で で 助詞,格助詞,一般,*
>>雨 雨 名詞,一般,*,*
>>やみ やみ 名詞,一般,*,*
>>を を 助詞,格助詞,一般,*
>>待っ 待つ 動詞,自立,*,*
>>て て 助詞,接続助詞,*,*
>>い いる 動詞,非自立,*,*
>>た た 助動詞,*,*,*
>>。 。 記号,句点,*,*
```

## Sudachi

ワークスアプリケーションズによりjavaで開発されている形態素解析器。
最大の特徴は、形態素解析の際に、単語を抽出する長さをモードを切り替えながら実行できるところ。
Aが最短、Bが中間、Cが最長マッチといった具合。
ただし、モードCにしても、少し長い新語を拾えるかというとそうではないようです(どちらかというと辞書依存だとは思いますが)。

```.py
import json
from sudachipy import tokenizer
from sudachipy import dictionary
from sudachipy import config
 
# 辞書の設定
with open(config.SETTINGFILE, "r", encoding="utf-8") as f:
    settings = json.load(f)
tokenizer_obj = dictionary.Dictionary(settings).create()

# mode A, B, Cを比較してみる
mode = tokenizer.Tokenizer.SplitMode.A
[m.surface() for m in tokenizer_obj.tokenize(mode, "医薬品安全管理責任者")]
# => ['医薬', '品', '安全', '管理', '責任', '者']

mode = tokenizer.Tokenizer.SplitMode.B
[m.surface() for m in tokenizer_obj.tokenize(mode, "医薬品安全管理責任者")]
# => ['医薬品', '安全', '管理', '責任者'] 
 
mode = tokenizer.Tokenizer.SplitMode.C
[m.surface() for m in tokenizer_obj.tokenize(mode, "医薬品安全管理責任者")]
# => ['医薬品安全管理責任者']

# mode Cで検出される単語を確かめる
mode = tokenizer.Tokenizer.SplitMode.C
print([m.surface() for m in tokenizer_obj.tokenize(mode, "藤田ニコル")])
>>['藤田ニコル']
print([m.surface() for m in tokenizer_obj.tokenize(mode, "トレンディエンジェル")]) # 失敗(MeCab + neologdで一単語として検出されることは確認済み)
>>['トレンディ', 'エンジェル']
print([m.surface() for m in tokenizer_obj.tokenize(mode, "キラキラネーム")])
>>['キラキラネーム']
print([m.surface() for m in tokenizer_obj.tokenize(mode, "ガクトコイン")]) # 失敗(MeCab + neologdで一単語として検出されることは確認済み)
>>['ガクト', 'コイン']
print([m.surface() for m in tokenizer_obj.tokenize(mode, "ゲスの極み乙女")])
>>['ゲスの極み乙女']
print([m.surface() for m in tokenizer_obj.tokenize(mode, "南キャン")]) # 失敗っぽい(MeCab + neologdで一単語として検出されることは確認済み)
>>['南', 'キャン']
```