mecab-neologd 前処理用 Python モジュール neologdn 公開しました
PyConJP 2015に参加して意識が高まったのでブログをはじめます。
舞い降り……†
はじめに
私のいる世界では計算機で日本語を処理するときは大体MeCabを使います。
でも、IPA辞書やunidicなどでは語彙に物足りなさを感じます (IPA辞書には「スマホ」が収録されてなかったり)
かといって、私は自前でMeCab用の辞書を作っているのですが、 それを仕事で使おうとすると「ちゃんとメンテできるの?」とか渋い顔をされそうなので、 仕事では使いません。
そこで、頻繁に語彙がアップデートされる mecab-ipadic-neologd が重宝してます。overlastさんに圧倒的感謝 🙏 github.com
ですが、ネットに転がってるようなテキストでは形態素解析の結果が思ったようにいかないことが多いです。 ちゃんと校正されてないので様々な表記揺れがあったりして汚いためです。 そこでMaCabの前に正規化処理をしてある程度きれいにする必要があります。
これまでは、neologdのwikiにPython用のサンプルコードが載ってる のでneologdを使うたびにそれをコピペしてたんですけど、
- 毎回コピペするのだるいなー、PyPIにあればpipで入れられて便利だな
- ついでに最近オライリーのCythonの本読んだからCythonで書いてみようかな。前処理は早ければ早いほどいいよね
ってことでneologd用normalizer略してneologdnなるものを書きました。
import neologdn neologdn.normalize(u'ウェ~∼∾〜〰~イ') # => u'ウェイ'
こんな感じで正規化処理できます。
neologdn のよさ
neologdn のメリットは以下の2点です。
- pip ですぐ使える
- サンプルコードより早い
pip ですぐ使える
pip install neologdn
で入れられます。
ただし unordered_map
と unordered_set
を使ってるので C++11 に対応してる必要があります。
サンプルコードより早い
https://github.com/ikegami-yukino/neologdn/blob/master/benchmark/benchmark.ipynb
↑こちらのノートブックにサンプルコードとneologdnの比較を載せています。
結論だけ書くと、17回テキストを処理するのに、
- サンプルコード: 1.18 ms
- neologdn: 140 µs
と10倍くらい早くなってます。
元のサンプルコード自体が早いので、少量のテキストではそんなに差を体感できないと思いますが、 大量だとうれしいかもしれません (願望)
他のプログラミング言語は?
実はJava用のコードも手元にあるのですが、「自分でドメイン持ってないけど名前空間どうすればいいんだろう?」「普段Javaを書かない人がやってもいいのかな?」「maven centralに登録するにはどうするんだろう?」とかわからないことだらけなので、手取り足取り教えてくれる天使のような人がいたらやるって温度感。
さいごに
というわけで、mecab-neologd 前処理用 Python モジュール neologdn の話でした。
ついでに告知!
10/24 (土) に渋谷にて PyLadies Tokyo - 一周年記念パーティ というPython女子の集まり (今回は男子も参加可) にてLT (neologdnじゃない話) する予定です! 枠が空いてましたら、ぜひともふるってご参加ください^^