Python 使用sklearn计算两个不同列的单独tfidf分数

Python 使用sklearn计算两个不同列的单独tfidf分数,python,pandas,scikit-learn,tf-idf,Python,Pandas,Scikit Learn,Tf Idf,我试图计算一组查询和一组查询之间的相似性,并为每个查询生成一个结果。我想使用tfidf分数和余弦相似性来实现这一点。我遇到的问题是,我不知道如何使用两列(在数据帧中)生成tfidf矩阵。我已经连接了这两个列,它工作得很好,但是使用起来很麻烦,因为它需要跟踪哪个查询属于哪个结果。如何一次计算两列的tfidf矩阵?我在用熊猫和sklearn 以下是相关代码: tf = TfidfVectorizer(analyzer='word', min_df = 0) tfidf_matrix = tf.fit

我试图计算一组查询和一组查询之间的相似性,并为每个查询生成一个结果。我想使用tfidf分数和余弦相似性来实现这一点。我遇到的问题是,我不知道如何使用两列(在数据帧中)生成tfidf矩阵。我已经连接了这两个列,它工作得很好,但是使用起来很麻烦,因为它需要跟踪哪个查询属于哪个结果。如何一次计算两列的tfidf矩阵?我在用熊猫和sklearn

以下是相关代码:

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

我试图将df_all['search_term']和df_all['product_title']作为参数传递到tf.fit_转换中。这显然不起作用,因为它只是将字符串连接在一起,这不允许我将搜索项与产品标题进行比较。还有,有没有更好的方法呢?

把所有的单词放在一起,你就有了一个好的开始;通常,这样一个简单的管道就足以产生好的结果。您可以使用
管道
预处理
构建更复杂的特征处理管道。以下是它如何处理您的数据:

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

您需要像这样在
df_all['search_term']+''+df_all['product_title']]
中添加一个空格,否则您可能会将产品的第一个单词与搜索的最后一个单词组合在一起,您也不需要
analyzer=word
,因为这是默认值,代码中的行不是我想要的,我希望术语和产品是分开的,这样我就可以计算搜索和产品之间的余弦相似性。我知道,我只是说,如果你试图将它们结合在一起,你需要添加空格,你需要在未来的某个时候使用这个来帮你。我试图弄明白,但我似乎无法弄清楚它返回了什么。当我运行它时,我没有得到tfidf矩阵,它是否给了我其他东西?还有,它应该访问df_all吗?它看起来根本没有被引用……我添加了一个计算示例,希望能让事情变得更清楚。老实说,我不知道tf idf使用的是什么变体,我认为它可能使用了日志频率,尽管在文档中说它没有)这家伙把一些注释放在一起,可能会澄清一些事情,我建议使用传统函数而不是lambda,因为lambda可能会导致意外行为。看,我建议也使用这样的变压器