Mesurer la similitude des documents

21

Pour regrouper (texte) des documents, vous avez besoin d'un moyen de mesurer la similitude entre des paires de documents.

Deux alternatives sont:

  1. Comparez les documents comme vecteurs de termes en utilisant la similitude cosinus - et TF / IDF comme pondérations pour les termes.

  2. Comparer la distribution de probabilité de chaque document en utilisant la divergence f, par exemple la divergence de Kullback-Leibler

Y a-t-il une raison intuitive de préférer une méthode à l'autre (en supposant une taille moyenne de document de 100 termes)?

Joel
la source

Réponses:

23

Pour les documents texte, les vecteurs de caractéristiques peuvent être de très haute dimension et clairsemés sous n'importe quelle représentation standard (sac de mots ou TF-IDF, etc.). Mesurer des distances directement sous une telle représentation peut ne pas être fiable, car il est connu que dans des dimensions très élevées, la distance entre deux points quelconques commence à se ressembler. Une façon de résoudre ce problème consiste à réduire la dimensionnalité des données en utilisant PCA ou LSA ( Latent Semantic Analysis ; également connu sous le nom de Latent Semantic Indexing ), puis de mesurer les distances dans le nouvel espace. L'utilisation de quelque chose comme LSA sur PCA est avantageuse car elle peut donner une représentation significative en termes de "concepts sémantiques", en plus de mesurer des distances dans un espace de dimension inférieure.

La comparaison de documents sur la base des distributions de probabilité se fait généralement en calculant d'abord la distribution des thèmes de chaque document (en utilisant quelque chose comme l' allocation Dirichlet latente ), puis en calculant une sorte de divergence (par exemple, la divergence KL) entre les distributions de thèmes d'une paire de documents. D'une certaine manière, c'est en fait un peu similaire à faire d'abord LSA puis à mesurer les distances dans l'espace LSA en utilisant la divergence KL entre les vecteurs (au lieu de la similitude en cosinus).

La divergence KL est une mesure de distance pour comparer les distributions, il peut donc être préférable que la représentation du document soit en termes de distribution (ce qui est souvent le cas - par exemple, les documents représentés comme une distribution sur des sujets, comme dans LDA). Notez également que sous une telle représentation, les entrées dans le vecteur d'entités seraient égales à un (puisque vous traitez fondamentalement le document comme une distribution sur des sujets ou des concepts sémantiques).

Voir également un fil connexe ici .

ébène1
la source
Merci. LDA exige-t-il que vous connaissiez les sujets à l'avance? Dans notre cas, nous ne savons pas à quel sujet appartient chaque document et nous utiliserons la mesure de similitude pour effectuer un clustering (EM-G-Means ou GAAC)
Joel
@ ebony1 Belle référence à LSA, j'ai fait une réponse similaire il y a quelque temps sur stats.stackexchange.com/questions/369/…
chl
1
@Joel: Non, LDA ne suppose pas que vous connaissez les sujets de chaque document au préalable. BTW, pour être clair, LDA représente chaque document comme un mélange de sujets, pas par un seul sujet. Ainsi, chaque sujet contribuera à une fraction dans les documents (et les fractions individuelles totaliseront 1). Fondamentalement, LDA suppose que chaque mot du document est généré par un sujet.
ebony1
@ebony - merci! Au risque de reformuler la question et de me répéter, LDA vous demande-t-elle de connaître le nombre de sujets discrets?
Joel
Oui. Mais il existe des variantes de LDA (HDP-LDA) qui ne nécessitent pas de spécifier le nombre de sujets. Voir cet article: cse.buffalo.edu/faculty/mbeal/papers/hdp.pdf
ebony1
0

Vous voudrez peut-être essayer ce service en ligne pour la similitude des documents cosinus http://www.scurtu.it/documentSimilarity.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
Vitalie
la source
2
Veuillez fournir plus de détails.
Xi'an