はじめに
Rubyな形態素解析器Suikaの単語検索のためのトライを、先日リリースしたdarts-clone.rbに変更してバージョンを上げた。
suika | RubyGems.org | your community gem host
使い方
変更は内部的なものなので、Suikaの使い方自体は変わらない。
gem install suika
Suika::Taggerをnewして、parseメソッドに文字列を与えると形態素解析の結果をArrayで返す。今のところ、これ以外の機能はない。辞書はIPADICをベースに、令和の年号を足したものである。
irb(main):001:0> require 'suika' => true irb(main):002:0> tagger = Suika::Tagger.new irb(main):003:0> puts tagger.parse('時代は平成から令和に変わる') 時代 名詞,一般,*,*,*,*,時代,ジダイ,ジダイ は 助詞,係助詞,*,*,*,*,は,ハ,ワ 平成 名詞,固有名詞,一般,*,*,*,平成,ヘイセイ,ヘイセイ から 助詞,格助詞,一般,*,*,*,から,カラ,カラ 令和 名詞,固有名詞,一般,*,*,*,令和,レイワ,レイワ に 助詞,格助詞,一般,*,*,*,に,ニ,ニ 変わる 動詞,自立,*,*,五段・ラ行,基本形,変わる,カワル,カワル => nil irb(main):004:0> tagger.parse('時代は平成から令和に変わる') => ["時代\t名詞,一般,*,*,*,*,時代,ジダイ,ジダイ", "は\t助詞,係助詞,*,*,*,*,は,ハ,ワ", "平成\t名詞,固有名詞,一般,*,*,*,平成,ヘイセイ,ヘイ セイ", "から\t助詞,格助詞,一般,*,*,*,から,カラ,カラ", "令和\t名詞,固有名詞,一般,*,*,*,令和,レイワ,レイワ", "に\t助詞,格助詞,一般,*,*,*, に,ニ,ニ", "変わる\t動詞,自立,*,*,五段・ラ行,基本形,変わる,カワル,カワル"]
変更箇所
大きな変更は、トライをrambling-trieからdarts-clone.rbにしたことである。Suikaでは、辞書の読み込みの遅さが、問題になっていた。darts-clone.rbはサイズがコンパクトになる利点があり、効果があると期待した。私のメインPCは、MacBook Early 2016だが、雑に読み込み時間を数回測ってみて平均したところ、ver. 0.1.4で8.4秒、ver. 0.2.0で5.7秒だった。 その他、Arrayのappendメソッドを使っていたところをpushにしたり、keyword_init引数を使ったStructを普通のクラスに置き換えたりした。これで、Ruby 2.4以前でも動く様になったと思う(Ruby本体の公式サポートが切れているのでCIではテストしていない)。
おわりに
darts-clone.rbはnative extensionsを使用しているので、それに依存するSuikaがPure Rubyなのか怪しいが、辞書の読込時間が改善したので良しとしたい。ひとまず辞書まわりはコレくらいにして、基本的なところはできた。こうなってくると、Rubyな自然言語処理ライブラリも欲しくなってくるが、どういうものが良いんだろうか?といったところ。