我试图计算熊猫数据帧中两列之间的tf-idf向量余弦相似性一列包含搜索查询,另一列包含产品标题。余弦相似度值是搜索引擎/排名机器学习算法的“特征”。
我在一个ipython笔记本上做这个,不幸的是遇到了记事本,不知道为什么经过几个小时的挖掘。
我的设置:
联想E560笔记本电脑
核心i7-6500U,2.50ghz
16 GB内存
窗口10
使用anaconda 3.5内核更新所有库
我已经根据一个类似的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)

这给出了以下结果(很好!)输出:
                   a                 b  tfidf_cosine_similarity
0         hello world        my name is                 0.000000
1          my name is       hello world                 0.000000
2  what is your name?  my name is what?                 0.725628
3      max cosine sim    max cosine sim                 1.000000

但是,当我尝试将相同的方法应用于维度为186154x 5的数据帧(df_all_export)(其中5列中有2列是查询(search_term)和文档(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

在这个问题上完全迷失了方向,但我担心解决方案会非常简单和优雅:)
提前谢谢你!

最佳答案

您仍然可以使用sklearn.metrics.pairwise方法使用稀疏矩阵/数组:

# I've executed your example up to (including):
# ...
clf.fit(df['a'] + " " + df['b'])

A = clf.transform(df['a'])

B = clf.transform(df['b'])

from sklearn.metrics.pairwise import *

paired_cosine_distances将显示字符串的距离或差异(逐行比较两列中的值)
0-表示完全匹配
In [136]: paired_cosine_distances(A, B)
Out[136]: array([ 1.        ,  1.        ,  0.27437247,  0.        ])

cosine_similarity将第一列字符串与列中的所有字符串(第1行)进行比较;第二列字符串与列中的所有字符串(第2行)进行比较,依此类推……
In [137]: cosine_similarity(A, B)
Out[137]:
array([[ 0.        ,  1.        ,  0.        ,  0.        ],
       [ 1.        ,  0.        ,  0.74162106,  0.        ],
       [ 0.43929881,  0.        ,  0.72562753,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  1.        ]])

In [141]: A
Out[141]:
<4x10 sparse matrix of type '<class 'numpy.float64'>'
        with 12 stored elements in Compressed Sparse Row format>

In [142]: B
Out[142]:
<4x10 sparse matrix of type '<class 'numpy.float64'>'
        with 12 stored elements in Compressed Sparse Row format>

注意:所有的计算都是用稀疏矩阵完成的-我们没有在内存中解压它们!

关于python - Python:计算Pandas中两列之间的tf-idf余弦相似度时出现MemoryError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42965181/

10-10 13:27