2017-10-16 7 views
0

Je veux utiliser TfidfVectorizer() sur un fichier qui contient plusieurs lignes, chacune une phrase. Je veux ensuite prendre un fichier de test avec un petit sous-ensemble de phrases, faire TfidfVectorizer() et ensuite prendre la similitude cosinus entre l'original et le fichier de test afin que pour une phrase donnée dans le fichier de test, je récupère les N meilleurs résultats le fichier original. Voici ma tentative:Python: comparer des éléments dans deux matrices tfidf différentes de dimensions différentes

corpus = tuple(open("original.txt").read().split('\n')) 
test = tuple(open("test.txt").read().split('\n')) 


from sklearn.feature_extraction.text import TfidfVectorizer 

tf = TfidfVectorizer(analyzer='word', ngram_range=(1,3), min_df = 0, stop_words = 'english') 
tfidf_matrix = tf.fit_transform(corpus) 
tfidf_matrix2 = tf.fit_transform(test) 

from sklearn.metrics.pairwise import linear_kernel 


def new_find_similar(tfidf_matrix2, index, tfidf_matrix, top_n = 5): 
    cosine_similarities = linear_kernel(tfidf_matrix2[index:index+1], tfidf_matrix).flatten() 
    related_docs_indices = [i for i in cosine_similarities.argsort()[::-1] if i != index] 
    return [(index, cosine_similarities[index]) for index in related_docs_indices][0:top_n] 


for index, score in find_similar(tfidf_matrix, 1234567): 
     print score, corpus[index] 

Cependant, je reçois:

for index, score in new_find_similar(tfidf_matrix2, 1000, tfidf_matrix): 
     print score, test[index] 
Traceback (most recent call last): 

    File "<ipython-input-53-2bf1cd465991>", line 1, in <module> 
    for index, score in new_find_similar(tfidf_matrix2, 1000, tfidf_matrix): 

    File "<ipython-input-51-da874b8d3076>", line 2, in new_find_similar 
    cosine_similarities = linear_kernel(tfidf_matrix2[index:index+1], tfidf_matrix).flatten() 

    File "C:\Users\arron\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\metrics\pairwise.py", line 734, in linear_kernel 
    X, Y = check_pairwise_arrays(X, Y) 

    File "C:\Users\arron\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\metrics\pairwise.py", line 122, in check_pairwise_arrays 
    X.shape[1], Y.shape[1])) 

ValueError: Incompatible dimension for X and Y matrices: X.shape[1] == 66662 while Y.shape[1] == 3332088 

Je ne me dérangerait pas de combiner les deux fichiers, puis transformer, mais je veux b que je ne compare pas l'une des phrases de le fichier de test avec d'autres phrases dans le fichier de test.

Des pointeurs?

Répondre

1

Monter le TfidfVectorizer avec les données de corpus, puis transformer les données de test avec le vectorizer déjà monté (à savoir, ne pas appeler fit_transform deux fois):

tfidf_matrix = tf.fit_transform(corpus) 
tfidf_matrix2 = tf.transform(test) 
+0

excellents merci beaucoup. – brucezepplin