JavaScript

文書の類似度検索を 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]
ベースとなる文書集合のそれぞれの文書と、検索文書との類似度を求める。
結果
(参考)Python sklearn
めでたく一致!

全ソースコード

document_similarity.js