CSR是scipy.sparse中的一种存储系数矩阵的格式,计算两个CSR行向量可以用sklearn的cosine_similarity(v1,v2)[0,0]
函数,但是速度极慢。于是动手造轮子。
下面两层for循环对于系数向量来说其实很小,因为向量的列没有排序,所以只能用for 循环,再次排序再进行线性操作在这种数据量小的情况下没有意义。
len_v1 = len_v2 = v1_dot_v2 = 0
for i in range(v1.nnz):
col1 = v1.indices[i]
data1 = v1.data[i]
len_v1 += data1 * data1
for j in range(v2.nnz):
col2 = v2.indices[j]
data2 = v2.data[j]
if col1 == col2:
v1_dot_v2 += data1 * data2
if i == 0:
len_v2 += data2 * data2
# aaa = cosine_similarity(v1,v2)[0,0]
# bbb = v1_dot_v2 / math.sqrt(len_v1 * len_v2)
return v1_dot_v2 / math.sqrt(len_v1 * len_v2)