TF-IDF в питоне и нежелательные результаты

Я нашел в Интернете учебник по 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

person Tasos    schedule 03.09.2013    source источник


Ответы (1)


если вы можете попробовать любой другой пакет, такой как sklearn, попробуйте его

этот код может помочь

from sklearn.feature_extraction.text import TfidfTransformer
from nltk.corpus import stopwords
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
import numpy.linalg as LA
from sklearn.feature_extraction.text import TfidfVectorizer


f = open("/root/Myfolder/scoringDocuments/doc1")
doc1 = str.decode(f.read(), "UTF-8", "ignore")
f = open("/root/Myfolder/scoringDocuments/doc2")
doc2 = str.decode(f.read(), "UTF-8", "ignore")
f = open("/root/Myfolder/scoringDocuments/doc3")
doc3 = str.decode(f.read(), "UTF-8", "ignore")

train_set = [doc1, doc2, doc3]

test_set = ["age salman khan wife"] #Query 
stopWords = stopwords.words('english')

tfidf_vectorizer = TfidfVectorizer(stop_words = stopWords)
tfidf_matrix_test =  tfidf_vectorizer.fit_transform(test_set)
print tfidf_vectorizer.vocabulary_
tfidf_matrix_train = tfidf_vectorizer.transform(train_set) #finds the tfidf score with normalization
print 'Fit Vectorizer to train set', tfidf_matrix_train.todense()
print 'Transform Vectorizer to test set', tfidf_matrix_test.todense()

print "\n\ncosine simlarity not separated sets cosine scores ==> ", cosine_similarity(tfidf_matrix_test, tfidf_matrix_train)

обратитесь к этому руководству часть-I,часть II,часть III. Это может помочь.

person Gunjan    schedule 23.09.2013
comment
Я уже пробовал эту библиотеку. Проблема заключалась в том, что я хочу использовать свои собственные функции для подготовки текста (удалить стоп-слова и корень) - person Tasos; 23.09.2013