Risposte:
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.
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 cosetopic 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 sourcetopic modeling
, ma è diversa da LSA
quella in cui apprende rappresentazioni interne che tendono ad essere più fluide e intuitive. In generale, i risultati ottenuti LDA
sono migliori per modellare la somiglianza dei documenti rispetto a LSA
, ma non altrettanto per imparare a discriminare fortemente tra gli argomenti.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 trovareCount Vectorizers
e 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.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 gensim
libreria in Python ha un'implementazione word2vec
abbastanza semplice da poter essere ragionevolmente sfruttata per la compilazione doc2vec
, ma assicurati di tenere a mente la licenza se vuoi seguire questa stradaSpero che ti aiuti, fammi sapere se hai qualche domanda.
C'è una serie di misure di distanza semantiche, ognuna con i suoi pro e contro. Eccone alcuni:
Inizia con un approccio più semplice e poi vai avanti in base ai problemi del tuo caso specifico.
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.
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.
È 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.