Существует несколько различных способов решения этой проблемы, в зависимости от того, сколько именно семантической информации вы хотите сохранить, и насколько легко ваши документы токенизируются (HTML-документы, вероятно, было бы довольно сложно маркировать, но вы могли бы сделать что-то с тегами и контекстом). .)
Некоторые из них были упомянуты ffriend, и векторы абзацев user1133029 - действительно солидный, но я просто решил, что хотел бы углубиться в некоторые плюсы и минусы различных подходов.
- Расстояние по косинусу - пробное истинное расстояние по косинусу, вероятно, является наиболее распространенной метрикой расстояния, используемой в целом для нескольких областей. С учетом сказанного, в косинусном расстоянии очень мало информации, которую можно сопоставить с чем-либо семантическим, что кажется неидеальным для этой ситуации.
- Расстояние Левенштейна - также известное как
edit distance
, обычно оно используется только на уровне отдельных токенов (слова, биграммы и т. Д.). В общем, я бы не рекомендовал этот показатель, так как он не только отбрасывает какую-либо семантическую информацию, но также имеет тенденцию обрабатывать очень разные изменения слов очень похожим образом, но это чрезвычайно распространенный показатель для такого рода вещей.
- LSA - это часть большого арсенала методов, когда дело доходит до оценки сходства документов
topic modeling
. В последнее время LSA вышел из моды, и, по моему опыту, это не самый сильный подход к моделированию тем, но он относительно прост в реализации и имеет несколько реализаций с открытым исходным кодом.
- LDA - это также метод, используемый для
topic modeling
, но он отличается от того, LSA
что он на самом деле изучает внутренние представления, которые имеют тенденцию быть более гладкими и интуитивно понятными. В целом, результаты, которые вы получаете LDA
, лучше для моделирования сходства документов, чем LSA
, но не так хороши для обучения тому, как сильно различать темы.
- Pachinko Allocation - действительно аккуратное расширение поверх LDA. В целом, это просто значительно улучшенная версия
LDA
, с единственным недостатком в том, что обучение занимает немного больше времени, а реализации с открытым исходным кодом немного сложнее найти.
- word2vec - Google работает над серией методов для интеллектуального сокращения слов и документов до более разумных векторов, чем разреженных векторов, полученных такими методами, как
Count Vectorizers
и TF-IDF
. Word2vec великолепен, потому что он имеет ряд реализаций с открытым исходным кодом. Если у вас есть вектор, поверх него можно использовать любую другую метрику сходства (например, косинусное расстояние) со значительно большей эффективностью.
- doc2vec - также известный как
paragraph vectors
, это последняя и самая лучшая из серии статей Google, посвященных плотным векторным представлениям документов. gensim
Библиотека Python имеет реализация , word2vec
что является достаточно простым , что он может довольно разумно быть использованы для сборки doc2vec
, но убедитесь , чтобы сохранить лицензию в виду , если вы хотите идти по этому пути
Надеюсь, это поможет, дайте мне знать, если у вас есть какие-либо вопросы.
Опытным путем я обнаружил, что LSA значительно превосходит LDA каждый раз и в каждом наборе данных, на котором я его пробовал. Я разговаривал с другими людьми, которые говорили то же самое. Он также использовался для победы в ряде конкурсов SemEval по измерению семантического сходства между документами, часто в комбинации с мерой, основанной на Wordnet, так что я бы не сказал, что она выходит из моды или определенно уступает LDA, что лучше для моделирования темы, а не семантического сходства в моем опыте, в отличие от того, что заявили некоторые респонденты.
Если вы используете gensim (библиотеку python), он имеет LSA, LDA и word2vec, так что вы можете легко сравнить 3. doc2vec - классная идея, но она не очень хорошо масштабируется, и вам, вероятно, придется реализовать ее самостоятельно, как и я. не знают ни о каких реализациях с открытым исходным кодом. Он плохо масштабируется, так как для каждого документа необходимо построить новую и отдельную модель с использованием SGD, алгоритма медленного машинного обучения. Но это, вероятно, даст вам самые точные результаты. LSA и LDA также плохо масштабируются (однако word2vec), LDA в целом хуже. Реализации Gensim очень быстрые, поскольку он использует итеративную SVD.
Еще одно замечание: если вы используете word2vec, вам все равно придется определить способ составления векторов из документов, поскольку он дает вам другой вектор для каждого слова. Самый простой способ сделать это - нормализовать каждый вектор и взять среднее значение для всех векторов слов в документе или взять взвешенное среднее значение по весу idf каждого слова. Так что это не так просто, как «использовать word2vec», вам нужно будет сделать что-то еще, чтобы вычислить сходство документов.
Я лично пошел бы с LSA, поскольку я видел, что это работает хорошо эмпирически, и библиотека gensim очень хорошо масштабируется. Однако бесплатного обеда не существует, поэтому желательно попробовать каждый метод и посмотреть, какой из них лучше подойдет для ваших данных.
источник
Современное состояние - это «векторы абзацев», представленные в недавней статье: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . Косинус / евклидово расстояние между векторами абзаца, вероятно, будет работать лучше, чем любой другой подход. Это, вероятно, пока невозможно из-за отсутствия реализации с открытым исходным кодом.
Следующая лучшая вещь - это косинусное расстояние между векторами LSA или косинусное расстояние между необработанными векторами BOW. Иногда лучше выбрать различные схемы взвешивания, например, TF-IDF.
источник
Полезно иметь в своем портфеле наборы алгоритмов хеширования, чувствительных к локальности . Эта семья совсем не семантическая. На самом деле это рассматривать текст как последовательность битов. Я считаю это полезным в грязных наборах данных, когда один и тот же текст появляется много раз с небольшими различиями.
Вы можете использовать ssdeep (который основан на хеше Nilsimsa ) для идентификации таких документов. Ssdeep изначально планировалось для домена спама. Спаммеры часто вносят небольшие изменения в сообщение (добавляют пробел), чтобы предотвратить обнаружение с помощью точной подписи (например, md5 ).
Поскольку многие версии почти одного и того же документа в одном и том же наборе данных приведут к хаосу в статистических методах, которые будут применены к нему, такая очистка может быть очень полезной.
источник