単語分割器Micterを公開しました

 しばらく日記書いてなかったら、また文体忘れて敬体で書いちゃったよ…。でも常体に書き換えるのもめんどくさいのでこのままうpします。
 単語分割器を作ったので、githubで公開しました。→http://github.com/tkng/micter
 名前は単純にMIC segmenTERでmicterにしました。作ってから気づいたのですが、segmentという単語のうち、最後のtしか名前に入っていません。今更名前を変えるのも面倒なのでこのままにしておきますが、微妙に失敗した感がありますね…。
 形態素解析器としては既にmecabやらchasenやらjumanやらがありますし、最近では単語分割&読み推定のkyteaもあります。そんなにいろいろある中でまた似たようなツールを書いたのは、自分のパッケージに取りこめる小さな単語分割器が欲しかったのが理由です。文章を単語に分割する機能だけあればいいんだけど、そのためにmecabに依存するのはめんどくさい、そんな時に使うことを想定しています。まだ今は実現できていませんが、将来的にはmicter.cppとmicter.hppの2つのファイルだけを自分のプロジェクトに取り込めばそれで使えるというのを目指しています。(今はutil.cppとutil.hppも必要。)
 Micterを書いたもう一つの理由として、今の自分がどれぐらいのスピードで一つのソフトウェアを書き上げられるかを試したかったという点もあります。仕事でプログラムを書くときには、既にあるプログラムに対してバグ修正を行ったり機能追加を行うだとか、アドホックなデータ整形プログラムを書いたりだとかそういう場面が多く、再利用するプログラムを最初から書くという機会はあまり多くありません。学生時代のころと比べて、どれぐらいプログラミング能力が向上したか(もしくは劣化したか)を一度試してみたかったのです。結果としては、動くまでに2日、パフォーマンスチューニングに2日で、この規模のプログラムを一から書いたにしてはなかなか悪くない感じでした。書いてるうちに同じ事を意味する変数の名前が変わってしまって最終的に変数名に一貫性がなくなったり、名前空間を使うのめんどかったので後で書き加えようとかそういう「後で」系のタスクがそのままほぼ全部手つかずで残ってたりとか、スピードを重視するとコードのクオリティがいろいろ下がるという面では進歩が見られないこともわかりました。
 単語分割だけを行うということで、micterと同じようなジャンルのソフトウェアとしてTinySegmenterがあります。というか、そもそもMicterの名前自体がTinySegmenterから頂いてきて改変した感じです。TinySegmenterと比べると、Micterには学習器も含まれているという点が一番大きな違いでしょう。学習器つきなので、素性を自分でいじって遊ぶことができます。ぐねぐねと素性をこねくり回して遊ぶのは結構面白いです。字種情報を付け加えて学習させるとモデルサイズが小さくなったりとかします。Micterの学習器にはSVMを使っていますが、これはFOBOSで最適化を行う線形SVMを新しく実装しました。(FOBOSでの実装は非常に簡単なので、「実装しました(キリッ」って感じですが。)
 先ほどパフォーマンスチューニングと書きましたが、チューニングした上で、それでもまだ速度面ではmecabよりも2倍ぐらい遅いというのが実状です。なぜフルセットの形態素解析を行うmecabよりもmicterが遅いのかというと、これは辞書の有無が大きいようです。mecabでは辞書を使って形態素ラティスを構築します。これは直感的には遅そうですが、

  • 辞書に出てこない単語に関しては考慮しなくてよい
  • 連接コストが品詞バイグラムにできるので配列アクセスで求められる

 という速度面での利点があります。前者に関しては、例えば、「ソフトウェア」という文字列を例にして考えてみると、mecabでは辞書引きした段階で候補としては「ソフトウェア」と「ソフト/ウェア」の2通りぐらいしか残らないはずです。micterでは「ソ/フ/ト/ウ/ェ/ア」の/の部分全部に対して分割位置かどうかの判定を必要とするので、判定しなければならないところがそれだけ多く、その分遅くなります。
 後者に関しては、mecabでは品詞バイグラムコスト(と単語コスト)で十分に精度が出せるため、ハッシュテーブルを使わずに配列アクセスで済ませられます。micterでは文字バイグラム、文字トライグラムなどのコストを使いますので、コスト保存のためにどうしてもハッシュテーブル的なものが必要になります。(文字トライグラムを単純な多次元配列で表現するとスパースになりすぎる。)
 とはいえ、実装を頑張れば、mecabよりちょっと遅い、程度にまで高速化できる目処は立っています。このあたりについては割とおもしろい所なので、また機会があれば紹介したいと思います。
 ライセンスは3-clause BSDLですが、こういうライセンスで使いたい、という要望がもしあれば応じることは出来ますので、お問い合わせ下さい。