2016-04-20 10 views
2

Ich versuche, die Ähnlichkeit zwischen einer Reihe von Abfragen zu berechnen und ein Ergebnis für jede Abfrage festlegen. Ich würde dies gerne mit Tfidf-Scores und Kosinusähnlichkeit tun. Das Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie man eine Tfidf-Matrix unter Verwendung von zwei Spalten (in einem Pandas-Datenrahmen) erzeugt. Ich habe die zwei Spalten verkettet und es funktioniert gut, aber es ist umständlich zu verwenden, da es verfolgen muss, welche Abfrage zu welchem ​​Ergebnis gehört. Wie würde ich eine tfidf-Matrix für zwei Spalten gleichzeitig berechnen? Ich benutze Pandas und Sklearn.Berechnung separater Tfidf-Scores für zwei verschiedene Spalten mit sklearn

Hier ist der entsprechende Code:

tf = TfidfVectorizer(analyzer='word', min_df = 0) 
tfidf_matrix = tf.fit_transform(df_all['search_term'] + df_all['product_title']) # This line is the issue 
feature_names = tf.get_feature_names() 

Ich versuche df_all zu passieren [ 'search_term'] und df_all [ 'PRODUCT_TITLE'] als Argumente in tf.fit_transform. Dies funktioniert eindeutig nicht, da es nur die Strings zusammenfügt, was es mir nicht erlaubt, den Suchbegriff mit dem Produkttitel zu vergleichen. Gibt es vielleicht auch einen besseren Weg?

+0

Sie benötigen einen Platz in wie dieses 'df_all [‚search_term‘] +„“+ df_all [‚PRODUCT_TITLE‘] hinzuzufügen' andere weise können Sie die ersten sein, die Kombination von Wort des Produkts mit dem letzten Wort der Suche – maxymoo

+0

auch brauchen Sie nicht analyzer = Wort, da dies der Standardwert ist – maxymoo

+0

Die Zeile in meinem Code ist nicht das, was ich will, ich möchte die Begriffe und Produkte zu getrennt sein, damit ich die Kosinusähnlichkeit zwischen der Suche und dem Produkt berechnen kann. – David

Antwort

1

Sie haben einen guten Anfang gemacht, indem Sie einfach alle Wörter zusammengefügt haben; Oft genügt eine einfache Pipeline, um gute Ergebnisse zu erzielen. Mit pipeline und preprocessing können Sie komplexere Feature-Verarbeitungspipelines erstellen. Hier ist, wie es wäre für Ihre Daten arbeiten:

import pandas as pd 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.preprocessing import FunctionTransformer 
from sklearn.pipeline import FeatureUnion, Pipeline 

df_all = pd.DataFrame({'search_term':['hat','cat'], 
         'product_title':['hat stand','cat in hat']}) 

transformer = FeatureUnion([ 
       ('search_term_tfidf', 
        Pipeline([('extract_field', 
           FunctionTransformer(lambda x: x['search_term'], 
                validate=False)), 
          ('tfidf', 
           TfidfVectorizer())])), 
       ('product_title_tfidf', 
        Pipeline([('extract_field', 
           FunctionTransformer(lambda x: x['product_title'], 
                validate=False)), 
          ('tfidf', 
           TfidfVectorizer())]))]) 

transformer.fit(df_all) 

search_vocab = transformer.transformer_list[0][1].steps[1][1].get_feature_names() 
product_vocab = transformer.transformer_list[1][1].steps[1][1].get_feature_names() 
vocab = search_vocab + product_vocab 

print(vocab) 
print(transformer.transform(df_all).toarray()) 

['cat', 'hat', 'cat', 'hat', 'in', 'stand'] 

[[ 0.   1.   0.   0.57973867 0.   0.81480247] 
[ 1.   0.   0.6316672 0.44943642 0.6316672 0.  ]] 
+0

Danke für Ihre Hilfe. Ich versuche das herauszufinden, aber ich kann nicht herausfinden, was es zurückgibt. Wenn ich es leite, bekomme ich keine TFIDF-Matrix, gibt es mir etwas anderes? Soll es auch auf df_all zugreifen? Es scheint überhaupt nicht so zu sein ... – David

+0

Ich habe eine Beispielrechnung hinzugefügt, um die Dinge hoffentlich klarer zu machen. um ehrlich zu sein, kann ich nicht genau herausfinden, welche Variante von tf-idf verwendet wird, ich denke, es könnte Log-Frequenzen verwenden, obwohl in der Dokumentation sagt es nicht – maxymoo

+0

dieser Typ hat einige Notizen zusammen, die kann Dinge klären https://github.com/rasbt/pattern_classification/blob/master/machine_learning/scikit-learn/tfidf_scikit-learn.ipynb – maxymoo

Verwandte Themen