Измерение сходства документов

21

Для кластеризации (текстовых) документов вам нужен способ измерения сходства между парами документов.

Две альтернативы:

  1. Сравните документы как векторы терминов, используя косинусное сходство - и TF / IDF в качестве весовых коэффициентов для терминов.

  2. Сравните распределение вероятностей каждого документа, используя f-расхождение, например, расхождение Кульбака-Лейблера

Есть ли какая-либо интуитивная причина предпочесть один метод другому (предполагая, что средний размер документа составляет 100 терминов)?

Joel
источник

Ответы:

23

Для текстовых документов векторы признаков могут быть очень большими по размеру и разреженными в любом из стандартных представлений (пакет слов или TF-IDF и т. Д.). Измерение расстояний непосредственно при таком представлении может быть ненадежным, поскольку известно, что при очень больших измерениях расстояние между любыми двумя точками начинает выглядеть одинаково. Один из способов справиться с этим - уменьшить размерность данных с помощью PCA или LSA ( скрытый семантический анализ ; также известный как скрытый семантический индекс ) и затем измерить расстояния в новом пространстве. Использование чего-то вроде LSA поверх PCA выгодно, поскольку оно может дать значимое представление в терминах «семантических концепций», помимо измерения расстояний в пространстве более низких измерений.

Сравнение документов, основанных на распределениях вероятности, обычно выполняется сначала путем вычисления тематического распределения каждого документа (используя что-то вроде скрытого распределения Дирихле ), а затем вычисление некоторого расхождения (например, расхождения KL) между тематическими распределениями пары документов. В некотором смысле это на самом деле похоже на выполнение сначала LSA, а затем измерение расстояний в пространстве LSA с использованием KL-дивергенции между векторами (вместо косинусного сходства).

KL-дивергенция - это мера расстояния для сравнения распределений, поэтому она может быть предпочтительнее, если представление документа выражается в некотором распределении (что часто имеет место, например, документы, представленные в виде распределения по темам, как в LDA). Также обратите внимание, что при таком представлении записи в векторе объектов будут суммироваться в единицу (поскольку вы в основном рассматриваете документ как распределение по темам или семантическим понятиям).

Также см. Связанную тему здесь .

ebony1
источник
Спасибо. LDA требует, чтобы вы знали темы заранее? В нашем случае мы не знаем, к какой теме относится каждый документ, и мы будем использовать меру сходства для выполнения кластеризации (EM-G-Means или GAAC)
Джоэл
@ ebony1 Хорошая ссылка на LSA, я дал аналогичный ответ некоторое время назад на stats.stackexchange.com/questions/369/…
chl
1
@Joel: Нет, LDA не предполагает, что вы заранее знаете темы для каждого документа. Кстати, для ясности, LDA представляет каждый документ как совокупность тем, а не только по одной теме. Таким образом, каждая тема будет вносить свой вклад в некоторую долю в документах (а отдельные фракции составят 1). По сути, LDA предполагает, что каждое слово в документе генерируется определенной темой.
ebony1
@ebony - спасибо! Риск перефразировать вопрос и повторить себя, требует ли LDA, чтобы вы знали количество незаметных тем?
Джоэл
Да. Но есть варианты LDA (HDP-LDA), которые не требуют указания количества тем. Смотрите эту статью: cse.buffalo.edu/faculty/mbeal/papers/hdp.pdf
ebony1
0

Возможно, вы захотите попробовать этот онлайн-сервис для сходства документов косинуса http://www.scurtu.it/documentSdentifity.html

import urllib,urllib2
import json
API_URL="http://www.scurtu.it/apis/documentSimilarity"
inputDict={}
inputDict['doc1']='Document with some text'
inputDict['doc2']='Other document with some text'
params = urllib.urlencode(inputDict)    
f = urllib2.urlopen(API_URL, params)
response= f.read()
responseObject=json.loads(response)  
print responseObject
Виталие
источник
2
Пожалуйста, предоставьте больше деталей.
Сиань