大量のデータ・・・という訳でもなく、数千文程度のテキストを検索したい。調べてみると「Elasticsearch/Solr」や「Tantivy/Xapian」といったものがヒット。データ量も少ないので、やっぱりwhooshを利用することに・・・。他にお手軽な日本語検索ライブラリが出てくると良いですね。embeddingによるベクトル検索ではなく、キーワード検索も大事です。
以前は複雑なクエリを利用して全文検索を実装するお試しは以前実施しました。
whooshがメンテされなくなったので、Forkして最近まで頑張っていたwhoosh-reloadedですが、ついに・・・「Notice: This repository (whoosh-reloaded) is NO LONGER MAINTAINED.」とメンテの終了が告げられていました。残念です。
今後の展開に期待しつつ、wooshを利用させていただいて、キーワード検索を実装してみます。形態素解析にはSudahiPYを組み合わせます。Sudachiには辞書の粒度によって3つのモードがあります。「Aモード」「Bモード」「Cモード」です。
モード 分割粒度 特徴 Aモード 最も細かい単位 語を最小単位まで分割。接辞や複合語も細かく分解される。 Bモード 中間レベル 接辞付き語などを1単位として扱う。実用的な分割。 Cモード 分割なし 辞書に登録された語をそのまま出力。複合語も1語として扱う。
キーワード検索の場合、未知語がある可能性がある場合は、粒度が細かい方が有利です。一方で、複合語でも辞書にあるものは当然重要だろうと推測されます。そこで、3つのモードそれぞれで評価し、ウェイトを付けてスコアリングします。N-gramでやってもいいのかもしれませんが、辞書登録してあるものが上位に来る方が使いやすいですよね。
こんな感じでスコアが付きます。今回はJson形式のデータを用いて、それぞれの項目でマッチングができるようにしています。
[Test 1] 検索: '日本電波塔'
- DOC ID: 1, Score: 16.3936, 著者: Author A
- DOC ID: 3, Score: 14.1742, 著者: Author A[Test 2] 検索: '安全調査'
- DOC ID: 2, Score: 13.1207, 著者: Author B
今回利用したColabノートブックです。