Косинусное сходство между запросом и документом в поисковой системе

Я просматриваю книгу Мэннинга для поиска информации. В настоящее время я занимаюсь косинусным подобием. Мне неясно одно.
Допустим, у меня есть векторы tf-idf для запроса и документа. Я хочу вычислить косинусное сходство между обоими векторами. Когда я вычисляю величину вектора документа, суммирую ли я квадраты всех членов в векторе или только терминов в запросе?

Вот пример: у нас есть пользовательский запрос «говядина для кошачьего корма». Допустим, его вектор равен (0,1,0,1,1). (Предположим, что в векторе есть только 5 направлений, одно для каждого уникального слова в запросе и документе). У нас есть документ «Говядина восхитительна» Его вектор это (1,1,1,0,0). Мы хотим найти косинусное сходство между векторами запроса и документа.


person Kolev Kriso    schedule 05.11.2017    source источник
comment
Межсайтовые дубликаты: на перекрестной проверке, по науке о данных   -  person unor    schedule 07.11.2017


Ответы (1)


Косинусное сходство - это просто дробь, где

  • числитель - это скалярное произведение двух векторов
  • the denominator is product of the magnitude of the 2 vectors
    • i.e. euclidean length, i.e. the square root of the dot product of the vector with itself

для числителя, например в 1_:

>>> import numpy as np
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0]
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0]
>>> np.dot(x,y)
1.0

Точно так же, если мы вычислим скалярное произведение, умножив x_i и y_i и суммируя отдельные элементы:

>>> x_dot_y = sum([(1.0 * 0.0) + (1.0 * 1.0) + (1.0 * 0.0) + (0.0 * 1.0) + (0.0 * 1.0)])
>>> x_dot_y
1.0

В качестве знаменателя мы можем вычислить величину в numpy:

>>> from numpy.linalg import norm
>>> y = [1.0, 1.0, 1.0, 0.0, 0.0]
>>> x = [0.0, 1.0, 0.0, 1.0, 1.0]
>>> norm(x) * norm(y)
2.9999999999999996

Точно так же, если мы вычислим евклидову длину без numpy

>>> import math
# with np.dot
>>> math.sqrt(np.dot(x,x)) * math.sqrt(np.dot(y,y))
2.9999999999999996

Итак, косинусное сходство:

>>> cos_x_y = np.dot(x,y) / (norm(x) * norm(y))
>>> cos_x_y
0.33333333333333337

Вы также можете использовать функцию косинусного расстояния прямо из scipy:

>>> from scipy import spatial
>>> 1 - spatial.distance.cosine(x,y)
0.33333333333333337

Смотрите также

person alvas    schedule 06.11.2017