検索の仕組みを知ってみよう~入門編~2020
View Slide
自己紹介名前: yuki(twitter: @yuki_pnn)しがないエンジニア趣味: たまに同人漫画のシナリオ書き バドミントン
検索使ってますか?
ブログ記事の一覧から「特定の単語」が含まれているものを検索したいSNSで過去の投稿一覧から「特定の単語」が含まれている投稿を検索したい例えば…などなど
検索ってどう実装されているか知っていますか?
注意点・ここから先の話は説明のために簡略化をしています・知っている人は生暖かく見守っていてください・間違った説明をしているかもしれません 何か指摘があれば登壇終了後に指摘をお願いします💦
検索ってどんなロジックで動いているの?知りたいですよね…?というわけで検索のアルゴリズムやデータ構造のお話です全文検索のお話をします
検索でよく使うOSSelasticsearch ・多分検索エンジンの中で一番有名 ・いろんなところで使われている ・分散型の検索エンジンで大規模サービスにも耐えれる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-idfQuery転置インデックス(データ構造)とtf-idf(スコアリング)を組み合わせて高速な検索を実現実際はtf-idfを拡張したBM25を使ったりクエリをもう少し解析したりする
単純な検索はそれっぽくできそうだけど…こんな感じでいい感じに近い単語をサジェストしたい
その前に一つ重要な考え方(技術?)を紹介nGrambi-gramtri-gram 等…
例えば「国土交通省」のような単語があった場合bi-gram「国土」「土交」「交通」「通省」tri-gram「国土交」「土交通」「交通省」のように文字数で分割する
すごくざっくりな「もしかして検索」の実装方針n-gramでクエリを分割する転置インデックスに対してn-gramが含まれる単語を検索するヒットした単語とクエリの文字列編集距離を計算しスコアとするスコアが最も高い単語を「もしかして?」と表示する1.2.3.4.他にも細かいところはあるけど大体こんな感じ(なはず)
編集距離って?単語iを別の単語jに変形するのに必要な最小手順数例「ハックバー」「テックバー」編集距離: 2「スコップ」「コップ」編集距離: 1Levenshtein Distanceなんかが有名実際はjaro-winkler Distanceなんかが使われる
普段よく使う検索機能実際に中の処理を見てみると奥が深い!今回説明をしたのもかなり簡略化したもの…
興味があればいろいろと調べてみてください!検索だけでなく身近にある機能も仕組みを調べると面白いものが多いはず
まとめ・(全文)検索を実現するために「転置インデックス」なる構造がある・検索のスコアを決めるために「tf-idf(BM25)」などのアルゴリズムがある・n-gramや編集距離を使って「もしかして検索」を実現d