やってみよう

検索したい文(クエリ)を打ち込むと、1文字打つごとに文書がコサイン類似度の高い順に並び替わります。クエリと文書はどちらも内容語(名詞・動詞・形容詞・形状詞)の TF-IDF ベクトルにしてから、なす角のコサインで近さを測っています。共通する単語が1つもないと類似度は 0 です ──「人工知能を学びたい」で検索してみると、意味は近いのに 0 になる語彙の壁を体験できます。

クエリの内容語

検索結果(コサイン類似度の高い順)

文書数 \(N\)
–
語彙数
–
最高スコア
–
クエリと各文書のなす角 θ(番号は検索結果の順位)

実際のベクトルは語彙の数だけ次元があります。ここでは 1 本ずつのなす角だけを平面に描いています。θ が小さいほど cos θ が 1 に近く、共通語がなければ θ = 90° です。

計算のしかた
\[\cos(q, d) = \frac{q \cdot d}{\lVert q \rVert \, \lVert d \rVert}\] \[\text{TF}(t, d) = \frac{t \text{ の出現回数}}{d \text{ の総語数}}\] \[\text{IDF}(t) = \log \frac{N}{t \text{ を含む文書数}}\]

内積を両方のノルムで割るので、文書の長さに影響されず「向き=内容の傾向」だけを比べられます。値は −1〜1 で、同じ向きなら 1、共通語なしなら 0 です。実際の検索システムでは Embedding モデルで文を密なベクトルに変換し、同じコサイン類似度でランキングします。