[groonga-dev,02753] Re: GroongaのNgram/Delimitトークナイザーに機能追加したプラグインの紹介

Back to archive index

Kouhei Sutou kou****@clear*****
2014年 9月 4日 (木) 21:58:22 JST


須藤です。

この件、今後のGroongaのことを考えると非常に重要な改良なんです
が、ちょっと、私が11月までバタバタしている(*)ので、あまり進め
られなそうな雰囲気を感じています!すみません><

(*) 再来週RubyKaigi 2014で話すんですが、それの準備が芳しくな
    いのと、10/18にOSCで話すのと、11/13にRubyWorld
    Conference 2014で話すのと、11/29に年に一度のGroongaイベ
    ントがあって。。。
    Groongaイベントは運営のいろいろを手伝って欲しい感じ。。。

なので、しばらくはプラグインという形で進めてもらえるとうれし
いです。ステミングとかを扱える仕組みを本体に入れる気は満々で
す!

個人的には

> 可能であれば、Groonga本体に、
> トークナイズ後のトークンごとに任意の処理を行える
> GRN_PROC_TOKEN_FILTERとかがあれば、すごい嬉しい
> なぁと思います。

の方向で行きたいと思っています!
が、どうAPIを切るのがいいかを考える時間がとれないので、方向
性を決めきれない感じです。

> 具体的には、以下のあたりでgrn_stringがオープンされたときに
> strとstr_lenを書き変えて、書き変えたものをstring->originalに
> できればなぁと思います。
> 
> https://github.com/groonga/groonga/blob/master/lib/string.c#L142
> 
> これがあれば、たとえば、事前にHTMLタグを除去したり、任意の
> 文字列処理を施した上でノーマライズできます。
> トークナイズ時でもスニペット時でも有効になると思います。

あんまり考えていないんですが、grn_stringより上のレイヤーの方
がいいんじゃないかと思いました。
(前処理をしたstrをgrn_string_open()に渡す。)

前処理は「文字列を正規化する」というレベルよりも上のレイヤー
の「トークナイズ」という処理の一部だと思うので、そっちで管理
するのが適切なんじゃないかと思いました。

スニペットのときは今でもできるhtml_snippet(html_untag(content))
という使い方の方がよさそうな気がします。こっちの方が自由度
が高いんじゃないですかねぇ。

> もし、上記の実装で私が実装できそうなところがあればできる範囲
> であればお手伝いします。

ありがとうございます!
方針を決めた暁にはぜひおねがいします!

In <CANM+Hhc2OZeE+thFrreOc83wwDXmriDcnf2MpQnc+vAk-spZ_g****@mail*****>
  "[groonga-dev,02740] Re: GroongaのNgram/Delimitトークナイザーに機能追加したプラグインの紹介" on Tue, 2 Sep 2014 12:50:42 +0900,
  Naoya Murakami <visio****@gmail*****> wrote:

