Embeddingモデルを使ったテキスト検索は手軽で協力。一方で、キーワード検索と検索式も重要な手法の一つだ。検索結果の説明が楽にできるからだ。特に「ない」ことの証明をするのに、〇〇で検索してもヒットしなかった、という説明がしやすいからだ。というわけで、Pythonでお手軽にキーワード検索をできるwhooshを使って日本語検索のコードができないかお勉強しました。環境としてcolabを使い、geminiの助言も得ながら構築します。
whooshについて、開発状況を確かめたところwhooshのpypiのページでは、プロジェクトのリンク先が失われています。困りました。pypi.org
なんと、whoosh-community*1にあるレポジトリによると、メンテナンスがされてないとのこと。そこで、Forkして引き続き開発を有志で続けています。Sygil-Dev/whoosh-reloadedです。引き続きの開発・メンテナンスに関係者に感謝です。本家がどうなったのか、詳しい方いらっしゃいましたら、教えてください。
Whooshはpure pythonで書かれた全文検索エンジンで、簡単に検索機能を実現できます。
日本語での問題点は、形態素解析です。
1. 形態素解析エンジン
Janomeを使います。MeCabの方がスピード出ると思いますが、pythonだけで書きたいので採用。もちろん、他の形態素解析ライブラリを使っても良いと思います。
2. 分かち書きの取り扱い
形態素解析で得られた分かち書き(スペース区切り)の取り扱い。「自然言語」が仮に分かち書きで「自然 言語」となった場合、「自然言語」を検索してもヒットしない。検索語も予め形態素解析を実施しておく必要がある。
3. 分かち書きをした検索語の取り扱い
「自然言語 OR 要素」を検索した場合、形態素解析を実施して「自然 言語 OR 要素」と単純にしちゃうと狙った検索にならない。フレーズ検索を使うか、最低限「(自然 AND 言語) OR 要素」くらいな構成しないと・・・。
4. リザルトのパターンが増える。
組み合わせが増えるので、同じような箇所から、検索リザルトが返ってくる。解決できなかったので、同じタイトルからの重複は省くようにした。実用上は問題ないですけれども、未解決です。
「検索子を検索文に入れずに検索」するパターンと「検索子を検索文に入れ込んで検索」するパターンの2通りで試しました。
「検索子を検索文に入れずに検索」
「検索子を検索文に入れ込んで検索」
手軽に実装できました。。大規模な検索であればelastic searchといった本格的なものを使うのでしょう。colabあたりでさくっと使うには大変便利だと思いました。
今回はGeminiを多用しました。Colabから直接呼び出せて手軽に使えるのは便利です。今の時点では、Claude 3.5 Sonnetの方が賢い印象ですが、何が何でもClaude 3.5 Sonnetを使わなくてもGeminiでも役に立ってくれます。
気が付いたコツ
1. Notebook中の「エラーの説明」をクリックして新たなチャットを開始することになる。内容によってはどうどうめぐりになりがち。そこで、一連の問題については、「エラーの説明」をクリックせずにエラーメッセージや出力を同じチャットにポストし、やりとりの継続性を確保する。
2. デバグ用の出力を適宜入れ込み、その出力をGeminiへ情報として与える。
LLMを使ってもプログラムは楽しいですね。