本文へ移動

G検定(ジェネラリスト検定)

こさいんるいじど

コサイン類似度

Cosine Similarity

コサイン類似度は、2つのベクトルの向きがどれだけ近いかを測る指標です。2つのベクトルの内積を、それぞれのユークリッド長(ベクトルの長さ)の積で割って求めます。文書を単語の出現頻度のベクトルで表すベクトル空間モデルでは、文書の長さの影響を取り除いて、2つの文書の内容の近さを比べるための標準的な方法として使われます。

詳しい説明

どんな問題を解くための指標か

情報検索の教科書であるマニング(Manning)、ラガヴァン(Raghavan)、シュッツェ(Schütze)の Introduction to Information Retrieval(2008年)は、文書の集まりを共通のベクトル空間の中のベクトルとして表す考え方を、ベクトル空間モデルと呼んでいます。たとえば、各文書で car、auto、insurance、best という4つの単語が何回出てくるかを並べると、1つの文書を4つの数の組、つまり4次元のベクトルとして表せます。

このように表したとき、2つの文書がどれだけ似ているかを数値で表したくなります。同書は、まず2つの文書ベクトルの差の大きさを使う方法を考え、その欠点を指摘しています。内容がとても似た2つの文書でも、片方がもう片方よりずっと長いというだけで、ベクトルの差が大きくなってしまうのです。長い文書ほど、どの単語の出現回数も全体として大きくなるので、話題の配分が同じでもベクトルの長さが大きく違ってしまいます。

コサイン類似度の考え方

同書は、この文書の長さの影響を補正するための標準的な方法として、2つの文書ベクトルのコサイン類似度を計算することを挙げています。計算の組み立ては次の2つの部分から成ります。

  • 分子は、2つのベクトルの内積です。内積は、同じ単語どうしの値を掛け合わせ、それを全部の単語について足し合わせたものです。
  • 分母は、2つのベクトルのユークリッド長の積です。ユークリッド長は、ベクトルの各成分を2乗して足し合わせ、その平方根をとった値で、ベクトルの長さにあたります。

同書によれば、分母で割ることの効果は、それぞれのベクトルを長さ1のベクトル(単位ベクトル)に正規化することです。言い換えると、各文書ベクトルをまず自分の長さで割って長さ1にそろえ、そのうえで内積をとる、という手順と同じになります。長さをそろえてしまうので、残るのはベクトルの向き、つまり単語の配分の割合だけです。これが、コサイン類似度がベクトルの向きの近さを測る指標だと言われる理由です。

長さで割る正規化を数値でたどる

同書の Example 6.2 は、3つの文書 Doc1、Doc2、Doc3 について、car、auto、insurance、best の4語の出現頻度を、それぞれの文書のユークリッド長で割って正規化した表を示しています。各文書のベクトルの長さ(成分の2乗和の平方根)は、Doc1 が 30.56、Doc2 が 46.84、Doc3 が 41.30 で、各成分をこの値で割っています。正規化した結果は次のとおりです。

文書carautoinsurancebest
Doc10.880.1000.46
Doc20.090.710.710
Doc30.5800.700.41

正規化によって長さが1になっていることは、表の値で確かめられます。Doc1 の各成分を2乗すると 0.7744、0.01、0、0.2116 で、足すと約 0.996 になり、ほぼ1です。Doc2 は 0.0081、0.5041、0.5041、0 で合計は約 1.016、Doc3 は 0.3364、0、0.49、0.1681 で合計は約 0.995 です。どれも1からのずれは小数第2位での四捨五入によるもので、もとの長さが 30.56 でも 46.84 でも、正規化の後はすべて長さ1にそろっています。

長さ1にそろえた後は、内積をとるだけでコサイン類似度になります。表の値から計算すると次のようになります。

  • Doc1 と Doc2: car どうしの 0.88 と 0.09 の積が約 0.079、auto どうしの 0.10 と 0.71 の積が 0.071、insurance と best はどちらかが0なので積も0です。合計は約 0.15 です。
  • Doc1 と Doc3: car どうしの積が約 0.510、best どうしの 0.46 と 0.41 の積が約 0.189 で、合計は約 0.70 です。
  • Doc2 と Doc3: car どうしの積が約 0.052、insurance どうしの 0.71 と 0.70 の積が約 0.497 で、合計は約 0.55 です。

この数値からは、car と best をともに多く含む Doc1 と Doc3 がいちばん近く、insurance を共通に持たない Doc1 と Doc2 がいちばん遠い、と読み取れます。また、長さ1のベクトルを自分自身と掛け合わせると成分の2乗和、つまり1になるので、向きがまったく同じ文書どうしの値は1になります。反対に、共通して現れる単語が1つも無ければ、どの積も0になるので値は0です。

3つの小説の近さを比べる

同書の Example 6.3 は、同じ手順を小説に当てはめています。対象は Sense and Sensibility(SaS)、Pride and Prejudice(PaP)、Wuthering Heights(WH)の3作品で、affection、jealous、gossip の3語の出現回数を正規化した値は次のとおりです。

単語SaSPaPWH
affection0.9960.9930.847
jealous0.0870.1200.466
gossip0.01700.254

同書は、この正規化した値どうしの内積、つまりコサイン類似度を使えば、3作品のうちどの2つが似ているかを比べられると説明しています。表の値から計算すると次のようになります。

  • SaS と PaP: 0.996 と 0.993 の積が約 0.989、0.087 と 0.120 の積が約 0.010、gossip は PaP が0なので積も0で、合計は約 0.999 です。
  • SaS と WH: 0.996 と 0.847 の積が約 0.844、0.087 と 0.466 の積が約 0.041、0.017 と 0.254 の積が約 0.004 で、合計は約 0.888 です。
  • PaP と WH: 0.993 と 0.847 の積が約 0.841、0.120 と 0.466 の積が約 0.056、gossip の積は0で、合計は約 0.897 です。

SaS と PaP はどちらも affection がほとんどを占め、jealous と gossip が少ないという配分がよく似ているため、値がほぼ1になります。WH は jealous と gossip の割合が大きいので、ほかの2作品との値が下がります。3作品は長さの違う別々の小説ですが、長さの影響を取り除いたうえで、単語の配分がどれだけ近いかを1つの数値で並べて比べられます。

ベクトルの差の大きさとの違い

2つのベクトルの近さを測る方法には、ここまでの話の出発点にあった、2つのベクトルの差そのものの大きさ(長さ)を測る方法もあります。この差の長さを測る指標はユークリッド距離と呼ばれます。差の大きさはベクトルの長さの違いをそのまま拾うのに対し、コサイン類似度はそれぞれの長さで割って向きだけを比べるので、文書の長さのような大きさの違いの影響を受けにくいという性質を持ちます。

試験で問われること

G検定

  • コサイン類似度が、2つのベクトルの内積を、それぞれのユークリッド長(ベクトルの長さ)の積で割って求める指標であることを説明できますか。
  • 文書ベクトルどうしの差の大きさで似ている度合いを測ると、内容が似ていても片方が長いだけで差が大きくなってしまうという問題と、コサイン類似度がそれをどう補正するかを確認しておきましょう。
  • ベクトルを自分の長さで割って長さ1の単位ベクトルにそろえると、その後は内積をとるだけでコサイン類似度になり、ベクトルの向きだけが比べられることを説明できますか。
  • 差の長さを測るユークリッド距離と比べて、コサイン類似度はベクトルの向きの近さを見るため、長さの違いの影響を受けにくいという違いを確認しておきましょう。

最終更新日: 2026/09/23