Rubyによる形態素解析エンジンokura 0.0.1をリリースしました

12月にさくさくテキストマイニングで発表したpure Rubyによる形態素解析エンジンをgem化しました。
まだ発展途上で機能が少なかったりパフォーマンスが悪かったりしますが、いちおう動くレベル*1になったので公開します。

注意事項

バージョン0.0.xのうちは、インタフェースや辞書フォーマットは頻繁に変更される予定です。
ある程度安定したら0.1.0出します。
今のところ、Ruby1.9系専用です。

取得

gem install okura

でインストールできます。

ソースは https://github.com/todesking/okura

使い方

MeCabフォーマットの辞書データを使用します。
動作確認はMeCab用NAIST辞書で行いました。


最初にokura compileコマンドで辞書をコンパイルします

$ okura compile mecab-naist-jdic-0.6.3b-20111013/ okura-dic

コンパイルした辞書のディレクトリを指定して、コンソールを起動することで形態素解析が試せる。

$ okura console okura-dic
okura> 庭には二羽ニワトリがいる
BOS/EOS BOS/EOS 0

庭      名詞,一般,*,*,*,*,* 5158

に      助詞,格助詞,一般,*,*,*,に 3347
に      助詞,特殊,*,*,*,*,に 6340
に      助詞,副詞化,*,*,*,*,に 4524
に      動詞,自立,*,*,一段,連用形,* 8055
に      動詞,自立,*,*,一段,未然形,* 8055
に      動詞,自立,*,*,一段,連用形,* 8055
に      動詞,自立,*,*,一段,未然形,* 8055

は      助詞,係助詞,*,*,*,*,は 2299
は      動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7290
は      動詞,非自立,*,*,五段・ラ行,体言接続特殊2,* 7147
は      名詞,一般,*,*,*,*,* 7507
は      動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7290

二      名詞,数,*,*,*,*,* 2054
二      名詞,固有名詞,地域,一般,*,*,* 7688
二      名詞,数,*,*,*,*,* 16578

羽      名詞,一般,*,*,*,*,* 5381
羽      名詞,一般,*,*,*,*,* 4601
羽      名詞,固有名詞,地域,一般,*,*,* 6805
羽      名詞,接尾,助数詞,*,*,*,* 9136
羽      名詞,接尾,一般,*,*,*,* 6459
羽      名詞,接尾,助数詞,*,*,*,* 7405
羽      名詞,接尾,一般,*,*,*,* 7990

ニワトリ        名詞,一般,*,*,*,*,* 2592
ニ      名詞,一般,*,*,*,*,* 7209
ニ      名詞,固有名詞,地域,一般,*,*,* 10596
ニ      名詞,固有名詞,組織,*,*,*,* 8832
ニ      名詞,固有名詞,人名,一般,*,*,* 10225
ニ      名詞,固有名詞,一般,*,*,*,* 8341
ニ      感動詞,*,*,*,*,*,* 8949
ニワ    名詞,一般,*,*,*,*,* 7209
ニワ    名詞,固有名詞,地域,一般,*,*,* 10596
ニワ    名詞,固有名詞,組織,*,*,*,* 8832
ニワ    名詞,固有名詞,人名,一般,*,*,* 10225
ニワ    名詞,固有名詞,一般,*,*,*,* 8341
ニワ    感動詞,*,*,*,*,*,* 8949
ニワトリ        名詞,一般,*,*,*,*,* 7209
ニワトリ        名詞,固有名詞,地域,一般,*,*,* 10596
ニワトリ        名詞,固有名詞,組織,*,*,*,* 8832
ニワトリ        名詞,固有名詞,人名,一般,*,*,* 10225
ニワトリ        名詞,固有名詞,一般,*,*,*,* 8341
ニワトリ        感動詞,*,*,*,*,*,* 8949

ワ      助詞,終助詞,*,*,*,*,ワ 3411
ワ      名詞,一般,*,*,*,*,* 7209
ワ      名詞,固有名詞,地域,一般,*,*,* 10596
ワ      名詞,固有名詞,組織,*,*,*,* 8832
ワ      名詞,固有名詞,人名,一般,*,*,* 10225
ワ      名詞,固有名詞,一般,*,*,*,* 8341
ワ      感動詞,*,*,*,*,*,* 8949
ワト    名詞,一般,*,*,*,*,* 7209
ワト    名詞,固有名詞,地域,一般,*,*,* 10596
ワト    名詞,固有名詞,組織,*,*,*,* 8832
ワト    名詞,固有名詞,人名,一般,*,*,* 10225
ワト    名詞,固有名詞,一般,*,*,*,* 8341
ワト    感動詞,*,*,*,*,*,* 8949
ワトリ  名詞,一般,*,*,*,*,* 7209
ワトリ  名詞,固有名詞,地域,一般,*,*,* 10596
ワトリ  名詞,固有名詞,組織,*,*,*,* 8832
ワトリ  名詞,固有名詞,人名,一般,*,*,* 10225
ワトリ  名詞,固有名詞,一般,*,*,*,* 8341
ワトリ  感動詞,*,*,*,*,*,* 8949

