У меня есть очень большой набор данных, который, по сути, представляет собой пары документов и поисковых запросов, и я хочу рассчитать сходство для каждой пары. Я рассчитал 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, но с набором данных около 500 тысяч пар это не сработает. Есть ли способ векторизовать этот расчет?
ОБНОВЛЕНИЕ: Итак, я думаю, что у меня есть решение, которое работает и кажется быстрым. В приведенном выше коде я заменяю:
linear_kernel(doc_tfidf, query_tfidf)
с
df_train['similarity'] = desc_tfidf.multiply(query_tfidf).sum(axis=1)
Это кажется разумным подходом? Есть лучший способ сделать это?