tdc*_*tdc 14 python information-retrieval numpy scipy sparse-matrix
我正在尝试用Python编写一个函数(仍然是一个noob!),它返回由tfidf分数的内积所排序的索引和分数.程序是:
idx和所有其他文档之间计算内部产品的向量我目前的代码是:
import h5py
import numpy as np
def get_related(tfidf, idx) :
''' return the top documents '''
# calculate inner product
v = np.inner(tfidf, tfidf[idx].transpose())
# sort
vs = np.sort(v.toarray(), axis=0)[::-1]
scores = vs[1:,]
# sort indices
vi = np.argsort(v.toarray(), axis=0)[::-1]
idxs = vi[1:,]
return (scores, idxs)
Run Code Online (Sandbox Code Playgroud)
这里tfidf是一个sparse matrix of type '<type 'numpy.float64'>'.
这似乎效率低下,因为排序执行了两次(sort()然后argsort()),结果必须反过来.
toarray()吗?我认为没有必要跳过这个toarray.该v阵列只有n_docs很长,在实际情况下,它与n_docs× n_termstf-idf矩阵的大小相形见绌.此外,它将非常密集,因为两个文档共享的任何术语将使它们具有非零相似性.当您存储的矩阵非常稀疏时,稀疏矩阵表示只会得到回报(我已经看到Matlab的数据> 80%,并且假设Scipy会相似,尽管我没有确切的数字).
通过这样做可以跳过双重排序
v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]
Run Code Online (Sandbox Code Playgroud)
顺便说一下,你np.inner对稀疏矩阵的使用不适用于最新版本的NumPy; 采用两个稀疏矩阵的内积的安全方法是
v = (tfidf * tfidf[idx, :]).transpose()
Run Code Online (Sandbox Code Playgroud)