この記事の内容
- 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'固有名詞)
です。
ここでもstr
とunicode
の両方が入力可能です。
獲得したい品詞タプルをリストの中に置いておきます。
pos_condition = [(u'名詞', u'固有名詞'), (u'動詞', u'自立')]
フィルタリングを実行します。
filtered_obj = mecab_wrapper.filter(
parsed_sentence=tokenized_obj,
pos_condition=pos_condition
)
戻り値はこのクラスオブジェクトです
なんでそんなもん作ったんや?
簡単にまとめると
- 同じ処理をずっと書いていて無駄っぽいぞ・・・
- フィルタリングと辞書追加ができるパッケージはpythonにはないなぁ・・
- 世の前処理職人に少しでも貢献したい
というモチベーションです。
私は自然言語処理前処理係を長くやってきてまして・・・くる日も来る日も前処理、ときには他人の研究の前処理までやってあげる聖人ぶり。。。。
でも、ある時、ふと気がついたのが、「形態素分割の部分って毎回のように同じ処理を書いてるんじゃね?」
そこで、何度も同じことをやってきた中で、特によく使ってきた(使うであろう)処理だけをまとめてパッケージ化してしまったわけです。
Pythonで似たことができるパッケージにnattoがあります。
ただ、nattoでもフィルタリングの処理をやっぱり書かないといけなかったり、辞書追加ができなかったりと、不便に感じてしまったので、新しく作ってしまいました。
これから前処理職人になる貴方も、すでに現役前処理職人の貴方にも!少しでも作業を軽減して、楽しくNLPができるようになることを祈っています。