python — Как рассчитать сходство между парами документов и запросов?

У меня есть очень большой набор данных, который, по сути, представляет собой пары документов и поисковых запросов, и я хочу рассчитать сходство для каждой пары. Я рассчитал 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)

Это кажется разумным подходом? Есть лучший способ сделать это?


person geo    schedule 16.02.2016    source источник


Ответы (1)


Косинусное сходство обычно используется для вычисления сходства между текстовыми документами, что реализовано в scikit-learn в sklearn.metrics.pairwise.cosine_similarity.

Однако, поскольку TfidfVectorizer также выполняет L2 нормализация результатов по умолчанию (т.е. norm='l2'), в этом случае достаточно вычислить скалярное произведение, чтобы получить косинусное сходство.

Поэтому в вашем примере вы должны использовать

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

вместо поэлементного умножения.

person rth    schedule 05.11.2016