2012-02-14 4 views
10

Estoy pensando en crear una API que permita que un programa envíe una "huella digital" de una publicación académica, compare esto con una base de datos de artículos de revistas de acceso abierto, y si lo encuentra, enviar al usuario la información de citas canónicas. Inicialmente esto sería para un pequeño campo de investigación específico, por lo que no necesariamente tendría que tratar con 20 millones de documentos para tener éxito (incluso si se cubrieran los 1000 documentos más citados en el campo, eso sería una gran ayuda para la productividad). y colaboración).Mejor biblioteca para huella dactilar de correspondencia/texto difusa

Me pregunto qué biblioteca (que es capaz de interactuar con Ruby, idealmente) sería la mejor para hacer esta "toma de huellas dactilares". He visto la coincidencia difusa de Lucene, pero parece funcionar a nivel de palabra, mientras que en este caso probablemente querríamos enviar un subconjunto mucho más grande del documento. La razón para hacer coincidencias aproximadas es que algunas personas pueden tener una preimpresión de Word.doc, algunas pueden tener el PDF final, etc.

Realmente aprecio algunas de las ideas aquí. Buscando el "hash perceptual" en Google para obtener un montón de material nuevo. Traté de resumir muchos de mis hallazgos here.

Parece que SimHash, por ejemplo the C implementation sería el camino a seguir, pero todavía tengo que experimentar más.

+1

Este es un puesto que podría ser interesante: http://stackoverflow.com/questions/8544583/designing-a-noise-filter -para-plagio-detección-motor-en-ruby –

+0

Una alternativa para proporcionar una biblioteca es detallar un algoritmo, aunque dudo que sea lo suficientemente rápido para hacerlo en Ruby puro. Una idea que un amigo mencionó fue usar algún tipo de diferencia para ver qué tan "diferente" es el texto de cada uno de los textos en la base de datos. Con miles de textos en la base de datos, esto podría no ser escalable, pero quizás podríamos hacer búsquedas en algunas de las palabras en el texto para reducir rápidamente el conjunto para que coincida con un número manejable. Intenté diferentes diferencias de palabras, pero no encontré ninguna que escupiera con fuerza el número de "diferencias"/transformaciones, etc., sin mucha otra información –

Respuesta

7

Puede usar pHash para este tipo de trabajo.

Y this joya le ayudará a empezar:

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

Esto es muy claro, lo más cerca que he encontrado algo útil. Veo que la biblioteca de C tiene una tienda de datos integrada que le permitirá enviar hashes y luego puede hacer coincidir los nuevos archivos con todos los hash enviados. No veo ninguna interfaz para esto a través de Ruby pensó, no estoy seguro de que lo haría en la práctica. También me gustaría más información sobre la capacidad de escalado (y si quiero hacer una comparación con archivos 100k, por ejemplo). –

+1

Prefiero almacenar hashes en Lucene y comparar los valores de distancia de Levenstein. Lucene puede manejar millones de hash bastante rápido – fl00r

+0

Interesante, ¿podría proporcionar un poco más de detalle? ¿Cómo recuperas los hash para hacer coincidir? ¿Para cuántos calcula la distancia de Levenshtein? –

Cuestiones relacionadas