使用 sklearn 计算两个不同列的单独 tfidf 分数
Computing separate tfidf scores for two different columns using sklearn
我正在尝试计算一组查询与每个查询的一组结果之间的相似度。我想使用 tfidf 分数和余弦相似度来做到这一点。我遇到的问题是我无法弄清楚如何使用两列(在 pandas 数据帧中)生成 tfidf 矩阵。我连接了两列并且它工作正常,但使用起来很尴尬,因为它需要跟踪哪个查询属于哪个结果。我将如何一次计算两列的 tfidf 矩阵?我正在使用 pandas 和 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_transform。这显然不起作用,因为它只是将字符串连接在一起,这不允许我将 search_term 与 product_title 进行比较。另外,是否有更好的方法来解决这个问题?
你把所有的单词放在一起就开了个好头;通常像这样的简单管道就足以产生良好的结果。您可以使用 pipeline
和 preprocessing
构建更复杂的特征处理管道。以下是它如何处理您的数据:
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. ]]
我正在尝试计算一组查询与每个查询的一组结果之间的相似度。我想使用 tfidf 分数和余弦相似度来做到这一点。我遇到的问题是我无法弄清楚如何使用两列(在 pandas 数据帧中)生成 tfidf 矩阵。我连接了两列并且它工作正常,但使用起来很尴尬,因为它需要跟踪哪个查询属于哪个结果。我将如何一次计算两列的 tfidf 矩阵?我正在使用 pandas 和 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_transform。这显然不起作用,因为它只是将字符串连接在一起,这不允许我将 search_term 与 product_title 进行比较。另外,是否有更好的方法来解决这个问题?
你把所有的单词放在一起就开了个好头;通常像这样的简单管道就足以产生良好的结果。您可以使用 pipeline
和 preprocessing
构建更复杂的特征处理管道。以下是它如何处理您的数据:
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. ]]