トリ    名詞,一般,*,*,*,*,* 2892
トリ    名詞,固有名詞,一般,*,*,*,* 2914
ト      名詞,一般,*,*,*,*,* 7209
ト      名詞,固有名詞,地域,一般,*,*,* 10596
ト      名詞,固有名詞,組織,*,*,*,* 8832
ト      名詞,固有名詞,人名,一般,*,*,* 10225
ト      名詞,固有名詞,一般,*,*,*,* 8341
ト      感動詞,*,*,*,*,*,* 8949
トリ    名詞,一般,*,*,*,*,* 7209
トリ    名詞,固有名詞,地域,一般,*,*,* 10596
トリ    名詞,固有名詞,組織,*,*,*,* 8832
トリ    名詞,固有名詞,人名,一般,*,*,* 10225
トリ    名詞,固有名詞,一般,*,*,*,* 8341
トリ    感動詞,*,*,*,*,*,* 8949

リ      名詞,固有名詞,一般,*,*,*,* 4434
リ      名詞,一般,*,*,*,*,* 7209
リ      名詞,固有名詞,地域,一般,*,*,* 10596
リ      名詞,固有名詞,組織,*,*,*,* 8832
リ      名詞,固有名詞,人名,一般,*,*,* 10225
リ      名詞,固有名詞,一般,*,*,*,* 8341
リ      感動詞,*,*,*,*,*,* 8949

が      助詞,格助詞,一般,*,*,*,が 2722
が      助詞,接続助詞,*,*,*,*,が 4189
が      接続詞,*,*,*,*,*,* 4546
が      動詞,接尾,*,*,五段・ラ行,体言接続特殊2,* 5257
がい    名詞,接尾,一般,*,*,*,* 6988
がい    名詞,非自立,一般,*,*,*,* 4949
がい    名詞,一般,*,*,*,*,* 6540

い      名詞,一般,*,*,*,*,* 7305
い      動詞,自立,*,*,一段,連用形,* 7199
い      動詞,自立,*,*,一段,未然形,* 7199
い      動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7199
い      動詞,非自立,*,*,一段,連用形,* 6087
い      動詞,非自立,*,*,一段,未然形,* 6087
い      動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7199
い      動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7199
い      動詞,自立,*,*,一段,連用形,* 7199
い      動詞,自立,*,*,一段,未然形,* 7199
い      動詞,自立,*,*,一段,連用形,* 7199
い      動詞,自立,*,*,一段,未然形,* 7199
いる    動詞,自立,*,*,一段,基本形,* 7379
いる    動詞,自立,*,*,五段・ラ行,基本形,* 7379
いる    動詞,非自立,*,*,一段,基本形,* 5961
いる    動詞,自立,*,*,五段・ラ行,基本形,* 7379
いる    動詞,自立,*,*,五段・ラ行,基本形,* 7379
いる    動詞,自立,*,*,一段,基本形,* 7379
いる    動詞,自立,*,*,一段,基本形,* 7379

る      助動詞,*,*,*,文語・ル,基本形,る 6632
る      動詞,非自立,*,*,一段,基本形,る 9452
る      助動詞,*,*,*,文語・リ,体言接続,り 5978

BOS/EOS BOS/EOS 0

BOS/EOS BOS/EOS
庭      名詞,一般,*,*,*,*,*
に      助詞,格助詞,一般,*,*,*,に
は      助詞,係助詞,*,*,*,*,は
二      名詞,数,*,*,*,*,*
羽      名詞,接尾,助数詞,*,*,*,*
ニワトリ        名詞,一般,*,*,*,*,*
が      助詞,格助詞,一般,*,*,*,が
いる    動詞,自立,*,*,一段,基本形,*
BOS/EOS BOS/EOS

最初にずらずら出てくるのは可能な単語の候補、一番最後に出てくるのが最終的な形態素解析結果です。情報を出し過ぎである。

プログラムから使う
require 'okura/serializer'

dict_dir='コンパイル済み辞書ファイルのディレクトリ'
tagger=Okura::Serializer::FormatInfo.create_tagger dict_dir

str='解析対象の文字列'

# 文字列から単語候補を計算
nodes=tagger.parse(str)

# 単語候補の中で、一番最もらしい組み合わせを選択
nodes.mincost_path.each{|node|
  word=node.word
  # word.surface : 単語の表記
  # word.left.text : 品詞
  # 品詞はword.leftとword.rightがありますが、一般的に使われる辞書(IPA辞書やNAIST辞書)では
  # 両方同じデータが入ってます
}

パフォーマンス

まだちゃんと計測してないです!!
手元の環境(MacBook Air 2011)でNAIST辞書(20111013)を使用して、辞書のコンパイルに1分30秒、辞書のロードに2秒程度。

類似のライブラリ

さくさくテキストマイニングの発表後に教えていただいたのですが、Igo(Java形態素解析エンジン)のRuby移植でigo-rubyというのが存在します。

igo-rubyと比較したokuraの強みとしては、

  • 単体で辞書のコンパイルが可能(igo-rubyの場合、辞書のコンパイルにはJavaで動作するigo本体が必要)
  • 将来の可能性(辞書バイナリに独自フォーマットを採用しており、高速化・省メモリ化の余地がある)

という点があります。

今後の予定

  • 辞書ロードの高速化
  • 読み情報に対応(今は単語の表記と品詞しか取得できません)
  • Windows環境での動作確認

とか。

*1:起動に数分かかったりしないという意味