Косинусное подобие - один ко многим

Мне интересно, есть ли хороший способ использовать косинусное сходство для сравнения одного документа с набором документов. Очевидно, вы могли бы рассчитать косинусное сходство между отдельным документом и каждым документом в наборе, но если бы вы это сделали, вы бы взяли среднее значение? Будете ли вы взвешивать по размеру каждый из других документов, с которыми сравниваете исходный документ? Мне также интересно, есть ли способ объединить все подсчеты слов в наборе документов, с которыми вы сравниваете, чтобы в конце вы вычислили косинусное сходство только один раз; между исходным документом и «агрегированным» документом. Причина, по которой я спрашиваю, заключается в том, что у меня есть около 200 000 документов, которые я хочу сравнить с отдельным набором из 50 000 документов. Сравнение каждого из 200 000 с каждым из 50 000 - это утомительные вычисления, и я не знаю, насколько это возможно. на самом деле это необходимо, если я все равно собираюсь взять какое-то среднее значение. Является ли моя идея агрегированного документа большим "нет-нет"?


person user2113188    schedule 26.02.2013    source источник


Ответы (1)


Есть способ значительно ускорить это. Дело в том, чтобы заметить, что векторы слов разрежены. Таким образом, вы хотите преобразовать свои документы в таблицу, организованную по столбцам слов. Один столбец на слово. Для каждого столбца вы сохраняете только ненулевые записи. Это одна строка на документ, которая действительно содержит слово. Затем вы вычисляете частичные суммы, просматривая столбцы и собирая результаты для каждого документа. Это имеет дополнительное преимущество в том, что его легко распараллелить.

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

person Udo Klein    schedule 17.09.2013