BoW化した文章同士の類似度を求める一番メジャーなやり方。
内積の定義を式変形しただけ。
$$
\begin{eqnarray}
cos(\vec{q},\vec{d}) &=& \frac{\vec{q}\cdot \vec{d}}{|\vec{q}| \cdot |\vec{d}|} \\
&=& \frac{\vec{q}}{|\vec{q}|} \cdot \frac{\vec{d}}{|\vec{d}|} \\
&=& \frac{\sum_{i=1}^{|V|}q_i d_i}{\sqrt{\sum_{i=1}^{|V|}q_i^2} \cdot \sqrt{\sum_{i=1}^{|V|}d_i^2}}
\end{eqnarray}
$$
BoWが正規化された単位ベクトルの場合は分母が1になるから、
$$
cos(\vec{q},\vec{d}) = \vec{q} \cdot \vec{d} = \sum_{i=1}^{|V|} q_i d_i
$$
次元が3以下の場合はベクトルがどれだけ同じ向きを向いているか、という説明で十分だけど、4以上の場合は結局「類似」のような言葉になってしまう。
範囲
シュワルツの不等式というのがあって、
$$
\sum_{i=1}^{n} p_i^2 \cdot \sum_{i=1}^{n} d_i^2 \geq \sum_{i=1}^{n} p_i d_i
$$
コサイン類似度の分子は分母以下であることが決まる。
シュワルツの不等式の等号が成り立つとき、
コサイン類似度の分子と分母が同じとなり1となる。
pi, di のいずれかが 0のとき、qidiは0となる。
全部0となるとき、コサイン類似度の分子は0となる。
だから、定義の上ではコサイン類似度は0以上1以下だと思うんだ。
類似度?
BoW化してタームの頻度を要素とした時点で、ベクトルは意味を持たないことになるから、ベクトル同士のコサイン類似度を取ったところでベクトル同士が似た意味を持つとは言えない。単にタームの出現頻度が似ているというだけ。
BoWではなく、特徴量を要素とするベクトル同士のコサイン類似度をとったのであればベクトル同士の特徴量が似ていることを表す。
文章をなんとか直交する特徴量からなるベクトルで表現することができれば、意味の類似度を求めることができる。
tf-idfに触れずに書くとこんな感じ。
文章が短いと
文章が短いと、文章がだいぶ異なるのに出現頻度は近い、という状況が起きやすくなり、あてにならなくなる。