Python 将稀疏成对矩阵的结果分组

Python 将稀疏成对矩阵的结果分组,python,pandas,numpy,scikit-learn,Python,Pandas,Numpy,Scikit Learn,我有一个稀疏的成对矩阵(),它表示使用TF-IDF和余弦相似性的pandas.Series字符串之间的接近度。如果是稠密的,它看起来会像是一个更大的版本: [[0,0,0.3,0,0.8], [0.1,0,0,0,0.4], [0,0.9,0.6,0,0], [1,0.9,0,0,0.8], [0,0.4,0.3,0,0]] 两个轴均由系列表示,如下所示: ['Smith, David', 'Davis, Jenny', 'David Smith', 'Jennings, Brian'

我有一个稀疏的成对矩阵(
),它表示使用TF-IDF和余弦相似性的
pandas.Series
字符串之间的接近度。如果是稠密的,它看起来会像是一个更大的版本:

[[0,0,0.3,0,0.8],
 [0.1,0,0,0,0.4],
 [0,0.9,0.6,0,0],
 [1,0.9,0,0,0.8],
 [0,0.4,0.3,0,0]]
两个轴均由
系列表示,如下所示:

['Smith, David', 'Davis, Jenny', 'David Smith', 'Jennings, Brian']
我的目标是尽可能高效地对类似字符串进行分组(任何超过阈值的字符串,例如0.8)。结果可能如下所示(在任何数据结构中,不一定是散列,这只是一个示例):

我当前的方法利用坐标矩阵
zip
迭代非零条目:

from sklearn.metrics.pairwise import cosine_similarity

cx = cosine_similarity(tf_idf_matrix, dense_output=False).tocoo()

vals = df['Names']

for row, col, data in zip(cx.row, cx.col, cx.data):
    do_something(vals[row], vals[col], data)
这很管用,但一旦该系列的参赛作品超过100000条,速度就相当慢了,我觉得我错过了一些东西。有没有更有效的方法?也许是将轴绑定到数组并按我的阈值(0.8)进行过滤

我觉得这一定是一项相当普通的任务,但谷歌搜索对我毫无帮助


更新:

通过从使用
sklearn.metrics.pairwise.cosine\u similarity
切换到使用
sparse\u dot\u topn.awesome\u cossim\u topn
,我可以大大减少开销


这使我能够在构建矩阵时按阈值对其进行过滤,从而显著减少要循环的项的数量,并限制使用cx.data检查哪些项高于阈值的必要性。

IIUC您正在寻找类似的项

将熊猫作为pd导入
数据=[[0,0,0.3,0,0.8],
[0.1,0,0,0,0.4],
[0,0.9,0.6,0,0],
[1,0.9,0,0,0.8],
[0,0.4,0.3,0,0]]
姓名=['Smith,David','Davis,Jenny','David Smith',
“詹宁斯,布莱恩”,“布莱克,约翰”]
df=pd.DataFrame(数据,列=名称,索引=名称)
df=df[df>0.8]。取消堆栈()
打印(df[df.notnull()].reset_index())
level_0 level_1 0
0史密斯,大卫詹宁斯,布莱恩1.0
1戴维斯,詹妮·大卫·史密斯0.9
戴维斯,詹妮·詹宁斯,布莱恩0.9

从这里,您应该能够发挥您想要的输出。

请不要使用评论空间来获取此类附加信息-请编辑并更新您的帖子
from sklearn.metrics.pairwise import cosine_similarity

cx = cosine_similarity(tf_idf_matrix, dense_output=False).tocoo()

vals = df['Names']

for row, col, data in zip(cx.row, cx.col, cx.data):
    do_something(vals[row], vals[col], data)