2012-02-14 18 views
10

Sto pensando di creare un'API che consentirebbe a un programma di inviare una "impronta digitale" di una pubblicazione accademica, confrontarla con un database di articoli di riviste Open Access e, se trovato, inviare all'utente le informazioni sulla citazione canonica. Inizialmente questo sarebbe per uno specifico campo di ricerca, quindi non avrebbe necessariamente bisogno di trattare 20 milioni di documenti per avere successo (anche se i 1000 articoli più citati nel campo fossero coperti, sarebbe un enorme vantaggio per la produttività e collaborazione).Migliore libreria per documento sfocato/impronta digitale di testo

Mi chiedo quale libreria (che è in grado di interfacciarsi con Ruby, idealmente) sarebbe la migliore per fare questo "fingerprinting". Ho visto la combinazione sfocata di Lucene, ma sembra funzionare a livello di parole, mentre in questo caso vorremmo probabilmente presentare un sottogruppo molto più grande del documento. La ragione per fare corrispondenze fuzzy è che alcune persone potrebbero avere una prestampa Word.doc, alcune potrebbero avere il PDF finale, ecc.

Ho davvero apprezzato alcune delle idee qui. Cercare su "hash percettivo" portarmi in un mucchio di nuovo materiale. Ho cercato di riassumere molti dei miei risultati here.

Sembra SimHash, ad esempio the C implementation sarebbe la strada da percorrere, ma ho ancora bisogno di sperimentare di più.

+1

Questo è un post che potrebbe essere interessante: http://stackoverflow.com/questions/8544583/designing-a-noise-filter -for-plagiarism-detection-engine-in-ruby –

+0

Un'alternativa alla fornitura di una libreria è quella di dettagliare un algoritmo, anche se dubito che sarebbe abbastanza veloce per farlo in puro Ruby. Un'idea menzionata da un amico era quella di usare una sorta di diff per vedere quanto "diverso" fosse il testo da ciascuno dei testi nel database. Con migliaia di testi nel database, questo potrebbe non essere scalabile, ma potremmo forse fare ricerche su alcune delle parole nel testo per ridurre rapidamente il set in modo che corrisponda a un numero gestibile. Ho provato diversi word-diff, ma non ne ho trovato uno che sputasse il numero di "differenze"/trasformazioni, ecc., Senza molte altre informazioni –

risposta

7

È possibile utilizzare pHash per questo tipo di lavoro.

E this gemma vi aiuterà a iniziare:

require 'phash/text' 
Phash::Text.new('first.txt') % Phash::Text.new('second.txt') 
+0

Questo è molto accurato, il più vicino è arrivato a qualcosa di utile. Vedo che la libreria C ha un archivio dati integrato che ti consente di inviare hash e quindi di abbinare nuovi file a tutti gli hash inviati. Non vedo alcuna interfaccia a questo attraverso il pensiero di Ruby, non è sicuro che lo farei in pratica. Mi piacerebbe anche avere maggiori informazioni sulla scalabilità (cosa succede se voglio corrispondere a 100k file per esempio). –

+1

Preferisco archiviare gli hash in Lucene e abbinare il pH alla distanza di Levenstein. Lucene può gestire milioni di hash piuttosto velocemente – fl00r

+0

Interessante, potresti fornire un po 'più di dettagli? Come recuperi gli hash per la corrispondenza? Per quanti calcoli la distanza di Levenshtein? –

Problemi correlati