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

时间:2016-02-16 00:41:22

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

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

这是我到目前为止所做的:

src

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

我意识到我可以使用for循环执行此操作,但是使用大约500K对的数据集时,这将无效。有什么方法可以对这个计算进行矢量化吗?

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

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)

linear_kernel(doc_tfidf, query_tfidf)

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

而不是逐元素乘法。