Распространенным способом вычисления косинусного сходства между текстовыми документами является вычисление tf-idf, а затем вычисление линейного ядра матрицы tf-idf.
Матрица TF-IDF рассчитывается с помощью TfidfVectorizer ().
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix_content = tfidf.fit_transform(article_master['stemmed_content'])
Здесь article_master - это фрейм данных, содержащий текстовое содержимое всех документов.
Как объяснил Крис Кларк здесь TfidfVectorizer создает нормализованные векторы; следовательно, результаты linear_kernel можно использовать как косинусное сходство.
cosine_sim_content = linear_kernel(tfidf_matrix_content, tfidf_matrix_content)
В этом и заключается мое замешательство.
Фактически косинусное сходство между двумя векторами равно:
InnerProduct(vec1,vec2) / (VectorSize(vec1) * VectorSize(vec2))
Линейное ядро вычисляет InnerProduct, как указано здесь
Итак, вопросы:
Почему я не делю внутренний продукт на произведение величины векторов?
Почему нормализация освобождает меня от этого требования?
Теперь, если бы я хотел вычислить сходство ts-ss, могу ли я по-прежнему использовать нормализованную матрицу tf-idf и значения косинуса (рассчитанные только линейным ядром)?