Quali sono alcuni modi standard per calcolare la distanza tra i documenti?


34

Quando dico "documento", ho in mente pagine web come articoli di Wikipedia e notizie. Preferisco le risposte fornendo metriche della distanza lessicale vaniglia o metriche della distanza semantica all'avanguardia, con una preferenza più forte per quest'ultima.

Risposte:


48

Esistono diversi modi per farlo a seconda di quante informazioni semantiche desideri conservare e di quanto siano facili tokenizzare i tuoi documenti (probabilmente i documenti html sarebbero piuttosto difficili da tokenizzare, ma puoi fare qualcosa con tag e contesto .)

Alcuni di essi sono stati citati da Ffriend e i vettori di paragrafo dell'utente1133029 sono davvero solidi, ma ho appena pensato che avrei approfondito le questioni e gli svantaggi di approcci diversi.

  • Distanza del coseno : una vera distanza del coseno è probabilmente la metrica della distanza più comune utilizzata genericamente in più domini. Detto questo, ci sono pochissime informazioni sulla distanza del coseno che possono effettivamente essere ricondotte a qualsiasi cosa semantica, che sembra non essere l'ideale per questa situazione.
  • Distanza di Levenshtein - Nota anche come edit distance, di solito viene utilizzata solo a livello di singolo token (parole, bigram, ecc ...). In generale non consiglierei questa metrica poiché non solo scarta qualsiasi informazione semantica, ma tende anche a trattare alterazioni di parole molto diverse in modo molto simile, ma è una metrica estremamente comune per questo tipo di cose
  • LSA - Fa parte di un vasto arsenale di tecniche quando si tratta di valutare la somiglianza dei documenti chiamata topic modeling. LSA è passata di moda abbastanza di recente e, nella mia esperienza, non è proprio l'approccio di modellazione di argomenti più forte, ma è relativamente semplice da implementare e ha alcune implementazioni open source
  • LDA - È anche una tecnica usata per topic modeling, ma è diversa da LSAquella in cui apprende rappresentazioni interne che tendono ad essere più fluide e intuitive. In generale, i risultati ottenuti LDAsono migliori per modellare la somiglianza dei documenti rispetto a LSA, ma non altrettanto per imparare a discriminare fortemente tra gli argomenti.
  • Pachinko Allocation - È un'estensione davvero ordinata oltre a LDA. In generale, questa è solo una versione notevolmente migliorata di LDA, con l'unico aspetto negativo è che ci vuole un po 'più tempo per la formazione e le implementazioni open source sono un po' più difficili da trovare
  • word2vec - Google ha lavorato su una serie di tecniche per ridurre in modo intelligente parole e documenti a vettori più ragionevoli rispetto ai vettori sparsi prodotti da tecniche come Count Vectorizerse TF-IDF. Word2vec è eccezionale perché ha una serie di implementazioni open source. Una volta che hai il vettore, qualsiasi altra metrica di somiglianza (come la distanza del coseno) può essere utilizzata su di essa con significativamente più efficacia.
  • doc2vec - Conosciuto anche come paragraph vectors, questo è l'ultimo e il più grande di una serie di articoli di Google, che esamina le rappresentazioni vettoriali dense di documenti. La gensimlibreria in Python ha un'implementazione word2vecabbastanza semplice da poter essere ragionevolmente sfruttata per la compilazione doc2vec, ma assicurati di tenere a mente la licenza se vuoi seguire questa strada

Spero che ti aiuti, fammi sapere se hai qualche domanda.


6

C'è una serie di misure di distanza semantiche, ognuna con i suoi pro e contro. Eccone alcuni:

  • distanza del coseno , prodotto interno tra i vettori delle caratteristiche del documento;
  • LSA , un altro modello basato su vettori, ma che utilizza SVD per de-rumorizzare la matrice originale di documenti termici;
  • Basato su WordNet , verificato dall'uomo, sebbene difficilmente estendibile.

Inizia con un approccio più semplice e poi vai avanti in base ai problemi del tuo caso specifico.


1
Si noti che quando si esegue LSA, in genere si utilizza la distanza del coseno nelle proiezioni LSA del set di dati originale. Giusto per chiarire.
Simon,

6

Empiricamente ho trovato LSA enormemente superiore a LDA ogni volta e su ogni set di dati su cui l'ho provato. Ho parlato con altre persone che hanno detto la stessa cosa. È stato anche usato per vincere una serie di concorsi SemEval per misurare la somiglianza semantica tra documenti, spesso in combinazione con una misura basata su wordnet, quindi non direi che sta andando fuori moda, o è sicuramente inferiore a LDA, che è meglio per la modellazione di argomenti e non la somiglianza semantica nella mia esperienza, contrariamente a quanto affermato da alcuni intervistati.

