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

python—如何计算成对文档和查询之间的相似性?,python,machine-learning,scikit-learn,feature-extraction,Python,Machine Learning,Scikit Learn,Feature Extraction,我有一个非常大的数据集,基本上是文档搜索查询对,我想计算每对的相似性。我已经计算了每个文档和查询的TF-IDF。我意识到给定两个向量,可以使用线性核计算相似度。但是,我不知道如何在一组非常大的数据上实现这一点(例如,循环为否) 以下是我到目前为止的情况: import numpy as np import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pa

我有一个非常大的数据集,基本上是文档搜索查询对,我想计算每对的相似性。我已经计算了每个文档和查询的TF-IDF。我意识到给定两个向量,可以使用线性核计算相似度。但是,我不知道如何在一组非常大的数据上实现这一点(例如,循环为否)

以下是我到目前为止的情况:

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)

这似乎是一种明智的做法吗?有更好的方法吗?

通常用于计算文本文档之间的相似性,这在scikit learn中是在中实现的

但是,由于默认情况下也会对结果执行L2标准化(即,
norm='L2'
),因此在这种情况下,计算点积以获得余弦相似性就足够了

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

similarity = doc_tfidf.dot(query_tfidf.T).T
而不是按元素进行乘法

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