Cálculo de puntajes tfidf separados para dos columnas diferentes usando sklearn

Estoy tratando de calcular la similitud entre un conjunto de consultas y un conjunto de resultados para cada consulta. Me gustaría hacer esto usando las puntuaciones de tfidf y la similitud de coseno. El problema que tengo es que no puedo entender cómo generar una matriz tfidf usando dos columnas (en un dataframe de pandas). He concatenado las dos columnas y funciona bien, pero es incómodo de usar ya que necesita hacer un seguimiento de qué consulta pertenece a qué resultado. ¿Cómo haría para calcular una matriz tfidf para dos columnas a la vez? Estoy usando pandas y sklearn.

Aquí está el código relevante:

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() 

Estoy tratando de pasar df_all [‘search_term’] y df_all [‘product_title’] como argumentos en tf.fit_transform. Esto claramente no funciona, ya que solo concatena las cadenas, lo que no me permite comparar el término de búsqueda con el título de producto. Además, ¿hay tal vez una mejor manera de hacer esto?

Has hecho un buen comienzo al juntar todas las palabras; a menudo, una tubería simple como esta será suficiente para producir buenos resultados. Puede construir tuberías de procesamiento de características más complejas utilizando la pipeline y el preprocessing . Aquí es cómo funcionaría para sus datos:

 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. ]]