COTOHA APIとMeCabの比較

普段は仕事の合間を縫って、趣味でボードゲームのAI開発や自然言語処理を嗜んでいます。

色々ネタが溜まってきているので備忘も兼ねて少しずつQiitaに書いていこうと思います。

今回の記事では自然言語処理の中でも形態素解析に焦点を当て、最近NTTコミュニケーションズからリリースされたというCOTOHA APIと、形態素解析で有名なOSSであるMecabとの解析特徴の違いについて書こうと思います。



# 形態素解析

言語処理を経験されてる方には当たり前かもしれませんが、まずは基本から。
形態素解析とは、日本語や中国語のように文中に切れ目が存在しない文を、形態素と呼ばれる意味のある最小単位に分割する解析のことです。
例えば「すもももももももものうち」という文は「すもも/も/もも/も/もも/の/うち」のように分割することができます。
また、単に分割するだけでなく、名詞・動詞などの品詞情報や、表記ゆれ・活用を吸収した標準形、読み方など様々な情報を付与することも形態素解析に含まれます。
今回は形態素解析OSSの一つであるMeCabとCOTOHA APIの違いを実例を元に見ていきたいと思います。


## とりあえず解析してみる
先ほどの「すもももももももものうち」という文を解析した結果が以下になります。

### COTOHA API
※ Developer版を使用（Enterprise版は業界別辞書や個別カスタマイズ辞書が使用できるみたい）
※ COTOHA APIには形態素解析のみのAPIはないため、係り受けなどの構文情報は除去して表にまとめました。

| form | kana | lemma | pos | features | attributes |
|:---:|:---:|:---:|:---:|:---:|:---:|
|すもも|スモモ|李|名詞|-|-|
|も|モ|も|連用助詞|-|-|
|もも|モモ|桃|名詞|-|-|
|も|モ|も|連用助詞|-|-|
|もも|モモ|桃|名詞|-|-|
|の|ノ|の|格助詞|連体|-|
|うち|ウチ|内|名詞|連用|-|

### MeCab
※ ver. 0.996


|表層形|品詞|品詞細分類１|品詞細分類２|品詞細分類３|活用型|活用形|原形|読み|発音|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|すもも|名詞|一般|*|*|*|*|すもも|スモモ|スモモ|
|も|助詞|係助詞|*|*|*|*|も|モ|モ|
|もも|名詞|一般|*|*|*|*|もも|モモ|モモ|
|も|助詞|係助詞|*|*|*|*|も|モ|モ|
|もも|名詞|一般|*|*|*|*|もも|モモ|モモ|
|の|助詞|連体化|*|*|*|*|の|ノ|ノ|
|うち|名詞|非自立|副詞可能|*|*|*|うち|ウチ|ウチ|

どちらも表層形（form）、原形（lemma）、読み（kana）、品詞（pos）といった基本情報にfeaturesや品詞細分類など+αの情報が付与されます。以下が２つの解析器の出力対応表です。

||COTOHA API|MeCab|
|:---:|:---:|:---:|
|表層形|form|表層形|
|標準形|lemma|原形|
|品詞|pos＋feature|品詞＋細分類1~3|
|活用|feature|活用型・活用形|
|読み|kana|読み・発音|

