Полагаю, вас больше интересует понимание ", почему ", косинусное сходство работает (почему оно дает хороший признак сходства), а не ", как"рассчитывается (конкретные операции, используемые для расчета). Если вас интересует последнее, см. Ссылку, указанную Даниэлем в этом посте, а также соответствующий вопрос SO .
Чтобы объяснить как и даже более того, почему, полезно, во-первых, упростить проблему и работать только в двух измерениях. Как только вы получите это в 2D, вам будет легче думать об этом в трех измерениях, и, конечно, сложнее представить это во многих других измерениях, но к тому времени мы сможем использовать линейную алгебру для выполнения численных расчетов, а также, чтобы помочь нам мыслить в терминах линий / векторов / "плоскостей" / "сфер" в n измерениях, хотя мы не можем их нарисовать.
Итак, в двух измерениях : в отношении сходства текста это означает, что мы сосредоточимся на двух разных терминах, скажем слова «Лондон» и «Париж», и посчитаем, сколько раз каждое из этих слов встречается в каждом из двух документов, которые мы хотим сравнить. Это дает нам для каждого документа точку в плоскости x-y. Например, если у Doc1 был Париж один раз, а Лондон - четыре, точка (1,4) представила бы этот документ (в отношении этой крошечной оценки документов). Или, говоря с точки зрения векторов, этот документ Doc1 будет стрелкой, идущей от начала координат к точке (1,4). Имея это в виду, давайте подумаем о том, что означает, что два документа должны быть похожими, и как это относится к векторам.
ОЧЕНЬ похожие документы (опять же, в отношении этого ограниченного набора измерений) будут иметь такое же количество ссылок на Париж, И то же самое число ссылок на Лондон, или, может быть, они могут иметь такое же соотношение этих ссылок , Документ, Doc2, с 2 ссылками на Париж и 8 ссылками на Лондон, также будет очень похож, только с, возможно, более длинным текстом или как-то более повторяющимся из названий городов, но в той же пропорции. Может быть, оба документа являются путеводителями по Лондону, в которых содержатся лишь мимолетные ссылки на Париж (и как не круто этот город ;-) Просто шучу !!!.
Теперь менее похожие документы могут также включать ссылки на оба города, но в разных пропорциях. Может быть, Doc2 только один раз процитирует Париж, а Лондон - семь.
Возвращаясь к нашей плоскости xy, , если мы рисуем эти гипотетические документы, мы видим, что, когда они ОЧЕНЬ похожи, их векторы перекрываются (хотя некоторые векторы могут быть длиннее), и когда они начинают иметь меньше в общем, эти векторы начинают расходиться, чтобы иметь более широкий угол между ними.
Измеряя угол между векторами, мы можем получить хорошее представление об их сходстве и, чтобы сделать вещи еще проще, взяв Cosine этого угла, мы получим хорошее значение от 0 до 1 или от -1 до 1, которое указывает на это сходство, в зависимости от того, что и как мы учитываем. Чем меньше угол, тем больше (ближе к 1) значение косинуса, а также выше сходство.
В крайнем случае, если в Doc1 упоминается только Париж, а в Doc2 - только Лондон, документы не имеют абсолютно ничего общего. Doc1 будет иметь свой вектор на оси x, Doc2 на оси y, угол 90 градусов, косинус 0. В этом случае мы бы сказали, что эти документы ортогональны друг другу.
Добавление размеров :
Благодаря этому интуитивному ощущению сходства, выраженному в виде небольшого угла (или большого косинуса), мы можем теперь представить вещи в 3-х измерениях, скажем, введя слово «Амстердам» в микс, и довольно хорошо представить, как документ с двумя ссылками на каждый будет иметь вектор, движущийся в определенном направлении, и мы можем увидеть, как это направление будет сравниваться с документом, в котором каждый раз упоминаются Париж и Лондон, но не Амстердам и т. д. Как уже говорилось, мы можем попытаться представить себе это причудливое пространство для 10 или 100 городов. Сложно рисовать, но легко осмыслить.
В заключение я скажу несколько слов о самой формуле . Как я уже сказал, другие ссылки дают хорошую информацию о расчетах.
Первый в двух измерениях. Формула для косинуса угла между двумя векторами получается из тригонометрической разности (между углом a и углом b):
cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))
Эта формула очень похожа на формулу точечного произведения:
Vect1 . Vect2 = (x1 * x2) + (y1 * y2)
, где cos(a)
соответствует значению x
и sin(a)
значению y
для первого вектора и т. Д. Единственная проблема заключается в том, что x
, y
и т. Д. Не совсем точно значения cos
и sin
, для этих значений необходимо прочитать на единичной окружности. Вот где начинает действовать знаменатель формулы: путем деления на произведение длины этих векторов координаты x
и y
нормализуются.