Kazuhiko
kazuh****@fdiar*****
2017年 7月 20日 (木) 20:32:41 JST
こんにちは、かずひこです。 On 07/18/2017 08:35 AM, Susumu Yata wrote: > 英語やフランス語の活用による変化を検索で無視する方法としては, > ステミングを使うことが多いかと思います. > PGroonga, Groonga のドキュメントにおいては,以下のページに記述が見つかりました. > > - CREATE INDEX USING pgroonga | PGroonga > - https://pgroonga.github.io/ja/reference/create-index-using-pgroonga.html#custom-token-filters > - 7.9. トークンフィルター — Groonga v7.0.4ドキュメント > - http://groonga.org/ja/docs/reference/token_filters.html > > ただ,実装を見る限りでは,英語用のステミングとなっているようです. > > groonga/plugins/token_filters/stem.c > 54: const char *algorithm = "english"; > 55: const char *encoding = "UTF_8"; > 56: token_filter->stemmer = sb_stemmer_new(algorithm, encoding); > > これを真似して "english" のところを "french" にすれば, > フランス語用のステミングプラグインを用意できそうな気はしますが, > フランス語について無知なので断言できません. はい、それでいけるはずです。ソースを見た感じだと、以下が使えそうです。 danish dutch english finnish french german hungarian italian norwegian porter portuguese romanian russian spanish swedish turkish > 後は,もし同じカラムに日本語,英語,フランス語が格納されているのであれば, > どれを適用するかが問題になると思います. > > 解決方法としては,以下のような選択肢が思い浮かびました. > > - 言語によってカラムを分割する. > - あらかじめデータを言語別に分けなければならない. > - 英語用とフランス語用のステミングを両方とも適用する. > - 副作用で検索の精度が下がる恐れがある. > > 参考になりましたら幸いです. Mroonga を使って、英語、フランス語、ドイツ語、オランダ語のステミング対応全文検索を実装したことがあるのですが、その時は以下のようにしました(私のケースも、ひとつのエントリはひとつの言語)。 * 登録時は、各テキストを、PyStemmerを使って各単語をそれぞれの文書の言語でステミングした結果にして、それをMroongaに格納する The quick brown fox jumps over the lazy dog. ↓ the quick brown fox jump over the lazi dog. * 検索時は、入力キーワード(群)を、PyStemmerを使って指定された言語で各単語をステミングし、その結果でMroongaで検索する jumping dogs ↓ jump dog どの文書にヒットするかを得るだけなら、このやり方でいい感じに実装できました。 ただ、スニペットを表示したいのなら、Mroonga標準のスニペット関数を使えないので、自力でどうにかする必要があります。 そのあたりがMroonga/PGroongaだけでうまくできるようになったら幸せなのですが、どんなAPIがいいのかとか、ひとつのエントリに複数の言語がある場合はどうするのかとか、解決すべき課題はいろいろありそうです。 かずひこ