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

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

関西 : 名詞,固有名詞,地域,一般,*,*,関西,カンサイ,カンサイ
国際 : 名詞,一般,*,*,*,*,国際,コクサイ,コクサイ
空港 : 名詞,一般,*,*,*,*,空港,クウコウ,クーコー
は : 助詞,係助詞,*,*,*,*,は,ハ,ワ
~~~ 以下略 ~~~
Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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