萌えハッカーニュースリーダー

2025/05/20 09:58 A simple search engine from scratch

出典: https://bernsteinbear.com/blog/simple-search/
hakase
博士

やっほー、ロボ子!今日はブログ記事の検索エンジンをword2vecで作る話をするぞ!

roboko
ロボ子

word2vecですか、博士!確か単語をベクトル空間に埋め込む技術でしたよね。

hakase
博士

そうそう!記事によると、検索クエリとブログ記事をベクトル空間に埋め込んで、コサイン類似度でランキングするらしいのじゃ。

roboko
ロボ子

コサイン類似度を使うんですね。ベクトルの角度で関連度を測るってことですね。

hakase
博士

その通り!記事では、単語を300次元の空間にマッピングしてるみたいじゃな。各次元が意味の軸に対応してるってのが面白いぞ。

roboko
ロボ子

300次元ですか!想像もできませんね。ブログ記事全体をベクトル化するにはどうするんですか?

hakase
博士

記事内の単語の埋め込みを加算するらしいぞ。例えば、「猫」と「かわいい」という単語があったら、それぞれのベクトルを足し合わせる感じじゃな。

roboko
ロボ子

なるほど!単純ですが、効果がありそうですね。でも、単語の埋め込みはどうやって手に入れるんですか?

hakase
博士

上位10,000語の単語埋め込みデータベース(12MBのpickleファイル)を使うみたいじゃ。記事では、辞書で単語を検索して埋め込むって書いてあるぞ。

roboko
ロボ子

12MBなら、比較的小さいですね。検索エンジンのインデックス作成も自動化されているんですか?

hakase
博士

再帰的なディレクトリトラバーサルで、パス名と埋め込みをマッピングする辞書を作るみたいじゃな。`normalize_text`を使って、句読点とか大文字小文字のノイズを除去するのもポイントじゃ。

roboko
ロボ子

`normalize_text`、便利そうですね!検索REPLも作れるんですね。Pythonの`code`ライブラリを使うんですか。

hakase
博士

そう!`runsource`メソッドを定義して、入力を処理するみたいじゃ。`search`関数を作って、既存の関数を統合するのも良いアイデアじゃな。

roboko
ロボ子

Web検索フロントエンドもGitHub Pagesでホストできるんですね。SQLiteデータベースを分割して、HTTP Rangeリクエストを使うのは効率的ですね。

hakase
博士

HTTP Rangeリクエストで必要な重みの部分だけダウンロードするってのがミソじゃな。賢い!

roboko
ロボ子

検索エンジンの性能評価も重要ですよね。(ドキュメント, クエリ)のペアの評価データセットを収集して、トップk精度メトリックを実装するんですね。

hakase
博士

ベースライン検索エンジンと比較することで、word embeddingsの効果を測るってわけじゃな。

roboko
ロボ子

今後のアイデアとして、TF-IDFを使ってドキュメント間で共通の単語を減らすのも良いですね。

hakase
博士

そうじゃな!各ドキュメントに固有の単語に焦点を当てることで、検索精度が上がりそうじゃ。しかし、この記事、なかなか面白いことを言っておるの。

roboko
ロボ子

本当ですね、博士!私も勉強になりました。

hakase
博士

ところでロボ子、検索エンジンのデバッグって、まるで宝探しみたいじゃない?

roboko
ロボ子

そうですね、博士。バグという名の宝を探す旅ですね!

hakase
博士

でも、バグが見つかった時の喜びは、宝を見つけた時よりも小さいのじゃ…!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search