> やはりダンプに対応できないのがいけてないですよねぇ。。
> 
> 色々と考えたのですが、現状のままgrn_dumpに対応させようと
> 思うと、トークナイザ―名を1つにして(たとえば、TokenYaNgram)
> キー順でトップに来るような名前の管理テーブルを作って、
> それをgrn_dumpでキー順でダンプする、という方法ぐらいかなぁ
> という気がします。
> 
> ただ、この方法ではgrn_token_open時に設定を読み込むために
> 毎回管理テーブルと多数のカラムを開きにいくのかなぁとかで
> あまりいけてない気もします。。
> 
> それだったら、grn_dumpを独自拡張するダンププログラムまで
> 提供した方がいいかなぁという気もしたり。
> 
> まぁ、そもそもの問題は、トークナイザーの領分を大きく超える
> 作業をトークナイザ―でやろうとしているから種類が増えるんで
> すよねぇ。
> 
> 可能であれば、Groonga本体に、
> トークナイズ後のトークンごとに任意の処理を行える
> GRN_PROC_TOKEN_FILTERとかがあれば、すごい嬉しい
> なぁと思います。
> 
> 具体的には、以下のあたりでトークナイザ―から返ってきた
> tokenとstatusとmodeとlexiconに対して処理したいなぁと思
> います。
> 
> https://github.com/groonga/groonga/blob/master/lib/token.c#L578
> 
> これがあれば、トークンに対するストップワードやステミングを
> 拡張できそうです。
> 
> さらに理想的には、
> ノーマライズ前の文字列に対して任意の処理を行える
> GRN_PROC_STRING_FILTERとかもあれば、すごい嬉しい
> なぁと思います。
> 
> 具体的には、以下のあたりでgrn_stringがオープンされたときに
> strとstr_lenを書き変えて、書き変えたものをstring->originalに
> できればなぁと思います。
> 
> https://github.com/groonga/groonga/blob/master/lib/string.c#L142
> 
> これがあれば、たとえば、事前にHTMLタグを除去したり、任意の
> 文字列処理を施した上でノーマライズできます。
> トークナイズ時でもスニペット時でも有効になると思います。
> 
> が、問題はテーブルも拡張しないといけなくて、すごく大変です
> よね。。info周り書き変えたり、内部的にも外部的にも影響が大き
> そうです。
> (Groonga内部の処理を把握しきれていない部分が多数あるので、
> 若干、妄想が入っているかもしれません。)
> 
> 今、MeCabトークナイザ―やノーマライザー側もいろいろいじり
> たいと思っているのですが、上記のような仕組みができるとすご
> く嬉しいなぁと思いました。
> 
> もし、上記の実装で私が実装できそうなところがあればできる範囲
> であればお手伝いします。
> 
> しかし、上記の実装は大変で影響が大きいと思いますし、開発の
> 優先順位や誰がつくるのって問題もあるので、とりあえずはトーク
> ナイザ―側かノーマライザ―側のプラグインでがんばろうかなぁと
> 思っています。
> 
> 以上です。
> 
> 
> 2014年9月1日 9:42 <morit****@razil*****>:
> 
>> こんにちは。森と申します。
>>
>> yangramすばらしいですね!
>>
>> コマンドで動的にトークナイザを登録できるのは新しいですね。
>>
>> 語彙表のカラムによってストップワードを定義できるのもとても良いと思います。
>> 動作も速いでしょうし、運用中に挙動を変えられるので使い勝手が良さそうです。
>>
>> ステミングが使えるようになったのも嬉しいですね。
>> プラグインでここまでできるというのが感動です。
>>
>> 何とかgrndumpでdump/restoreできるようにしたいですね。
>> 今だと本体でごにょごにょするしかないでしょうか。
>> プラグイン側で記述できる範囲を増やすことで吸収できると良いのでしょうけど、
>> この場合は簡単ではなさそうですね。
>>
>>
>>
>> 2014-08-29 22:43 GMT+09:00 Kouhei Sutou <kou****@clear*****>:
>>
>> > 須藤です。
>> >
>> > In <CANM+HheCT2DyOBriDv3PSF7kTNrVJYMYeuphWBSAM+k=dZYtD****@mail*****>
>> >   "[groonga-dev,02714] GroongaのNgram/Delimitトークナイザーに機能追加したプラグインの紹介" on
>> > Fri, 29 Aug 2014 21:25:35 +0900,
>> >   Naoya Murakami <visio****@gmail*****> wrote:
>> >
>> > > GroongaのNgramトークナイザーにいろいろ機能を付け加えたトークナイザー
>> > > プラグインを作ってみました。
>> > >
>> > > ・Yet another ngram tokenizer plugin for Groonga
>> > > https://github.com/naoa/groonga-tokenizer-yangram
>> >
>> > おぉ!!!
>> > これはすごい!!!
>> >
>> > > 主な機能は検索時のみオーバーラップをしないようにしたことです。
>> > > これによりトークンの比較回数が減り検索に(ほぼ)影響を与えること
>> > > なく検索の効率化を図っています。
>> > >
>> > > NgramのNが大きいほど効果が高く、Bigramの場合は約1.5倍、
>> > > Trigramの場合は約2.3倍ほどはやかったです。
>> >
>> > おぉ、かなり速くなりますね。
>> >
>> > > オーバーラップをスキップすると空白の有無が正しくとれなくなる
>> > > ケースがあるのですが、ノーマライズ時に空白を除去しないよう
>> > > にすれば、区別することができました。Wikipediaを使った実験
>> > > ではヒット数のずれがなく検索速度を向上できています。
>> > > (その代わり少しインデックスサイズが増えます)
>> >
>> > あぁ、元のテキストには空白があるのに、検索キーワードには空白
>> > がなくてもヒットしてしまうんですね。なるほど。
>> >
>> > > この他、語彙表にストップワードのフラグを示すカラムを作ることに
>> > > より検索時のみトークンを飛ばすskip_stopwordや ステミング(英
>> > > 語の活用形を同一視させる処理)、あらかじめ除外させるトークン
>> > > のリストをキーとするテーブルを作って転置索引の対象外とさせるFilterStoptableとかいろいろな機能を指定できるようになっていま
>> > > す。
>> > >
>> > > 組合せ数がかなり多くなるため、最初にコマンドを使って必要な
>> > > 機能のみを組み合わせてトークナイザを登録させる仕組みにし
>> > > ています。
>> >
>> > いやぁ、この実装方法の発想はなかったです。
>> > たしかに、これでパラメーターを動的にカスタマイズできますね!
>> >
>> > ストップワードやステミングはトークナイザーに依存せずに使えそ
>> > うなので、Groonga本体でサポートするのがいい気がしました。
>> > Groonga本体でサポートしていればgrndumpも対応できますし。
>> >
>> > 森さん、どう思いますか?
>> > この実装方法でなじませられるかはまだわかっていませんが。。。
>> >
>> >
>> > > CentOS6/7、Debian wheezy/jessie、Ubuntu precise/trustyの
>> > > 64ビットについては、パッケージを用意しています。
>> > > (現状、リポジトリまでは用意していません。。あとFedoraはまだ
>> > > 4.0.5が更新されていないので、Fedoraはまだつくっていません。)
>> >
>> > すごいです!
>> >
>> > > Ngramトークナイザーで少しでも検索速度を上げたい場合や
>> > > ステミングやストップワードの機能を使いたい方は使ってみて
>> > > はいかがでしょうか。
>> >
>> > ぜひいろんな人に試してもらって感想を聞きたいです!
>> >
>> >
>> > --
>> > 須藤 功平 <kou****@clear*****>
>> > 株式会社クリアコード <http://www.clear-code.com/>
>> >
>> > Groongaベースの全文検索システムを総合サポート:
>> >   http://groonga.org/ja/support/
>> > パッチ採用 - プログラミングが楽しい人向けの採用プロセス:
>> >   http://www.clear-code.com/recruitment/
>> > コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ:
>> >   http://www.clear-code.com/services/code-reader/
>> >
>> > _______________________________________________
>> > groonga-dev mailing list
>> > groon****@lists*****
>> > http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>> >
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev




groonga-dev メーリングリストの案内
Back to archive index