LoginSignup
68
67

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-03-06

この記事の内容

  • 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とか・・・

68
67
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
68
67