rubyから形態素解析ライブラリkuromojiを使う
kuromojiとは
Kuromojiはatilika社が開発したJavaで作成されたオープンソースの日本語形態素解析エンジンです。
Kuromojiは下記の機能を持っています。
- 複合語の分割
- 品詞のタグ付け
- 見出し化
- 漢字の読み方を抽出
- 検索用の設計(複数の単語分割モード)
KuromojiのライセンスはApache v2ライセンスなので、商用でも利用できそうです。
準備
ソースコードはgithubにあるのでビルドしても良いのですが、zipでもダウンロードする事が出来ます。
今回はプロジェクトディレクトリ以下に解凍し、呼び出します。
kuromojiはjavaで作成されていますが、今回はrubyから使うことが目的なので、rjbを使います。
rjbはJNI (Java Native Interface) を利用してJava VMを操作するライブラリです。
具体的には、Rubyプロセス内にJVMを起動し、Java クラスファイルをロードしてメソッドを呼ぶことができます。
rjbの用意は、Gemfile
にgem '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
例えば検索用のモードだと、先ほど「関西国際空港」と一つの単語だった物が分割されます。
関西 : 名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際 : 名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
~~~ 以下略 ~~~