Posted at

python向けに形態素分割を楽に扱えるライブラリつくった

More than 3 years have passed since last update.


この記事の内容


  • PythonでMecabを楽に扱えるライブラリつくったよ


  • gitからもってきてインストールできるよ。


このライブラリでできること


  • 文を入力して単語に分割

  • ストップワードと品詞でフィルタリング

  • 辞書の追加(neologd辞書とcsvのユーザー辞書をサポート)

  • python2xとpython3xの両方で使える(たぶん)


    • python3xではしっかりとテストしていないので、気が付いていないバグがあるかもしれません




いんすとーる


MecabとMecab-neologd

そもそもMeCabをインストールしないといけません。

でも、前処理職人のみなさんはすでに準備ができていると思うので、割愛します。

Mecab-neologd辞書の呼び出しもサポートしているので、インストールしておくと良いです。


本体のインストール

git clone git@github.com:Kensuke-Mitsuzawa/JapaneseTokenizers.gitをして、python setup.py installで使えるようになります。

またはpip install git+https://github.com/Kensuke-Mitsuzawa/JapaneseTokenizersでも可能です。


使い方

同じ内容はexampleに書いてあるので、かいつまんで書いておきます。


形態素分割

入力文を用意します

sentence = u'テヘラン(ペルシア語: تهران ; Tehrān Tehran.ogg 発音[ヘルプ/ファイル]/teɦˈrɔːn/、英語:Tehran)は、西アジア、イランの首都でありかつテヘラン州の州都。人口12,223,598人。都市圏人口は13,413,348人に達する。'

python2xは入力はunicodeのみです。

python3xはどちらでも構いません。

osのタイプを指定します。

centOS以外ならosType = "generic"で良いです。

centOSだけはosType = "centsos"にしないといけません。

(centOSだけ、Mecabのシステムコマンドが違うためです。他にもそういうOSがあるかもしれません。。。UbuntuとMacでは動くことを確認しています。)

辞書のタイプを指定します。


  • ipadicならdictType = ""dictType = "ipadic"

  • neologdとipadicの併用ならdictType = "neologd"

インスタンスを初期化します

mecab_wrapper = MecabWrapper(dictType=dictType, osType=osType)

単語分割します。

tokenized_obj = mecab_wrapper.tokenize(sentence=sentence)

デフォルトだと、単語と品詞がタプルペアになった状態で返ってきます。

tokenized_obj = mecab_wrapper.tokenize(sentence=sentence, return_list=False)

にすると、このクラスオブジェクトが返されるので、ほかの処理に使いたい場合は、このフラグを指定した方が良いです。


フィルタリング

フィルタリングは


  • ストップワードの指定して排除

  • 獲得したい品詞だけ指定

ストップワードは

stopwords = [u'テヘラン']

のように、リストの中に文字列をおきます。(strでもunicodeでもどちらも可です)

品詞で指定する場合は[ (品詞タプル) ]のように指定します。

品詞は3階層まで指定できるようになっています。例えば、IPADICの品詞体系で、名詞-固有名詞-人名が欲しい場合は (u'名詞', u'固有名詞', u'人名') と書きます。

名詞-固有名詞までで指定したいときは(u'名詞', u'固有名詞)です。

ここでもstrunicodeの両方が入力可能です。

獲得したい品詞タプルをリストの中に置いておきます。

pos_condition = [(u'名詞', u'固有名詞'), (u'動詞', u'自立')]

フィルタリングを実行します。

filtered_obj = mecab_wrapper.filter(

parsed_sentence=tokenized_obj,
pos_condition=pos_condition
)

戻り値はこのクラスオブジェクトです


なんでそんなもん作ったんや?

簡単にまとめると


  • 同じ処理をずっと書いていて無駄っぽいぞ・・・

  • フィルタリングと辞書追加ができるパッケージはpythonにはないなぁ・・

  • 世の前処理職人に少しでも貢献したい

というモチベーションです。

私は自然言語処理前処理係を長くやってきてまして・・・くる日も来る日も前処理、ときには他人の研究の前処理までやってあげる聖人ぶり。。。。

でも、ある時、ふと気がついたのが、「形態素分割の部分って毎回のように同じ処理を書いてるんじゃね?」

そこで、何度も同じことをやってきた中で、特によく使ってきた(使うであろう)処理だけをまとめてパッケージ化してしまったわけです。

Pythonで似たことができるパッケージにnattoがあります。

ただ、nattoでもフィルタリングの処理をやっぱり書かないといけなかったり、辞書追加ができなかったりと、不便に感じてしまったので、新しく作ってしまいました。

これから前処理職人になる貴方も、すでに現役前処理職人の貴方にも!少しでも作業を軽減して、楽しくNLPができるようになることを祈っています。