我正在尝试用 Python 编写一个函数(仍然是菜鸟!),它返回按 tfidf 分数的内积排序的文档的索引和分数。程序是:
- 计算 doc
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)
哪里tfidf
是 sparse matrix of type '<type 'numpy.float64'>'
.
这似乎效率低下,因为排序执行了两次( sort()
然后是 argsort()
),然后必须反转结果。
- 可以更有效地完成这项工作吗?
- 这是否可以在不使用
toarray()
转换稀疏矩阵的情况下完成? ?
最佳答案
我认为没有必要跳过toarray
。 v
数组只有 n_docs
长,与 n_docs
× n_terms
tf- 的大小相比相形见绌实际情况下的 idf 矩阵。此外,它将非常密集,因为两个文档共享的任何术语都会使它们具有非零相似性。稀疏矩阵表示只有在您存储的矩阵非常稀疏时才有用(我已经看到 >80% 的 Matlab 数据并假设 Scipy 将是相似的,尽管我没有确切的图)。
双重排序可以跳过
v = v.toarray()
vi = np.argsort(v, axis=0)[::-1]
vs = v[vi]
顺便说一句,您在稀疏矩阵上使用 np.inner
不适用于最新版本的 NumPy;对两个稀疏矩阵进行内积的安全方法是
v = (tfidf * tfidf[idx, :]).transpose()
关于python - python中的反向排序和argsort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445323/