Я нашел в Интернете учебник по Python для вычисления подобия tf-idf и косинуса. Я пытаюсь поиграть с ним и немного изменить его.
Проблема в том, что у меня странные результаты и почти без смысла.
Например, я использую 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]]
Сначала я подумал, что числа на главной диагонали должны быть 1, а не 0. После этого показатель сходства для 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