Я не уверен в вашей реализации, но косинусное расстояние двух векторов равно нормализованному точечному произведению этих векторов.
Точечное произведение двух матриц может быть выражено как. b = a T b. В результате, если матрица имеет разную длину, вы не можете взять скалярное произведение для определения косинуса.
Теперь в стандартном подходе TF * IDF термины в вашей матрице должны быть проиндексированы на term, document
, в результате любые термины, не встречающиеся в документе, должны отображаться как нули в вашей матрице.
Теперь то, как вы его настроили, похоже, предполагает наличие двух разных матриц для ваших двух документов. Я не уверен, что это ваше намерение, но это кажется неправильным.
С другой стороны, если одна из ваших матриц должна быть вашим запросом, то это должен быть вектор, а не матрица, чтобы транспонирование давало правильный результат.
Ниже приводится полное объяснение TF * IDF:
Хорошо, в классической TF * IDF вы строите матрицу терм-документа a
. Каждое значение в матрице a
характеризуется как i, j , где i
- это термин, а j
- это документ. Это значение является комбинацией локальных, глобальных и нормализованных весов (хотя, если вы нормализуете свои документы, нормализованный вес должен быть 1). Таким образом, a i, j = f i, j * D / d i , где f i, j - частота слова i
в документе j
, D
- размер документа, а d i - количество документов с термином i
в них.
Ваш запрос представляет собой вектор терминов, обозначенных b
. Для каждого термина b i, q в вашем запросе относится к термину i
для запроса q
. b i, q = f i, q , где f i, q - частота слагаемого i
в запросе q
. В этом случае каждый запрос является вектором, а несколько запросов образуют матрицу.
Затем мы можем вычислить единичные векторы для каждого, так что, когда мы возьмем скалярное произведение, он получит правильный косинус. Чтобы получить единичный вектор, мы делим матрицу a
и запрос b
на их норму Фробениуса .
Наконец, мы можем выполнить косинусное расстояние, взяв транспонирование вектора b
для данного запроса. Таким образом, один запрос (или вектор) для расчета. Это обозначается как b T a. Конечным результатом является вектор с оценкой для каждого термина, где более высокий балл обозначает более высокий ранг документа.