tf-idf と余弦類似度を計算するための Web 上の Python チュートリアルを見つけました。私はそれで遊んで、少し変えようとしています。
問題は、奇妙な結果が得られ、ほとんど意味がないことです。
たとえば、3 つのドキュメントを使用しています。[doc1,doc2,doc3]
doc1 と doc2 は類似していますが、doc3 はまったく異なります。
結果は次のとおりです。
[[ 0.00000000e+00 2.20351188e-01 9.04357868e-01]
[ 2.20351188e-01 -2.22044605e-16 8.82546765e-01]
[ 9.04357868e-01 8.82546765e-01 -2.22044605e-16]]
まず、主対角線の数字は 0 ではなく 1 であるべきだと考えました。その後、doc1 と doc2 の類似度スコアは約 0.22、doc1 と doc3 の類似度スコアは約 0.90 になりました。私は反対の結果を期待していました。私のコードを確認して、なぜこれらの結果が得られたのかを理解するのを手伝ってもらえますか?
doc1、doc2、doc3 はトークン化されたテキストです。
articles = [doc1,doc2,doc3]
corpus = []
for article in articles:
for word in article:
corpus.append(word)
def freq(word, article):
return article.count(word)
def wordCount(article):
return len(article)
def numDocsContaining(word,articles):
count = 0
for article in articles:
if word in article:
count += 1
return count
def tf(word, article):
return (freq(word,article) / float(wordCount(article)))
def idf(word, articles):
return math.log(len(articles) / (1 + numDocsContaining(word,articles)))
def tfidf(word, document, documentList):
return (tf(word,document) * idf(word,documentList))
feature_vectors=[]
for article in articles:
vec=[]
for word in corpus:
if word in article:
vec.append(tfidf(word, article, corpus))
else:
vec.append(0)
feature_vectors.append(vec)
n=len(articles)
mat = numpy.empty((n, n))
for i in xrange(0,n):
for j in xrange(0,n):
mat[i][j] = nltk.cluster.util.cosine_distance(feature_vectors[i],feature_vectors[j])
print mat