toshio_uchiy****@mirro*****
toshio_uchiy****@mirro*****
2017年 7月 21日 (金) 12:06:45 JST
かずひこ様 情報、ありがとうございます。 PyStemmer という python のパッケージを使えば、複数言語のステミングが 可能なのですね。 話は私の展開しているサービスの運用方法になります。毎週、ロボットを 起動し、YouTube から字幕をダウンロードして字幕を増やしています。これは、 ロボットサーバーでおこなっています。現在、字幕は 45万タイトル分、 6500万行くらいあります。これが、一週間で2万タイトル分くらい増えます。 これとは別に、検索サーバーがあります。毎週、検索サーバーのデータを ロボットサーバーのデータでアップデートしています。増加分だけではなく、 一旦、全部のデータを truncate して copy で増えた新しいテーブルをインポート しています。そして、PGRoonga の索引を付けます。字幕テーブルについては、字幕と 動画名の二つの列にトークナイザー、TokenMecab の索引を作っています。これに30分 くらいかかります。 PyStemmer を使ってステミングをしてから PostgreSQL にインポートするという処理を おこなうと、現在、検索サーバーデータのアップデートにかかっている時間1時間30分程度が 大幅に伸びそうです。現実的ではない感じがします。 この前、PGRoonga では、更新しながら検索できます。という記事を読みましたので、 チャンスがあったら、ロボットサーバーと検索サーバーを同じサーバーにできるか 検討してみます。 スニペットも表示しています。これは、ステミングしない元データのテーブルとステミングした テーブルの両方を持ち、検索はステミングしたテーブルを検索し、スニペットに表示する 内容は、id 番号で join して表示すれば良いかな?と思いました。検索時間がどのくらいに なるかですね。Id にインデックスをつけておけば行けそうですが。メモリーを食いそうですね。 そんなわけで、貴重な経験をお聞かせいただいて参考になりましたが、今回は、要検討という 結論です。 サービスのユーザーには利便性を提供できなくて申し訳ないです。 -----Original Message----- From: groon****@lists***** [mailto:groon****@lists*****] On Behalf Of Kazuhiko Sent: Thursday, July 20, 2017 8:33 PM To: groon****@lists***** Subject: [groonga-dev,04407] Re: 日本語、英語、仏語のまざった文章で複数形や過去形をフォローできますでしょうか こんにちは、かずひこです。 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がいいのかとか、ひとつのエントリに複数の言語がある場合はどうするのかとか、解決すべき課題はいろいろありそうです。 かずひこ _______________________________________________ groonga-dev mailing list groon****@lists***** http://lists.osdn.me/mailman/listinfo/groonga-dev