gpt4 book ai didi

python - 如何使用已计算的 TFIDF 分数计算余弦相似度

转载 作者:行者123 更新时间:2023-12-01 09:26:16 25 4
gpt4 key购买 nike

我需要计算具有已计算的 TFIDF 分数的文档之间的余弦相似度。

通常我会使用(例如)TFIDFVectorizer这将创建一个文档/术语矩阵,并计算 TFIDF 分数。我无法应用此方法,因为它将重新计算 TFIDF 分数。这是不正确的,因为文档已经进行了大量的预处理,包括词袋和 IDF 过滤(我不会解释原因 - 太长了)。

示例性输入 CSV 文件:

Doc, Term,    TFIDF score
1, apples, 0.3
1, bananas, 0.7
2, apples, 0.1
2, pears, 0.9
3, apples, 0.6
3, bananas, 0.2
3, pears, 0.2

我需要生成通常由 TFIDFVectorizer 生成的矩阵,例如:

  | apples | bananas | pears
1 | 0.3 | 0.7 | 0
2 | 0.1 | 0 | 0.9
3 | 0.6 | 0.2 | 0.2

...这样我就可以计算文档之间的余弦相似度。

我使用的是 Python 2.7,但欢迎提供其他解决方案或工具的建议。我无法轻松切换到 Python 3。

编辑:

这并不是真正的转置 numpy 数组。它涉及将 TFIDF 分数映射到文档/术语矩阵,并使用标记化术语,并将缺失值填充为 0。

最佳答案

我建议使用scipy.sparse中的稀疏矩阵

from scipy.sparse import csr_matrix, coo_matrix
from sklearn.metrics.pairwise import cosine_similarity

input="""Doc, Term, TFIDF score
1, apples, 0.3
1, bananas, 0.7
2, apples, 0.1
2, pears, 0.9
3, apples, 0.6
3, bananas, 0.2
3, pears, 0.2"""

voc = {}

# sparse matrix representation: the coefficient
# with coordinates (rows[i], cols[i]) contains value data[i]
rows, cols, data = [], [], []

for line in input.split("\n")[1:]: # dismiss header

doc, term, tfidf = line.replace(" ", "").split(",")

rows.append(int(doc))

# map each vocabulary item to an int
if term not in voc:
voc[term] = len(voc)

cols.append(voc[term])
data.append(float(tfidf))

doc_term_matrix = coo_matrix((data, (rows, cols)))

# compressed sparse row matrix (type of sparse matrix with fast row slicing)
sparse_row_matrix = doc_term_matrix.tocsr()

print("Sparse matrix")
print(sparse_row_matrix.toarray()) # convert to array

# compute similarity between each pair of documents
similarities = cosine_similarity(sparse_row_matrix)

print("Similarity matrix")
print(similarities)

输出:

Sparse matrix
[[0. 0. 0. ]
[0.3 0.7 0. ]
[0.1 0. 0.9]
[0.6 0.2 0.2]]
Similarity matrix
[[0. 0. 0. 0. ]
[0. 1. 0.04350111 0.63344607]
[0. 0.04350111 1. 0.39955629]
[0. 0.63344607 0.39955629 1. ]]

关于python - 如何使用已计算的 TFIDF 分数计算余弦相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50368930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com