Каковы некоторые стандартные способы вычисления расстояния между документами?

34

Когда я говорю «документ», я имею в виду веб-страницы, такие как статьи Википедии и новости. Я предпочитаю ответы, дающие либо ванильные лексические метрики расстояния, либо современные семантические метрики расстояния, с большим предпочтением к последним.

Matt
источник

Ответы:

48

Существует несколько различных способов решения этой проблемы, в зависимости от того, сколько именно семантической информации вы хотите сохранить, и насколько легко ваши документы токенизируются (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, но убедитесь , чтобы сохранить лицензию в виду , если вы хотите идти по этому пути

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

Indico
источник
6

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

  • расстояние по косинусу , внутреннее произведение между векторными элементами документа;
  • LSA , еще одна векторная модель, но использующая SVD для подавления шума исходной матрицы терминов и документов;
  • Основанный на WordNet , проверенный человеком, хотя вряд ли расширяемый.

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

ffriend
источник
1
Обратите внимание, что при выполнении LSA обычно вы используете косинусное расстояние в проекциях LSA исходного набора данных. Просто для ясности.
Саймон
6

Опытным путем я обнаружил, что LSA значительно превосходит LDA каждый раз и в каждом наборе данных, на котором я его пробовал. Я разговаривал с другими людьми, которые говорили то же самое. Он также использовался для победы в ряде конкурсов SemEval по измерению семантического сходства между документами, часто в комбинации с мерой, основанной на Wordnet, так что я бы не сказал, что она выходит из моды или определенно уступает LDA, что лучше для моделирования темы, а не семантического сходства в моем опыте, в отличие от того, что заявили некоторые респонденты.

Если вы используете gensim (библиотеку python), он имеет LSA, LDA и word2vec, так что вы можете легко сравнить 3. doc2vec - классная идея, но она не очень хорошо масштабируется, и вам, вероятно, придется реализовать ее самостоятельно, как и я. не знают ни о каких реализациях с открытым исходным кодом. Он плохо масштабируется, так как для каждого документа необходимо построить новую и отдельную модель с использованием SGD, алгоритма медленного машинного обучения. Но это, вероятно, даст вам самые точные результаты. LSA и LDA также плохо масштабируются (однако word2vec), LDA в целом хуже. Реализации Gensim очень быстрые, поскольку он использует итеративную SVD.

Еще одно замечание: если вы используете word2vec, вам все равно придется определить способ составления векторов из документов, поскольку он дает вам другой вектор для каждого слова. Самый простой способ сделать это - нормализовать каждый вектор и взять среднее значение для всех векторов слов в документе или взять взвешенное среднее значение по весу idf каждого слова. Так что это не так просто, как «использовать word2vec», вам нужно будет сделать что-то еще, чтобы вычислить сходство документов.

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

Саймон
источник
Как именно вы использовали LSA? Стоит отметить, что LDA на самом деле является довольно тонкой оберткой вокруг LSA (это pLSA с предварительным дирихлетом), которая, как было эмпирически показано, значительно усиливает обобщение. Вы почти наверняка увидите лучшую точность с LSA, но это, как правило, результат переоснащения, что является очень заметной проблемой с LSA. Кроме того, что именно вы подразумеваете под масштабированием здесь? На самом деле doc2vec не требует новой модели для каждого документа, и для вычислений нет заметных различий между LSA и LDA, поскольку они очень масштабируемы.
Слейтер Викторофф
Я не наблюдал за соответствием с LSA, и, как я уже сказал, я встречал множество других людей, которые видели лучшую производительность по сравнению с LDA. Кроме того, я видел, как LSA использовался во многих выигрышных записях в семевольных соревнованиях, я никогда не видел, чтобы LDA использовалось в победных записях. Это научная конференция для сравнения семантического сходства между документами, поэтому я предполагаю, что они знают, что делают. Doc2vec, если вы ссылаетесь на векторную реализацию абзаца Миколова, делает SGD для каждого документа отдельно. Так что это очень медленно.
Симон
@SlaterVictoroff Я думаю, что все кончено утверждать, что это переоснащение. Известно, что LDA плохо подходит для случаев поиска / поиска информации и рекомендаций, эмпирически было доказано, что LSA работает намного лучше, и это также соответствует моему собственному опыту, так как мне нравится проверять эти результаты на наших собственных данных. Версии Doc2Vec делают градиентный спуск для каждого документа, это зависит от алгоритма, используемого в Doc2Vec, поскольку это обычно относится к множеству различных алгоритмов.
Саймон
3

Современное состояние - это «векторы абзацев», представленные в недавней статье: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . Косинус / евклидово расстояние между векторами абзаца, вероятно, будет работать лучше, чем любой другой подход. Это, вероятно, пока невозможно из-за отсутствия реализации с открытым исходным кодом.

Следующая лучшая вещь - это косинусное расстояние между векторами LSA или косинусное расстояние между необработанными векторами BOW. Иногда лучше выбрать различные схемы взвешивания, например, TF-IDF.

user1133029
источник
Обратите внимание на мои комментарии ниже о масштабируемости вектора абзаца. Этот метод выглядит очень многообещающе, но его трудно реализовать, и он плохо масштабируется, поскольку вы делаете отдельную SGD для каждого документа, что очень дорого, если я правильно помню документ
Саймон
1

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

Вы можете использовать ssdeep (который основан на хеше Nilsimsa ) для идентификации таких документов. Ssdeep изначально планировалось для домена спама. Спаммеры часто вносят небольшие изменения в сообщение (добавляют пробел), чтобы предотвратить обнаружение с помощью точной подписи (например, md5 ).

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

Dal
источник