LoginSignup
8
8

More than 5 years have passed since last update.

JUMAN++のRubyラッパーGemを作った

Posted at

JUMAN++は去年発表された、新型の形態素解析機です。

(参考1)JUMAN++ - 黒橋・河原研究室 - 京都大学

(参考2)新形態素解析器JUMAN++を触ってみたけど思ったより高精度でMeCabから乗り換えようかと思った話

今回はGem作成の練習がてら、JUMAN++をRubyから使用するためのGemを作ってみました(最低限ですが・・・)。

GitHub:EastResident/jumanpp_ruby

RubyGem:jumanpp_ruby

環境

OS: Mac OS X EI Capitan
Ruby: 2.3.1

準備

普通にbundle installしてください。

gem 'jumanpp_ruby'
$ bundle

OR

$ gem install jumanpp_ruby

環境にJUMAN++が入っていない場合は、適宜導入してください。Macならbrew一発で入ります。

brew install jumanpp

使用方法

JumanppRuby::Juman#parse

基本的な使い方としては、JumanppRuby::Jumanクラスのインスタンスを作成し、parseメソッドを呼び出すだけです。

第一引数のみを渡すと、渡した日本語文字列を形態素に分解し、表層形のみを一次元配列の形で返します。要するに分かち書きして配列で返すだけです。

require 'jumanpp_ruby'

juman = JumanppRuby::Juman.new(force_single_path: :true)
p juman.parse('モビルスーツの性能の違いが、戦力の決定的差でないということを教えてやる')
# => ["モビルスーツ", "の", "性能", "の", "違い", "が", "、", "戦力", "の", "決定", "的", "差", "で", "ない", "と", "いう", "こと", "を", "教えて", "やる", "EOS"]

また、parseメソッドにブロックを渡すと、ブロックの中で構文解析結果の入った配列を処理することができます。

require 'jumanpp_ruby'

juman = JumanppRuby::Juman.new(force_single_path: :true)

jumanpp.parse('ララァ…私を導いてくれ!') do |word|
  p word
end
# =>["ララァ", "ララァ", "ララァ", "名詞", "6", "普通名詞", "1", "*", "0", "*", "0", "自動獲得:Wikipedia", "Wikipediaリダイレクト:ララァ・スン"]
# =>["…", "…", "…", "特殊", "1", "記号", "5", "*", "0", "*", "0", "NIL"]
# =>["私", "わたし", "私", "名詞", "6", "普通名詞", "1", "*", "0", "*", "0", "代表表記:私/わたし", "漢字読み:訓", "カテゴリ:人"]
# =>["を", "を", "を", "助詞", "9", "格助詞", "1", "*", "0", "*", "0", "NIL"]
# =>["導いて", "みちびいて", "導く", "動詞", "2", "*", "0", "子音動詞カ行", "2", "タ系連用テ形", "14", "代表表記:導く/みちびく"]
# =>["くれ", "くれ", "くれる", "接尾辞", "14", "動詞性接尾辞", "7", "母音動詞", "1", "基本連用形", "8", "代表表記:くれる/くれる"]
# =>["!", "!", "!", "特殊", "1", "記号", "5", "*", "0", "*", "0", "NIL"]
# =>["EOS"]

Juman++設定の適用

newでインスタンスを作成する際には、以下のオプションを適用させることができます。オプションの詳細はJUMAN++の公式ページを参照してください。

beam: set beam width used in analysis (unsigned int [=5])
force_single_path: do not output ambiguous words on lattice(default false)
partial: receive partially annotated text(default false)

以下は適用例です。

JumanppRuby::Juman.new(
  beam: 5,
  force_single_path: :true,
  partial: :true
)

String.parse

Stringクラスから、parseメソッドを利用することもできます。

require 'jumanpp_ruby'

p 'モビルスーツの性能の違いが、戦力の決定的差でないということを教えてやる'.parse
# => ["モビルスーツ", "の", "性能", "の", "違い", "が", "、", "戦力", "の", "決定", "的", "差", "で", "ない", "と", "いう", "こと", "を", "教えて", "やる", "EOS"]

この時、parseメソッドの引数として、前述したオプションを渡すことができます。

'Japanese Text'.parse(force_single_path: :true)

バージョン情報とヘルプ

JumanppRuby::Juman.versionでバージョン情報を出力できます。

print JumanppRuby::Juman.version
# => JUMAN++ 1.01

また、JumanppRuby::Juman.helpで、ヘルプテキストが返ります。

print JumanppRuby::Juman.help

最後に

今回は簡単な方法で実装しましたが、できればRuby-FFIとか使ってもっと本格的な実装を試してみたいですね。mecabバインディングのnattoとかを参考にしつつ、少しずつ充実させていきたいです。

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8