Edited at

Pythonで形態素解析器の比較できるパッケージつくった

More than 1 year has passed since last update.


この記事の内容


  • Pythonで形態素解析器の比較ができるパッケージ作りました。


    • Python2.7, Python3.xで動作します。



  • 4つの形態素解析器をサポートしてます

  • pipでインストールできます。 pip install JapaneseTokenizer


    • パッケージのURL



  • ただしWindowsはダメです。ごめんなさいね。


パッケージの特徴


  • 単語分割するための簡単なインターフェース提供

  • 「単語分割 -> ストップワードと品詞でフィルタリング」の操作が1行で完結

  • Mecab, Juman, Juman++, Kyteaの4種類を同じインターフェースで呼び出し可能

  • 実務でバリバリ使える



    • 株式会社インサイトテックの至るところで1年間半以上、使われてます。

    • 数百万件のテキストでも割とバリバリと処理してくれます

    • 実は本家のpyknp(v0.3)よりも動作が早い



  • 辞書追加の簡単なインターフェース提供


    • neologd辞書とcsvのユーザー辞書をサポート

    • mecabのみ




使い方


準備

GithubのリポジトリにMakeファイルを設置しました。

Makeにこける場合は手動でインストールします。

このセクションを参考にインストールをしてください。


サンプルコード

python3.xでサンプル示します。

python2.x向けのサンプルを見たい方はexampleコードを見てください。

品詞体系はこちらのページが詳しくまとめています。

Juman/Juman++の品詞体系も記述されているので、Juman/Juman++で品詞フィルタリングをしたい場合は、切り替えて使ってください。

ちなみに、Juman/Juman++でもneologd辞書を使うことはできます。こちらの記事をご覧ください。neologd辞書をjuman/juman++で使えるようにするスクリプト作った

Mecab, Juman/Juman++, Kyteaの違いは、呼び出すクラスが違うだけです。

同じ共通クラスを継承しています。


mecabで形態素解析する

Version1.3.1の使い方を紹介します。

import JapaneseTokenizer

# 辞書タイプを選びます。"neologd", "all", "ipadic", "user", ""が選べます。
mecab_wrapper = JapaneseTokenizer.MecabWrapper(dictType='neologd')
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('形容詞', '自立')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(mecab_wrapper.tokenize(sentence).filter(pos_condition).convert_list_object())

すると、結果はこのようになります。

['イラン・イスラム共和国', 'イラン', '西アジア', '中東', 'イスラム共和制', 'ペルシア', 'ペルシャ']


juman/juman++で形態素解析

基本的にはmecabと変わりません。呼び出すクラスが違うだけです。

Jumanの場合

from JapaneseTokenizer import JumanWrapper

tokenizer_obj = JumanWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('名詞', '地名'), ('名詞', '組織名'), ('名詞', '普通名詞')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())

['イラン', 'イスラム', '共和', '国', '通称', 'イラン', '西', 'アジア', '中東', 'イスラム', '共和', '制', '国家', 'ペルシア', 'ペルシャ']

Juman++の場合

from JapaneseTokenizer import JumanppWrapper

tokenizer_obj = JumanppWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞', '固有名詞'), ('名詞', '地名'), ('名詞', '組織名'), ('名詞', '普通名詞')]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())

['イラン', 'イスラム', '共和国', '通称', 'イラン', '西', 'アジア', '中東', 'イスラム', '共和制', '国家', 'ペルシア', 'ペルシャ']

実はWikipediaくらいきちんとしたテキストなら、Juman, Juman++はそんなに変わらなかったりします。

Juman++を使う時は、初回呼び出し時だけは若干、遅いです。

これは、モデルファイルをメモリに載せるために時間がかかるからです。

2回目以降は起動しっぱなしのプロセスを呼び出すので、この遅さはなくなります。


kyteaで形態素解析

mecab, jumanとクラス名以外はすべて同じです。

from JapaneseTokenizer import KyteaWrapper

tokenizer_obj = KyteaWrapper()
# 獲得したい品詞を定義します。
pos_condition = [('名詞',)]

sentence = "イラン・イスラム共和国、通称イランは、西アジア・中東のイスラム共和制国家。ペルシア、ペルシャともいう。"
# 形態素分割, 品詞フィルタリング, リスト化までを1行で完結
print(tokenizer_obj.tokenize(sentence).filter(pos_condition).convert_list_object())


開発の経緯

以前、MecabのバインディングのWrapperみたいなのを作って自己満してる記事を投稿しました。

この時は、自己満で作ったので、それはそれでいいのです。ただ、それから、「手軽に形態素解析器の比較を試してもらいたい」と思うようになり、作るに至りました。


理由1 みんなmecabばっか使うじゃん?

あくまで私の周りだけですが、「形態素解析?とりあえずMecabで。てか、他になんかあんの?」みたいな雰囲気を感じます。

Qiitaで検索してみると、mecabは347件もヒットするのに、jumanは17件しかでません。kyteaに至っては3件です。

確かにMecabはソフトウェアとしての出来がとても優秀だと思います。

でも、「他は知らんけど、まぁ、Mecabしかないんじゃね?」というのは、なんか違うくね?と思います。

そんなわけで、「Mecab以外にもあるんだよ」というアピールをしたくて作ったのが1つ目のモチベーションです。


理由2 外国人からするとわっかんねぇじゃん?

最近、日本在住の外国人Pythonコミュニティに行くことがあります。

彼らは日本語処理に興味をもってくれているものの、「どの形態素解析器がいいか?」ってことを知りません。

彼らは調べてはみるものの、違いがよくわからないので、なんだかめちゃくちゃなことを言っています。

下記、いままでに聞いた謎論理


  • chasenは昔からあるし、名前もかっこいいからmecabより優れているに違いない

  • jumanって名前がさえないし、大学が作ってるだけだから、ショボいんでしょ?

  • kytea?なにそれ?なんて読むの?読み方がわからないツールはよくないよねぇ・・

こういう謎論理が出てしまうのは、まず情報が整っていないし、比較できてないからじゃないかと思いました。

情報を整えるのは難しいですが、比較を簡単にすることはできます。そんなわけで作りました。

あと、documentは全て英語で書くように心がけました。少しでも情報がまとまると良いかと思って。


開発方針


できる限り共通化

インターフェースも含めて、できる限り同じ構造になるような設計をしました。

処理を実行するクラス、データクラスはすべて共通化しています。


できる限りシンプルなシンタックス

「前処理を最速でコーディング」を実現するためのシンタックスを設計しました。

その結果、形態素分割、品詞フィルタリングまでを1行でこなすインターフェースになりました。


気に入ったら、GithubのリポジトリにStar☆をお願い致します:bow_tone1:

一緒に改善してくださる方も募集中です。

このあたりの解析器も導入したいなぁ。RakutenMAとか、Chansenとか・・・