基本的な情報はどちらも揃っているようです。COTOHA APIは、feature,attributesという出力があり、これらは[リファレンス](https://api.ce-cotoha.com/contents/index.html)にあまり詳しい記述がなかったのでいくつかの例を試したところ、featureにはどうやら活用形に該当する情報が付与されるようです。例えば「燃やす」という動詞は"S"、「切る」という動詞は"R"のようにどの行の５段活用なのかを表していると推測しました。また試しに不規則活用である「来る」を解析してみると"KURU"がfeatureとして表示されており、この結果から上の表の活用にfeatureを入れています。また「連体」「連用」など別の用法についての情報も付与されることがありました。こちらはMeCabの「副詞可能」に対応する情報のようですね。attributesにはたまに"NEG"というラベルが振られ、否定形の文にラベルが付与されるようです。

## 標準形の扱いが違う
上の解析結果を比較してみると、標準形の扱い方に差があることがわかります。具体的にはMeCabでは表層形を終止形に変形させているのに対して、COTOHA APIの方では、表層形がひらがなの形態素にも関わらず標準形は漢字になることがあるで、何かしらの正規化を行なっているようです。この正規化は、例えばキーワードマッチや機械学習の特徴量という点から考えると揺れが少なくなるので、便利な解析結果として使えるかもしれません。


## 品詞体系が違う

上の比較表からもわかるように、品詞の分類方法が少し異なるようです。


[こちらの記事](https://qiita.com/priancho/items/f633a9e99616b3fe451f)でも書かれていますが、OSSで有名な形態素解析器ではいくつかの異なる品詞体系が使われています。
例えばMeCabはIPAという階層化された品詞体系を採用していますが、Jumanなど別の形態素解析器ではIPAとは別の品詞体系が採用されています。
COTOHA APIではMeCabともJumanとも違う品詞体系（[こちら](https://api.ce-cotoha.com/contents/reference.html)を参照）が使用されています。
基本的な品詞区分は全てposで表示され、それ以外のサブ情報はfeaturesの項目に出力されます。品詞情報から例えば助詞を抽出することを考えると、MeCabは「品詞」を参照すれば良いのに対して、COTOHA APIは正規表現などを用いる必要があります。


## 形態素の切れ方が違う
「面接試験を受ける」という例について解析結果を比較してみると以下のようになります。
### COTOHA API
|form|kana|lemma|pos|features|attributes|
|:---:|:---:|:---:|:---:|:---:|:---:|
|面接試験|メンセツシケン|面接試験|名詞|動作|-|
|を|ヲ|を|格助詞|連用|-|
|受け|ウケ|受ける|動詞語幹|A|-|
|る|ル|る|動詞接尾辞|終止|-|
※Aは下一段活用や上一段活用を表すようです。

### MeCab

|表層形|品詞|品詞細分類１|品詞細分類２|品詞細分類３|活用型|活用形|原形|読み|発音|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|面接|名詞|サ変接続|*|*|*|*|面接|メンセツ|メンセツ|
|試験|名詞|サ変接続|*|*|*|*|試験|シケン|シケン|
|を|助詞|格助詞|一般|*|*|*|を|ヲ|ヲ|
|受ける|動詞|自立|*|*|一段|基本形|受ける|ウケル|ウケル|

どちらも４つの形態素に分割されていますが、分割のされ方は大きく異なります。

#### 複合名詞の扱い
「面接試験」というフレーズに着目してみると、COTOHA APIの方では「面接試験」という人つの名詞として処理されています。
一方MeCabの方では「面接」「試験」とそれぞれ２つの名詞に分割する結果となりました。
これは複合名詞の扱いの違いに起因するようです。
他の例も見てみると「内閣総理大臣」というフレーズはCOTOHA APIでは「内閣総理大臣」という１形態素として解析されるのに対して、MeCabでは「内閣」「総理」「大臣」というように３つの形態素に分割されます。
これらの特徴は、例えばキーワード抽出などの応用技術の点から見れば、COTOHA APIでは「内閣総理大臣」を１つのフレーズとして扱うことができるという点で上手く利用できそうです。
COTOHA APIでは他にも「東京タワー」のような固有表現は基本的に１つの形態素として扱う方針になっているようです。

#### 動詞の活用の扱い
次に「受ける」というフレーズに着目してみるとCOTOHA APIの方では「受け」「る」というように「受け」を動詞語幹、終止形の「る」を接尾辞として分割しています。
一方MeCabでは「受ける」を１語として処理しています。
では実際に動詞を活用させてみるとどのように解析結果は変わるのでしょうか。

以下に「表さない」（未然形）「表した」（連用形）「表す」（終止形）のそれぞれについて解析して見ました。

#### 〜表さない（未然形）〜
### COTOHA API
|form|kana|lemma|pos|features|attributes|
|:---:|:---:|:---:|:---:|:---:|:---:|
|表|アラワ|表す|動詞語幹|S|-|
|さ|サ|さ|動詞活用語尾|-|-|
|ない|ナイ|ない|動詞接尾辞|終止|NEG|

### MeCab
|表層形|品詞|品詞細分類１|品詞細分類２|品詞細分類３|活用型|活用形|原形|読み|発音|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|表さ|動詞|自立|*|*|五段・サ行|未然形|表す|アラワサ|アラワサ|
|ない|助動詞|*|*|*|特殊・ナイ|基本形|ない|ナイ|ナイ|

#### 〜表した（連用形）〜
### COTOHA API
|form|kana|lemma|pos|features|attributes|
|:---:|:---:|:---:|:---:|:---:|:---:|
|表|アラワ|表す|動詞語幹|S|-|
|し|シ|し|動詞活用語尾|-|-|
|た|タ|た|動詞接尾辞|終止|-|

### MeCab
|表層形|品詞|品詞細分類１|品詞細分類２|品詞細分類３|活用型|活用形|原形|読み|発音|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|表し|動詞|自立|*|*|五段・サ行|連用形|表す|アラワシ|アラワシ|
|た|助動詞|*|*|*|特殊・タ|基本形|た|タ|タ|

#### 〜表す（終止形）〜
### COTOHA API
|form|kana|lemma|pos|features|attributes|
|:---:|:---:|:---:|:---:|:---:|:---:|
|表|アラワ|表す|動詞語幹|S|-|
|す|ス|す|動詞接尾辞|終止|-|

### MeCab
|表層形|品詞|品詞細分類１|品詞細分類２|品詞細分類３|活用型|活用形|原形|読み|発音|
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
|表す|動詞|自立|*|*|五段・サ行|連用形|表す|アラワス|アラワス|

これらの解析例について、（１）動詞の活用語尾の処理と（２）助動詞の処理の２点から見てみます。

（１）まず動詞の活用語尾の処理についてですが、COTOHA APIでは動詞語幹と活用語尾を分割することで処理しています。
これにより動詞の心臓部分となる動詞語幹（今回の場合では「表す」）が活用により形態素に差分が出ないことが特徴となります。一方MeCabでは動詞の活用語尾の変化は動詞そのものと一緒に別の形態素として区別されて処理されています。つまり、未然形、連用形、終止形それぞれで自立動詞の形態素が差分を持っています。

（２）次に助動詞の処理についてですが、COTOHA APIでは動詞接尾辞として、MeCabでは助動詞として処理されています。
特に終止形の場合に両者には差があり、MeCabでは終止形の場合活用が起きないので動詞そのものの１形態素のみが出力されており、一方COTOHA APIでは終止形を強調するために動詞接尾辞として「す」を分割して動詞語幹と切り離して処理がされています。COTOHA APIでは動詞の活用は、動詞そのものを表す「動詞語幹」とそれを修飾する要素は全て「活用語尾」や「接尾辞」として切り離す整理となっているようです。





## まとめ
以上解析結果からわかる具体的な特徴をだらだら書いてきましたが、最後に辞書や出力形式などその他の要素を加えた情報を簡単にまとめました。
COTOHA APIはEnterprise版では大量の業界辞書や個別カスタマイズ辞書を利用することができるようですが、今回はそれは利用していません。

|特徴|COTOHA API|MeCab|
|:---:|:---:|:---:|
|品詞|基本品詞 + 追加情報|階層型のIPA品詞体系|
|複合名詞|１つの形態素|複数の形態素|
|動詞の活用|動詞語幹＋その他修飾要素|動詞の活用形|
|辞書追加|Enterprise版はできる|コンパイルすることでできる|
|Nbest|出力できない|出力できる|

個人的に一番興味がある差分は、複合名詞や動詞活用にみられる形態素の切れ目の差で、例えばキーワード抽出などのタスクではCOTOHA APIの方がやりやすいかなと思う一方で、機械学習では「内閣」「総理」「大臣」と分割されるMeCabの方が「大臣」など単語個別の要素を認識できるななどと考えています。さらに動詞活用については今の話が逆転するようで、各タスクに応じて両者の使い分けができるとより自然言語処理を楽しむことができそうです。


今回は形態素解析のみの比較でしたが機会があれば他の自然言語処理技術、例えば構文解析、意味解析などの特徴の違いについても今後書きたいと思います。以下参考ページにそれぞれの解析器に関するリンクを置いています。まだ触ったことがない方はこちらから是非色々な文を試してみてください。

最後までお付き合いいただきありがとうございました。


## 参考ページ
・[COTOHA API](https://api.ce-cotoha.com/contents/index.html)
・[MeCab](http://taku910.github.io/mecab/)
・[形態素解析器で使われる日本語品詞体系](https://qiita.com/priancho/items/f633a9e99616b3fe451f)