文書の類似度検索を JavaScriptで実装してみる
コサイン類似度を利用した文書の類似度検索を JavaScriptで実装してみる。
Excelファイルの類似度検索(tf-idf)の Python 実装のポイントで示した例題と同じ入力データを使い、Pythonで実装した手順をJavaScriptで実装し、同じ結果になるか試してみた。
結果は、途中の tf-idf値は少し異なるが、最終的な類似度は完全に一致した。(なぜ一致するのかよく分からないが)
テストデータ
ベースの文書集合の単語リスト
結果
ベース文書集合の term frequency(tf)を求める
tf = 文書Aにおける単語Xの出現回数 / 文書Aにおける全単語の出現回数
結果
(参考)Python sklearn
ベース文書集合の inverse document frequency(idf)を求める
idf = log( 全文書数 / 単語Xを含む文書数 + 1)
一般的には、ゼロ徐算を避けるために単語を含む文書数をプラス1する。なお Python sklearnでは、2種類の異なる計算式が定義されている。それぞれの式により結果は微妙に違ってくる。ここでは、sklearnのデフォルトの設定と同じものを採用している。
結果
(参考)Python sklearn
ベース文書集合の tf-idfを求める
tf-idf = tf * idf
結果
(参考)Python sklearn
検索文書の tf-idfを求める
tf値の計算は、ベース文書集合を元に作成した単語リストを利用する。idf値は、ベース文書集合を元に計算したものを用いる。
結果
(参考)Python sklearn
類似度の計算
ベクトルAとベクトルBのコサイン類似度は次の式から求まる。値は -1 ≤ 0 ≤ 1 の範囲。
![[cos_sim2]](/math/6/cos_sim2.png)
ベースとなる文書集合のそれぞれの文書と、検索文書との類似度を求める。
結果
(参考)Python sklearn
めでたく一致!