Se usi gensim (una libreria Python), ha LSA, LDA e word2vec, quindi puoi facilmente confrontare 3. doc2vec è una bella idea, ma non si adatta molto bene e probabilmente dovrai implementarla da solo ignaro di eventuali implementazioni open source. Non si adatta bene come per ogni documento, un nuovo modello separato deve essere costruito usando SGD, un algoritmo di apprendimento automatico lento. Ma probabilmente ti darà i risultati più accurati. Anche LSA e LDA non si adattano bene (word2vec lo fa comunque), LDA peggiora in generale. Le implementazioni di Gensim sono tuttavia molto veloci, poiché utilizza SVD iterativo.

Un'altra nota, se usi word2vec, dovrai comunque determinare un modo per comporre i vettori dai documenti, in quanto ti dà un vettore diverso per parola. Il modo più semplice per farlo è normalizzare ogni vettore e prendere la media su tutti i vettori di parole nel documento, o prendere una media ponderata mediante la ponderazione idf di ogni parola. Quindi non è semplice come 'usa word2vec', dovrai fare qualcosa di più per calcolare la somiglianza dei documenti.

Personalmente andrei con LSA, visto che l'ho visto funzionare empiricamente e la biblioteca di Gensim si adatta molto bene. Tuttavia, non c'è pranzo libero, quindi preferibilmente prova ogni metodo e vedi quale funziona meglio per i tuoi dati.


Come hai usato esattamente LSA? Vale la pena notare che LDA è in realtà un involucro piuttosto sottile attorno a LSA (è pLSA con un dirichlet precedente) che è stato dimostrato empiricamente di aumentare notevolmente la generalizzazione. Quasi sicuramente vedresti una migliore precisione con LSA, ma questo è generalmente il risultato di un eccesso di adattamento, che è un problema notevole con LSA. Inoltre, cosa intendi esattamente ridimensionando qui? doc2vec in realtà non richiede un nuovo modello per ogni documento e per il calcolo non c'è alcuna differenza notevole tra LSA e LDA, essendo entrambi molto scalabili.
Slater Victoroff

Non ho osservato un adattamento eccessivo alla LSA e, come ho detto, ho incontrato molte altre persone che hanno visto prestazioni migliori rispetto alla LDA. Inoltre, ho visto LSA usato in molte voci vincenti in competizioni semestrali, non ho mai visto LDA usato in una voce vincente. Questa è la conferenza accademica per confrontare la somiglianza semantica tra i documenti, quindi presumo che sappiano cosa stanno facendo. Doc2vec, se ti riferisci all'implementazione vettoriale di paragrafo di Mikolov, esegue SGD su ciascun documento separatamente. Quindi è molto lento.
Simon,

@SlaterVictoroff Penso che sia oltre affermare le cose per dire che è troppo adatto. LDA è noto per essere scarso per i casi di ricerca / recupero di informazioni e raccomandazioni, empiricamente è stato dimostrato che LSA funziona molto meglio e che corrisponde anche alla mia esperienza personale poiché mi piace convalidare questi risultati con i nostri dati. Le versioni di Doc2Vec eseguono una discesa gradiente per documento, dipende dall'algoritmo utilizzato in Doc2Vec, poiché generalmente si riferisce a molti algoritmi diversi.
Simon,

3

Lo stato dell'arte sembra essere "vettori di paragrafo" introdotto in un recente documento: http://cs.stanford.edu/~quocle/paragraph_vector.pdf . La distanza coseno / euclidea tra i vettori di paragrafo probabilmente funzionerebbe meglio di qualsiasi altro approccio. Questo probabilmente non è ancora possibile a causa della mancanza di implementazioni open source.

La prossima cosa migliore è la distanza del coseno tra i vettori LSA o la distanza del coseno tra i vettori BOW grezzi. A volte funziona meglio scegliere diversi schemi di ponderazione, come TF-IDF.


Nota i miei commenti qui sotto sulla scalabilità vettoriale dei paragrafi. Questa tecnica sembra molto promettente, ma è difficile da implementare e non si adatta affatto bene, poiché stai facendo un SGD separato per ogni documento, il che è molto costoso, se ricordo bene il documento
Simon

1

È utile avere nella tua borsa degli strumenti la famiglia di algoritmi di hash sensibili alla località . Questa famiglia non è affatto semantica. In realtà viene considerato il testo come una sequenza di bit. Lo trovo utile in set di dati sporchi quando lo stesso testo appare molte volte con lievi differenze.

È possibile utilizzare ssdeep (basato sull'hash di Nilsimsa ) per identificare tali documenti. Originariamente Ssdeep era pianificato per il dominio dello spam. Gli spammer apportano spesso piccole modifiche al messaggio (aggiungono uno spazio) per impedire il rilevamento mediante firma esatta (ad esempio, md5 ).

Poiché molte versioni di quasi lo stesso documento nello stesso set di dati causeranno il caos ai metodi statistici che verranno applicati su di esso, fare una tale pulizia può essere molto utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.