LoginSignup
8
5

More than 5 years have passed since last update.

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

Posted at

この記事の内容

  • 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ができるようになることを祈っています。

8
5
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
8
5