JUMAN++は去年発表された、新型の形態素解析機です。
(参考1)JUMAN++ - 黒橋・河原研究室 - 京都大学
(参考2)新形態素解析器JUMAN++を触ってみたけど思ったより高精度でMeCabから乗り換えようかと思った話
今回はGem作成の練習がてら、JUMAN++をRubyから使用するためのGemを作ってみました(最低限ですが・・・)。
GitHub:EastResident/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とかを参考にしつつ、少しずつ充実させていきたいです。