Подобие косинуса Векторов различных длин?

Я пытаюсь использовать TF-IDF для сортировки документов в категории. Я вычислил tf_idf для некоторых документов, но теперь когда я пытаюсь вычислить Подобие Косинуса между двумя из этих документов, я получаю высказывание traceback:

#len(u)==201, len(v)==246

cosine_distance(u, v)
ValueError: objects are not aligned

#this works though:
cosine_distance(u[:200], v[:200])
>> 0.52230249969265641

Действительно ли разрезание является вектором так, чтобы len (u) == len (v) правильный подход? Я думал бы, что подобие косинуса будет работать с векторами различных длин.

Я использую эту функцию:

def cosine_distance(u, v):
    """
    Returns the cosine of the angle between vectors v and u. This is equal to
    u.v / |u||v|.
    """
    return numpy.dot(u, v) / (math.sqrt(numpy.dot(u, u)) * math.sqrt(numpy.dot(v, v))) 

Также - порядок значений tf_idf в важных векторах? Они должны быть отсортированы - или действительно ли это незначительно для этого вычисления?

13
задан Community 23 May 2017 в 11:54
поделиться

2 ответа

Вы вычисляете косинусное сходство векторов термов? Термин-векторы должны быть одинаковой длины. Если слов нет в документе, тогда он должен иметь значение 0 для этого термина.

Я не совсем уверен, к каким векторам вы применяете косинусное сходство, но когда вы делаете косинусное сходство, ваши векторы всегда должны быть одинаковой длины, и порядок очень важен.

Пример:

Term | Doc1 | Doc2
Foo     .3     .7
Bar  |  0   |  8
Baz  |  1   |  1

Здесь у вас есть два вектора (.3,0,1) и (.7,8,1), и вы можете вычислить косинусное сходство между ними. Если бы вы сравнили (.3,1) и (.7,8), вы бы сравнили оценку Doc1 Baz с оценкой Doc2 Bar, что не имело бы смысла.

6
ответ дан 1 December 2019 в 23:47
поделиться

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

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

Документ 1: Быстрая коричневая лисица перепрыгнула через ленивую собаку.

Global order:     The quick brown fox jumped over the lazy dog
Vector for Doc 1:  1    1     1    1     1     1    1   1   1

Документ 2: Бегун был быстрым.

Global order:     The quick brown fox jumped over the lazy dog runner was
Vector for Doc 1:  1    1     1    1     1     1    1   1   1
Vector for Doc 2:  1    1     0    0     0     0    0   0   0    1     1

В этом случае теоретически вам нужно дополнить вектор Документа 1 нулями на конце. На практике при вычислении скалярного произведения вам нужно только умножить элементы до конца вектора 1 (поскольку исключение дополнительных элементов вектора 2 и их умножение на ноль - одно и то же, но обращение к дополнительным элементам происходит медленнее).

Затем вы можете вычислить величину каждого вектора отдельно, и для этого векторы не обязательно должны быть одинаковой длины.

9
ответ дан 1 December 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: