Что не так с наивной реализацией косинусного сходства? - PullRequest
0 голосов
/ 14 декабря 2018

В посте в блоге я читал, что следующую «наивную реализацию» косинусного сходства никогда не следует использовать в производстве, пост в блоге не объясняет, почему, и мне действительно любопытно, может кто-нибудь датьобъяснение?

import numpy as np

def cos_sim(a, b):
    """Takes 2 vectors a, b and returns the cosine similarity according 
    to the definition of the dot product
    """
    dot_product = np.dot(a, b)
    norm_a = np.linalg.norm(a)
    norm_b = np.linalg.norm(b)
    return dot_product / (norm_a * norm_b)

# the counts we computed above
sentence_m = np.array([1, 1, 1, 1, 0, 0, 0, 0, 0]) 
sentence_h = np.array([0, 0, 1, 1, 1, 1, 0, 0, 0])
sentence_w = np.array([0, 0, 0, 1, 0, 0, 1, 1, 1])

# We should expect sentence_m and sentence_h to be more similar
print(cos_sim(sentence_m, sentence_h)) # 0.5
print(cos_sim(sentence_m, sentence_w)) # 0.25

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Есть несколько веских причин, чтобы избежать этой конкретной реализации.

Главная для меня - отсутствие проверки на 0 векторов.Если любой из векторов равен 0, вы получите ошибку деления на 0.

Другая причина - производительность.Вычисление норм требует sqrt, что может быть довольно дорого.Если вы знаете, что вам нужно вычислять cos_sim много раз, возможно, стоит нормализовать векторы один раз, а затем просто использовать точечный продукт.

Последняя причина в том, что для выполнения этой операции может быть выделенная аппаратная поддержка, что выскорее всего, не использовать.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *)))))))))))))) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * '*') * * * * * * * * * * * * * * * * * * * * * * * * * * * '*') * '' 101 '*' * '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''-2010-/ / например, к тому же, как np.dot и np.linalg.norm и даст вам некоторые преимущества по сравнению с его самостоятельной реализацией)).

В общем случае рекомендуется использовать хорошо протестированную и хорошо поддерживаемую библиотеку.Это если вы не хотите понять, что происходит под капотом (пример сообщения в блоге), или вы действительно знаете, что делаете.

В этом вопросе есть несколько предложений по функциям библиотеки, которые вычисляют косинусное сходство и вероятный адреспроблемы, упомянутые выше: сходство косинусов между двумя числовыми списками

0 голосов
/ 15 декабря 2018

Слово наивный используется очень специально для реализации, описанной в блоге (или, по крайней мере, я хотел бы на это надеяться).Нет ничего плохого в использовании косинусного сходства.Фактически это статистически объяснимый, а также практически проверенный способ понимания сходства структуры текста.Объедините его с современными методами встраивания и т. Д., И у вас будет гораздо более надежная структура подобия.

Наивный здесь больше об использовании только количества слов или вхождений для вычисления сходства

0 голосов
/ 14 декабря 2018

Функция cos_sim такая, какой она должна быть.Проблема заключается в представлении предложений с count .Рассмотрим , используя вместо этого tf-idf .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...