rubyから形態素解析ライブラリkuromojiを使う

kuromojiとは

Kuromojiatilika社が開発したJavaで作成されたオープンソースの日本語形態素解析エンジンです。
Kuromojiは下記の機能を持っています。

  • 複合語の分割
  • 品詞のタグ付け
  • 見出し化
  • 漢字の読み方を抽出
  • 検索用の設計(複数の単語分割モード)

KuromojiのライセンスはApache v2ライセンスなので、商用でも利用できそうです。

準備

ソースコードはgithubにあるのでビルドしても良いのですが、zipでもダウンロードする事が出来ます。
今回はプロジェクトディレクトリ以下に解凍し、呼び出します。

kuromojiはjavaで作成されていますが、今回はrubyから使うことが目的なので、rjbを使います。
rjbはJNI (Java Native Interface) を利用してJava VMを操作するライブラリです。
具体的には、Rubyプロセス内にJVMを起動し、Java クラスファイルをロードしてメソッドを呼ぶことができます。

rjbの用意は、Gemfilegem 'rjb'を追加し、require 'rjb'するだけです。

形態素解析

rubyからkuromojiの使い際のポイントは

Rjb::loadしてTokenizer=Rjb::import('org.atilika.kuromoji.Tokenizer')Tokenizer.builder.buildでトークナイザーを作る事です。

サンプルコード

require 'rjb'require 'rjb'

module  JavaIterator
  def each
    i = self.iterator
    while i.has_next
      yield i.next
    end
  end
end

Rjb::load('kuromoji-0.7.7/lib/kuromoji-0.7.7.jar')

Tokenizer=Rjb::import('org.atilika.kuromoji.Tokenizer')

@tknizer = Tokenizer.builder.build

def tokenize sentence
  list = @tknizer.tokenize(sentence)
  list.extend JavaIterator
  list.each do |x|
    print x.surface_form
    print " : "
    puts x.all_features
  end
end

str = "関西国際空港は、大阪府大阪市の南西38kmにまたがる会社管理空港である"

tokenize str

実行結果

関西国際空港 : 名詞,固有名詞,組織,*,*,*,関西国際空港,カンサイコクサイクウコウ,カンサイコクサイクーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
、 : 記号,読点,*,*,*,*,、,、,、
大阪 : 名詞,固有名詞,地域,一般,*,*,大阪,オオサカ,オーサカ
府 : 名詞,接尾,地域,*,*,*,府,フ,フ
大阪 : 名詞,固有名詞,地域,一般,*,*,大阪,オオサカ,オーサカ
市 : 名詞,接尾,地域,*,*,*,市,シ,シ
の : 助詞,連体化,*,*,*,*,の,ノ,ノ
南西 : 名詞,一般,*,*,*,*,南西,ナンセイ,ナンセイ
38 : 名詞,数,*,*,*,*,*
km : 名詞,一般,*,*,*,*,*
に : 助詞,格助詞,一般,*,*,*,に,ニ,ニ
またがる : 動詞,自立,*,*,五段・ラ行,基本形,またがる,マタガル,マタガル
会社 : 名詞,一般,*,*,*,*,会社,カイシャ,カイシャ
管理 : 名詞,サ変接続,*,*,*,*,管理,カンリ,カンリ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
で : 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ある : 助動詞,*,*,*,五段・ラ行アル,基本形,ある,アル,アル

特徴はall_featuresで取得出来るほかに、surface_form,part_of_speech,base_form,position,readingとそれぞれ個別でも取得可能です。

検索用の分割モード

Kuromojiは複数の分割モードを持っています。
単語分割モードの変更はトークナイザー作成時にモードを指定します。

Mode = Rjb::import('org.atilika.kuromoji.Tokenizer$Mode')

@tknizer = Tokenizer.builder.mode(Mode.SEARCH).build

例えば検索用のモードだと、先ほど「関西国際空港」と一つの単語だった物が分割されます。

関西 : 名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際 : 名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
~~~ 以下略 ~~~