我试图计算Pandas数据帧中两列之间的tf-idf向量余弦相似性。一列包含搜索查询,另一列包含产品标题。余弦相似度值是搜索引擎/排名机器学习算法的一个“特征”。在
我在iPython笔记本上做这件事,不幸的是遇到了内存错误,经过几个小时的挖掘,我不知道为什么。在
我的设置:
我在一个小玩具数据集上测试了我的代码/目标,结果是类似的stackoverflow问题:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from scipy import spatial
clf = TfidfVectorizer()
a = ['hello world', 'my name is', 'what is your name?', 'max cosine sim']
b = ['my name is', 'hello world', 'my name is what?', 'max cosine sim']
df = pd.DataFrame(data={'a':a, 'b':b})
clf.fit(df['a'] + " " + df['b'])
tfidf_a = clf.transform(df['a']).todense()
tfidf_b = clf.transform(df['b']).todense()
row_similarities = [1 - spatial.distance.cosine(tfidf_a[x],tfidf_b[x]) for x in range(len(tfidf_a)) ]
df['tfidf_cosine_similarity'] = row_similarities
print(df)
这给出了以下结果(好!)输出:
^{pr2}$但是,当我尝试将相同的方法应用于维度为186154x5的数据帧(df_all_export)(其中5列中的2列是查询(search_term)和document(product_title)):
clf.fit(df_all_export['search_term'] + " " + df_all_export['product_title'])
tfidf_a = clf.transform(df_all_export['search_term']).todense()
tfidf_b = clf.transform(df_all_export['product_title']).todense()
row_similarities = [1 - spatial.distance.cosine(tfidf_a[x],tfidf_b[x]) for x in range(len(tfidf_a)) ]
df_all_export['tfidf_cosine_similarity'] = row_similarities
df_all_export.head()
我得到…(这里没有给出全部错误,但你明白了):
MemoryError Traceback (most recent call last)
<ipython-input-27-8308fcfa8f9f> in <module>()
12 clf.fit(df_all_export['search_term'] + " " + df_all_export['product_title'])
13
---> 14 tfidf_a = clf.transform(df_all_export['search_term']).todense()
15 tfidf_b = clf.transform(df_all_export['product_title']).todense()
16
在这一点上完全迷失了方向,但我担心解决方案会非常简单和优雅:)
提前谢谢你!在
在上面由MaxU发布的友好帮助和解决方案下,这里我展示了完成我试图实现的任务的完整代码。除了
MemoryError
当我尝试一些“老掉牙”的解决方法时,它还避免了余弦相似性计算中出现的奇怪的nan。在请注意,下面的代码是一个部分代码片段,从这个意义上说,具有
186,134 x 5
的大数据帧df_all_export
已经在完整代码中构建。在我希望这能帮助那些试图使用tf-idf向量计算搜索查询和匹配文档之间的余弦相似度的人。对于这样一个常见的“问题”,我很难找到一个明确的解决方案来实现SKLearn和Pandas。在
您仍然可以使用sklearn.metrics.pairwise方法处理稀疏矩阵/数组:
paired_cosine_distances
将向您显示字符串有多远或有多大差异(比较两列中的值“逐行”)
^{pr2}$0
-表示完全匹配cosine_similarity
将比较第a
列的第一个字符串与第b
(行1)中的所有字符串;第二个列a
与第{注意:所有的计算都是用稀疏的矩阵完成的-我们没有在内存中解压缩它们!在
相关问题 更多 >
编程相关推荐