python - 如何计算文档对和查询之间的相似度?

标签 python machine-learning scikit-learn feature-extraction

我有一个非常大的数据集,它本质上是文档-搜索查询对,我想计算每对的相似度。我已经为每个文档和查询计算了 TF-IDF。我意识到给定两个向量,您可以使用 linear_kernel 计算相似度。但是,我不确定如何在非常大的数据集上执行此操作(即没有 for 循环)。

这是我目前所拥有的:

import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel

df_train = pd.read_csv('train.csv')

vectorizer = TfidfVectorizer()
doc_tfidf = vectorizer.fit_transform(df_train["document"])
query_tfidf = vectorizer.transform(df_train["query"])

linear_kernel(doc_tfidf, query_tfidf)

现在这给了我一个 NxN 矩阵,其中 N 是我拥有的文档-查询对的数量。我正在寻找的是 N 大小的向量,每个文档查询对都有一个值。

我知道我可以用 for 循环来做到这一点,但是对于大约 500K 对的数据集,这是行不通的。有什么方法可以矢量化这个计算吗?

更新:所以我认为我有一个有效且似乎很快的解决方案。在上面的代码中,我替换了:

linear_kernel(doc_tfidf, query_tfidf)

df_train['similarity'] = desc_tfidf.multiply(query_tfidf).sum(axis=1)

这看起来是一种明智的方法吗?有更好的方法吗?

最佳答案

Cosine similarity通常用于计算文本文档之间的相似度,在 scikit-learn 中是在 sklearn.metrics.pairwise.cosine_similarity 中实现的.

但是,因为TfidfVectorizer默认情况下还对结果执行 L2 归一化(即 norm='l2'),在这种情况下,计算点积以获得余弦相似度就足够了。

因此,在您的示例中,您应该使用,

similarity = doc_tfidf.dot(query_tfidf.T).T

而不是逐元素乘法。

关于python - 如何计算文档对和查询之间的相似度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35421718/

相关文章:

python - 使用 Python 2.7.6 在 Ubuntu 14.04 上安装 scipy 时出错

python - 如何在 Keras 中使用高级激活层?

r - 我是否排除训练集中使用的数据来运行预测()模型?

python - 具有多项式内核的 sklearn 和 SVM

python - 嵌入 WebView 的 Gtk3 窗口在取消最大化时松开最大化按钮

python - 如何将所有 python 代码捆绑到一个 zip 文件中?

python - 朴素贝叶斯分类器 : Only get 30-40% accuracy on iris data set

pandas - 由于 "reshaping"问题,无法在 scikit-Learn 中进行线性回归

Python:更快的内核评估函数

python - Ruby 哈希相当于 Python dict setdefault