Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
検索の仕組みを知ってみよう~入門編~
Search
yuki
January 28, 2023
Technology
0
190
検索の仕組みを知ってみよう~入門編~
yuki
January 28, 2023
Tweet
Share
Other Decks in Technology
See All in Technology
寫了幾年 Code,然後呢?軟體工程師必須重新認識的 DevOps
cheng_wei_chen
1
1.2k
[JAWS-UG 横浜支部 #91]DevOps Agent vs CloudWatch Investigations -比較と実践-
sh_fk2
1
250
小さな判断で育つ、大きな意思決定力 / 20251204 Takahiro Kinjo
shift_evolve
PRO
1
590
品質のための共通認識
kakehashi
PRO
3
230
AWSを使う上で最低限知っておきたいセキュリティ研修を社内で実施した話 ~みんなでやるセキュリティ~
maimyyym
2
250
評価駆動開発で不確実性を制御する - MLflow 3が支えるエージェント開発
databricksjapan
1
110
AI時代の開発フローとともに気を付けたいこと
kkamegawa
0
2.7k
法人支出管理領域におけるソフトウェアアーキテクチャに基づいたテスト戦略の実践
ogugu9
1
220
日本Rubyの会の構造と実行とあと何か / hokurikurk01
takahashim
4
1k
20251209_WAKECareer_生成AIを活用した設計・開発プロセス
syobochim
5
1.4k
AI駆動開発における設計思想 認知負荷を下げるフロントエンドアーキテクチャ/ 20251211 Teppei Hanai
shift_evolve
PRO
2
300
生成AI時代におけるグローバル戦略思考
taka_aki
0
120
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
4.9k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.6k
Code Review Best Practice
trishagee
74
19k
The Cost Of JavaScript in 2023
addyosmani
55
9.3k
Making Projects Easy
brettharned
120
6.5k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.1k
How to train your dragon (web standard)
notwaldorf
97
6.4k
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
Context Engineering - Making Every Token Count
addyosmani
9
500
We Have a Design System, Now What?
morganepeng
54
7.9k
Transcript
検索の仕組みを知ってみよう ~入門編~ 2020
自己紹介 名前: yuki (twitter: @yuki_pnn) しがないエンジニア 趣味: たまに同人漫画のシナリオ書き バドミントン
検索使ってますか?
ブログ記事の一覧から 「特定の単語」が含まれているものを検索したい SNSで過去の投稿一覧から 「特定の単語」が含まれている投稿を検索したい 例えば… などなど
検索ってどう実装されているか知っていますか?
注意点 ・ここから先の話は説明のために簡略化をしています ・知っている人は生暖かく見守っていてください ・間違った説明をしているかもしれません 何か指摘があれば登壇終了後に指摘をお願いします💦
検索ってどんなロジックで動いているの? 知りたいですよね…? というわけで検索のアルゴリズムやデータ構造のお話です 全文検索のお話をします
検索でよく使うOSS elasticsearch ・多分検索エンジンの中で一番有名 ・いろんなところで使われている ・分散型の検索エンジンで大規模サービスにも耐えれる solrなんかも検索エンジンとして有名
実はコア部分に同じOSSが使われています 「Apache Lucene」(アパッチ ルシーン) ・OSSの全文検索エンジン/ライブラリ(Java) ・検索に必要な機能が色々詰まっているやつ ・大体これを使って検索エンジン/サーバを実装している Apache Projectの守備範囲広い…
今日は以下の機能について話していきます ・全文検索を支えるデータ構造 ・全文検索でのスコアリング方法 ・「もしかして◦◦?」のサジェストを実現するには?
シンプルな検索を考えてみる クエリ:「晴れ」 文書1:「今日の天気は雨」 文書2:「明日の天気は晴れ」 文書3:「明後日の天気は曇り」 これくらいなら文書全てを総当たりしてもよさそう
じゃあ文書の数が100万件あった場合は?
高速に単語を検索するアルゴリズムを使う? いい感じに検索しやすいデータ構造に変える?
「明日の天気は晴れ」 「明日」「天気」「晴れ」 単語分割(形態素解析 + ストップワード除去) ① 全文検索を支えるデータ構造: 転置インデックス 単語から文書を引けるようにする 今日 :文書1
明日 :文書2 明後日 :文書3 天気 :文書1, 文書2, 文書3 晴れ :文書2 曇り :文書3 雨 :文書1 ② これで単語から文章を探すのが簡単になる
文書は探せるけど表示する順番はどう決めるか? いい感じのスコアを決めたい
単純に考えると 長い文章の一部だとあんまり重要じゃなさそう? たまに出現する単語だとそこまで嬉しくないかも? 文章の主題に調べたい単語があれば嬉しいかも
計算式 tf-idf(単語i, 文章j) = tf(単語i, 文章j) ・idf(単語i) 全文検索でのスコアリング方法: TF-IDF 特定の文章内の単語がどれくらい重要か示す値
文章j内での単語iの出現回数 文章jのすべての単語の出現回数の和 tf(単語i, 文章j) = idf(単語i, 文章j) = 全ての文章数 単語iが出現する文章数 log ( )
転置インデックス (調べたい対象の文章) tf-idf Query 転置インデックス(データ構造)と tf-idf(スコアリング)を組み合わせて高速な検索を実現 実際はtf-idfを拡張したBM25を使ったりクエリをもう少し解析したりする
単純な検索はそれっぽくできそうだけど… こんな感じでいい感じに近い単語をサジェストしたい
その前に一つ重要な考え方(技術?)を紹介 nGram bi-gram tri-gram 等…
例えば「国土交通省」のような単語があった場合 bi-gram 「国土」「土交」「交通」「通省」 tri-gram 「国土交」「土交通」「交通省」 のように文字数で分割する
すごくざっくりな「もしかして検索」の実装方針 n-gramでクエリを分割する 転置インデックスに対してn-gramが含まれる単語を検索する ヒットした単語とクエリの文字列編集距離を計算しスコアとする スコアが最も高い単語を「もしかして?」と表示する 1. 2. 3. 4. 他にも細かいところはあるけど大体こんな感じ(なはず)
編集距離って? 単語iを別の単語jに変形するのに必要な最小手順数 例 「ハックバー」 「テックバー」 編集距離: 2 「スコップ」 「コップ」 編集距離:
1 Levenshtein Distanceなんかが有名 実際はjaro-winkler Distanceなんかが使われる
普段よく使う検索機能 実際に中の処理を見てみると奥が深い! 今回説明をしたのもかなり簡略化したもの…
興味があればいろいろと調べてみてください! 検索だけでなく身近にある機能も仕組みを 調べると面白いものが多いはず
まとめ ・(全文)検索を実現するために「転置インデックス」なる構造がある ・検索のスコアを決めるために「tf-idf(BM25)」などのアルゴリズムがある ・n-gramや編集距離を使って「もしかして検索」を実現d