Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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'

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

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

関西 : 名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際 : 名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
~~~ 以下略 ~~~
k-shogo
勇者シリーズを見て育ち、人工知能に夢を見た。 大学時代は人工知能を研究。 現在はrailsエンジニア。 好きなテキストエディタはvim 好きなvimプラグインはunite 好きなコマンドはxargs
http://k-shogo.github.io/
recruitmp
結婚・カーライフ・進学の情報サイトや『スタディサプリ』などの学びを支援するサービスなど、ライフイベント領域に関わるサービスを提供するリクルートグループの中核企業
http://www.recruit-mp.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away