Это довольно большая тема - в дополнение к ответам, которые приходят здесь, я рекомендую отследить учебные планы для пары классов по поиску информации и проверить назначенные для них учебники и статьи. Тем не менее, вот краткий обзор моих дней выпускной школы:
Самый простой подход называется мешок слов . Каждый документ сводится к разреженному вектору из {word: wordcount}
пар, и вы можете добавить классификатор NaiveBayes (или некоторый другой) в набор векторов, представляющий ваш набор документов, или вычислить оценки сходства между каждой сумкой и каждой другой сумкой ( это называется классификацией k-ближайших соседей). KNN быстр для поиска, но требует O (n ^ 2) памяти для матрицы оценок; однако для блога n не очень велико. Для чего-то размером с большую газету KNN быстро становится непрактичным, поэтому алгоритм классификации на лету иногда лучше. В этом случае вы можете рассмотреть механизм опорных векторов ранжирования . SVM аккуратны, потому что они не ограничивают вас линейными мерами сходства, и все еще довольно быстры.
Стебминг - это обычный шаг предварительной обработки для техник мешка слов; это включает сокращение морфологически родственных слов, таких как «кошка» и «кошка», «боб» и «бобс», или «похожий» и «подобный», до их корней перед вычислением пакета слов. Существует множество различных алгоритмов стемминга; на странице Википедии есть ссылки на несколько реализаций.
Если сходство с набором слов недостаточно, вы можете абстрагировать его до уровня сходства с пакетом из N-граммов, где вы создадите вектор, представляющий документ, основанный на парах или тройках слов. (Вы можете использовать 4-х или даже более крупные кортежи, но на практике это не очень помогает.) Это имеет недостаток, заключающийся в создании гораздо больших векторов, и классификация, соответственно, потребует больше работы, но совпадения, которые вы получите, будут намного ближе синтаксически. OTOH, вам, вероятно, не нужно это для семантического сходства; это лучше для таких вещей, как обнаружение плагиата. Разделение на части , или сокращение документа до облегченных деревьев разбора, также может быть использовано (есть алгоритмы классификации для деревьев), но это более полезно для таких вещей, как проблема авторства ("с учетом документа неизвестного происхождения") кто это написал? ").
Возможно, более полезным для вашего случая использования является интеллектуальный анализ понятий, который включает сопоставление слов с понятиями (с использованием тезауруса, такого как WordNet ), а затем классификацию документов на основе сходства между используемыми понятиями. Это часто оказывается более эффективным, чем классификация по сходству на основе слов, поскольку сопоставление слов с понятиями является редуцирующим, но этап предварительной обработки может быть довольно трудоемким.
Наконец, есть разбор дискурса , который включает в себя анализ документов на предмет их семантической структуры; вы можете запускать классификаторы подобия на деревьях рассуждений так же, как и на кусочных документах.
В значительной степени все они включают генерацию метаданных из неструктурированного текста; прямое сравнение между необработанными блоками текста трудно, поэтому люди сначала обрабатывают документы в метаданные.