python - python中的反向排序和argsort

标签 python numpy scipy information-retrieval sparse-matrix

我正在尝试用 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)

哪里tfidfsparse matrix of type '<type 'numpy.float64'>' .

这似乎效率低下,因为排序执行了两次( sort() 然后是 argsort() ),然后必须反转结果。

  • 可以更有效地完成这项工作吗?
  • 这是否可以在不使用 toarray() 转换稀疏矩阵的情况下完成? ?

最佳答案

我认为没有必要跳过toarrayv 数组只有 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/

相关文章:

python - 在 hackerrank 竞赛中导入 numpy

python - numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 之间的区别

python - 如何在 keras 中使用 lambda 层?

python - 客户购买/收听行为的 "similar products/music/..."统计计算是如何工作的?

python - 属性 numpy.dtype.base 的用途/状态

python - 正确读取/绘制由 '>' 分隔的数据

python - SciPy interp2d(linear) 结果不同于 MatLab interp2(linear)

python - 使用 scipy truncnorm 拟合数据

python - Python sshtunnel-如何验证SSH连接?

使用 API 获取 json 中的 xml 数据的 python 脚本