洋食の日記

「た・である」調ではなく「です・ます」調で書きはじめれば良かったなと後悔してる人のブログです

Rubyな形態素解析器Suikaのトライをdarts-clone.rbにした

はじめに

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自然言語処理ライブラリも欲しくなってくるが、どういうものが良いんだろうか?といったところ。