如何在python中从带有特性列表字符串的tsv变成csr矩阵



我一直在使用一些R包,这些包从稀疏二进制矩阵计算(余弦((稀疏(相似性矩阵,例如proxyC

由于我现在也开始(并学习(使用python,而且有人告诉我它可能会更快,我想尝试在那里运行同样的计算。

我发现了这个有趣的帖子:

什么';在给定稀疏矩阵数据的情况下,Python中计算余弦相似度的最快方法是什么?

其描述了几种方法。

在亲手写下一个小测试矩阵后,我确实尝试了其中的一些
现在我想试试"真实"数据
这就是我遇到目前无法解决的问题的地方。

我的数据来自tsv文件,这些文件将对象(ID(与逗号分隔的功能列表(FP(相关联。例如:

ID  FP
1   A,B,C
2   A,D
3   C,D,F
4   A,F
5   E,H,M

我需要把它转换成一个稀疏的二进制矩阵
即使在R中,我也花了一些时间来找出最好的方法。
我首先用逗号列出strsplitFP,将FP列从字符向量变成字符向量列表。然后我unlistFP,将每个ID重复FP向量的lengths的次数,这给了我这个:

ID  FP
1   A
1   B
1   C
2   A
2   D
3   C
3   D
3   F
4   A
4   F
5   E
5   H
5   M

并利用xtabs:制作了稀疏二值特征矩阵

5 x 8 sparse Matrix of class "dgCMatrix"
FP
ID A B C D E F H M
1 1 1 1 . . . . .
2 1 . . 1 . . . .
3 . . 1 1 . 1 . .
4 1 . . . . 1 . .
5 . . . . 1 . 1 1

我确信在python中可以做到这一点(在这种情况下,从tsv文件到csr矩阵,如我链接的帖子中所述(,但我仍然是一个初学者,我怀疑我需要很长时间才能弄清楚所有细节并将其做好。

有人能帮我/给我指一下用例子描述必要步骤的帖子吗

谢谢!

import pandas as pd
df = pd.DataFrame({'ID':[1,2,3], 'FP':["A,B,C","A,D","C,D,F"]})
>>> df
ID     FP
0   1  A,B,C
1   2    A,D
2   3  C,D,F

拆分列并将其分解为长表

df['FP'] = df['FP'].str.split(",")
df = df.explode(column="FP")
>>> df
ID FP
0   1  A
0   1  B
0   1  C
1   2  A
1   2  D
2   3  C
2   3  D
2   3  F

对分类列进行编码

df['FP'] = df['FP'].astype('category')

将其写入稀疏矩阵:

from scipy.sparse import csr_matrix
import numpy as np
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'], df['FP'].cat.codes)))
>>> mat.A
array([[0., 0., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])

确保跟踪哪些列是哪些分类级别。如果愿意,也可以对ID列进行编码(如果它们不是0索引整数,这可能是个好主意(。

df['ID'] = df['ID'].astype('category')
mat = csr_matrix((np.ones(df.shape[0]), (df['ID'].cat.codes, df['FP'].cat.codes)))
>>> mat.A
array([[1., 1., 1., 0., 0.],
[1., 0., 0., 1., 0.],
[0., 0., 1., 1., 1.]])

再次,记录你的分类水平。

最新更新