[groonga-dev,01580] Re: groongaのトークナイザの改善について

Back to archive index

Kouhei Sutou kou****@clear*****
2013年 8月 7日 (水) 23:12:06 JST


須藤です。

In <CANM+****@mail*****>
  "[groonga-dev,01577] Re: groongaのトークナイザの改善について" on Wed, 7 Aug 2013 08:37:29 +0900,
  Naoya Murakami <visio****@gmail*****> wrote:

> プログラミングの知識は、大学でかじった程度ですが、所定以上の長さ以上にならないように
> 切り出す処理を追加するのは、groonga/lib/token.cをみると、
> ngram_next内の353,365行目とかの、GRN_STR_ISBLANKとかでbreakしているのをまねて、
> 所定の長さ以上になったらbreakするみたいな感じですかね?
> https://github.com/groonga/groonga/blob/master/lib/token.c

そうですね。そんな感じでいけると思います。
そのときのバイト数はcl - rでとれるので、それを使うとよいと思
います。

> token.cのngramのトークナイザをpluginにしてみて、適当にいじってみて遊ぼうかなあ、と思ったのですが、Cのpluginの開発について無知のため、トークナイザpluginのビルド方法について教えてください。
> 
> 以下のような手順で問題なかったでしょうか?
> 
> 1.groonga/plugin/tokenizerに<トークナイザ>.cを作る。
> 2.groonga/plugin/tokenizer/に<トークナイザ>_sources.amを作る。
> 3.groonga/plugin/tokenizer/Makefile.amを修正する。
> 4.groonga/configure.acを修正する。
> 5.sh autogen.shにより、configureを生成する。
> 6. ./configure CFLAGS="-O0 -g3" CXXFLAGS="-O0 -g3"する。(とりあえず、テストのため、最適化OFF)
> 7. make→make install

はい、groongaのパッケージの中にいれる場合はそれで大丈夫です。
ただ、そうするとgroongaがバージョンアップしたらそのたびに
Makefile.amの修正などをしないといけなくなりメンテナンスが面
倒になると思います。

groongaは別パッケージとしてトークナイザーを作ることができます。
ただ、これだけだとどうやるかわからないと思うので、1文字毎にトー
クナイズするサンプルトークナイザーを作ってみました。ライセン
スはパブリックドメインにしたので好きなようにコピーしたりして
構いません。

  https://github.com/groonga/groonga-tokenizer-sample

以下のようにビルド・インストールできます。

  % git clone https://github.com/groonga/groonga-tokenizer-sample.git
  % cd groonga-tokenizer-sample
  % ./autogen.sh
  % ./configure
  % make
  % sudo make install

テストもつけてあって、以下のようにすると実行できます。
(Ruby 1.9以上がインストールされている必要があります。)

  % test/run-test.sh

たぶん、こまかく挙動を確認したいと思うので便利だと思います。

テストツールはgrntestというもので↓に細かい説明があります。

  https://github.com/groonga/grntest

ざっくりいうと、こんな感じでテストを追加します。

  1. test/suite/${テスト名}.testを作り、その中にgroongaのコマンドを書く。
  2. test/run-test.shを実行する。
  3. .testの中のコマンドを実行した結果が
     test/suite/${テスト名}.actualにできるので中身を確認する。
  4. 中身が期待した結果だったら拡張子を.actualから.expected
     に変える。
  5. test/run-test.shを実行し、緑色になったらOK。


他、細かい説明は時間がとれたらしたいなぁと思いますが、
tokenizers/sample.cのsample_XXX()をいじるといいです。groonga
のlib/token.cのライセンスはLGPLv2なので、作ったものもLGPLv2
にすればlib/token.cをベースに作ってもOKです!


あと、もっと本格的なプラグインパッケージの作り方は
groonga-normalizer-mysqlが実例になります。こっちはトークナイ
ザーではなくノーマライザーですが、プラグインという観点では同
じなので共通で使えるものがいろいろあります。

  https://github.com/groonga/groonga-normalizer-mysql

> 昨日は、<トークナイザ>.la,lo,oファイルが生成されるところまで確認しましたが、goongaでtokenizeコマンドを実行しても、unknown
> tokenizerといわれたところでつまりました。

プラグインなので、使う前にregisterコマンドでgroongaに登録す
る必要があります。

たとえば、tokenizers/sample.soを読み込む場合は以下のようにな
ります。

  > register tokenizers/sample

参考: http://groonga.org/ja/docs/reference/commands/register.html

registerすれば使えるようになるはずです!


# だれか、groongaのプラグインの作り方勉強会を主催して。。。


-- 
須藤 功平 <kou****@clear*****>
株式会社クリアコード <http://www.clear-code.com/> (03-6231-7270)

groongaサポート:
  http://groonga.org/ja/support/
パッチ採用はじめました:
  http://www.clear-code.com/recruitment/
コミットへのコメントサービスはじめました:
  http://www.clear-code.com/services/commit-comment.html




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