Я пытаюсь определить подобие документа между единым документом и каждым большим количеством документов (n ~ = 1 миллион) как можно быстрее. Строго говоря, документы, которые я сравниваю, являются электронными письмами; они сгруппированы (т.е. существуют папки или теги), и я хотел бы определить, какая группа наиболее подходит для нового электронного письма. Высокая производительность очень важна.
Мое априорное предположение - то, что подобие косинуса между векторами терминов подходит для этого приложения; прокомментируйте, является ли это хорошей мерой для использования или нет!
Я уже принял во внимание следующие возможности для ускорения производительности:
Предварительно нормализуйте все вектора терминов
Вычислите вектор терминов для каждой группы (n ~ = 10,000), а не каждая электронная почта (n ~ = 1,000,000); это, вероятно, было бы приемлемо для моего приложения, но если можно думать о причине не сделать это, сообщите мне!
У меня есть несколько вопросов:
Если новое электронное письмо имеет новый термин никогда, прежде чем замечено в каком-либо из предыдущих электронных писем, которое означает, что я должен повторно вычислить все свои вектора терминов? Это кажется дорогим.
Там некоторый умный путь состоит в том, чтобы только рассмотреть векторы, которые, вероятно, будут близко к документу запроса?
Там некоторый путь состоит в том, чтобы быть более скромным об объеме памяти, который я использую для всех этих векторов?
Спасибо!
Используйте байесовскую фильтрацию . Приведенная ссылка относится к фильтрации спама, но вы можете довольно легко адаптировать алгоритм к нескольким категориям / тегам.
Есть много хороших SO-вопросов о байесовской фильтрации .