【stemming】文書のベクトル表現とコサイン類似度

文書のベクトル表現と文書間の類似度測定手段としてのコサイン類似度 (cosine similarity) についての備忘録です。

bag-of-words

出現頻度をを表すが, 語順の情報を持たない文書のベクトル表現を bag-of-wordsと言います。
言語表現を数学の世界に持って行きベクトルで表すことでコサイン類似度など数学的処理で測ることができます。

bag-of-bigrams

bag-of-bigrams もベクトル表現ですが, bag-of-wordsと違う点は n-gramによって語順の情報が多少残っていることです。

文書に対する前処理

stopword

話題と関連がない単語を stopword と言います。例えば, “on”や”is”, “have”などどんな話題でも出現する可能性が一定確率あります。
現代では stopwordであっても,特定の時代によっては使われやすいとはあるかもしれないので文書が書かれた時代を推定するのには使えるかも。

stemming

派生語を同一と見なす事をステミングと言います。代表的な手法をPorter’s Stemmer

見出語化

“walked” を “walk” にするなど, 単語を基本形に戻すことを見出語化といいます。

コサイン類似度

例として, 次の2つの英文について考えます。

S1: “A Cat sat on the mat.”
S2: “Cats are sitting on the mat.”

英文を One-Hot ベクトル表現 (One-Hot Vector representation) に変換します。

 \begin{flushleft*}\\ x^{s1} = (n("a", s1),n("are", s1),n("cat", s1),n("cats", s1),n("mat", s1),n("on", s1),\\   n("sat", s1),n("sitting", s1),n("the", s1))\\  = (1, 0, 1, 0, 1, 1, 1, 0, 1)\\  \\ x^{s2} = (n("a", s2),n("are", s2),n("cat", s2),n("cats", s2),n("mat", s2),n("on", s2),\\   n("sat", s2),n("sitting", s2),n("the", s2)) \\  = (0, 1, 0, 1, 1, 1, 0, 1, 1)\\ \end{flushleft*}

2つのベクトルの内積から cosθ を計算して, それが1に近い程2つのベクトルが似ていて, -1に近い程似ていないというのがコサイン類似度の考え方です。

 \begin{flushleft*} x^{s1} \cdot x^{s2} = |x^{s1}||x^{s2}|cos\theta \end{flushleft*}

内積を計算。

 \begin{flushleft*} x^{s1}\cdot x^{s2} = 1*0 + 0*1 + 1*0 + 1*1 + 1*1 + 1*0 + 0*1 + 1*1 = 3 \end{flushleft*}

各ベクトルのノルム。

 \begin{flushleft*}\\ |x^{s1}| = \sqrt{6}\\ |x^{s2}| = \sqrt{6} \end{flushleft*}

cosθを計算します。

 \begin{flushleft*} sim cos(x^{s1},x^{s2}) = x^{s1} \cdot x^{s2} / |x^{s1}| \cdot |x^{s2}| = 1/2 \end{flushleft*}

コサイン類似度は 1/2 になりました。

次に “are” を “be” のように見出し語として前処理してからコサイン類似度を計算してみます。

 \begin{flushleft*}\\ x^{s1} = (n("a", s1),n("be", s1),n("cat", s1),n("mat", s1),n("on", s1),n("sit", s1),n("the", s1))\\  = (1, 0, 1, 1, 1, 1, 1)\\  \\ x^{s2} = (n("a", s2),n("be", s2),n("cat", s2),n("mat", s2),n("on", s2),n("sit", s2),n("the", s2))\\  = (0, 1, 1, 1, 1, 1, 1)\\ \end{flushleft*}

内積を計算。

 \begin{flushleft*} x^{s1} \cdot x^{s2} = 1*0 + 0*1 + 1*1 + 1*1 + 1*1 + 1*1 + 1*1 = 5 \end{flushleft*}

各ベクトルのノルム。

 \begin{flushleft*}\\ |x^{s1}| = \sqrt{6}\\ |x^{s2}| = \sqrt{6} \end{flushleft*}

コサイン類似度は 5/6 になりました。

 \begin{flushleft*} sim cos(x^{s1},x^{s2}) = x^{s1}\cdot x^{s2} / |x^{s1}| \cdot |x^{s2}| = 5/6 \end{flushleft*}

stemming同様、見出し語化は素性(特徴)をまとめ上げる効果があります。

また, 日本語のベクトル化では英語のようにスペースで区切られていないので単語分割が必要です。さらに, 辞書が大きいと文書のベクトル表現で 0ばかり出現する疎なベクトルとなり, 必要な統計量が求められなくなってしまうデータスパースネス問題に対してはスムージングなどの対策が必要となります。

本記事の参考書籍は言語処理のための機械学習入門 (自然言語処理シリーズ)です。

[1] TF-IDFCos類似度推定法-Qiita