2013-09-03 1 views
1

웹에서 tf-idf와 코사인 유사성을 계산하는 파이썬 튜토리얼을 발견했습니다. 나는 그것으로 놀고 그것을 조금 바꾸려고 노력하고있다.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은 토큰 화 된 텍스트입니다. 당신은 그런 sklearn 같은 다른 패키지를 시도 할 경우

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 

답변

1

다음은

이 코드는이 part-I, part-II, part-III 자습서에

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) 

가 참조 도움이 될하려고합니다. 도움이 될 수 있습니다.

+0

이미이 라이브러리를 사용해 보았습니다. 문제는 텍스트를 준비하기 위해 자체 기능을 사용하고 싶다는 것이 었습니다 (스톱 어스 및 형태소 분석 제거) – Tasos

관련 문제