Control de duplicidad de documentos y documentos similares en una aplicación de gestión de documentos

StackOverflow https://stackoverflow.com/questions/1728977

Pregunta

Actualización: Ahora he escrito una extensión de PHP llamado php_ssdeep para la C API ssdeep para facilitar las comparaciones de hashing y de hash difusos en PHP forma nativa. Más información se puede encontrar en encima en mi blog . Espero que esto sea útil para las personas.

Estoy involucrado en escribir una aplicación de gestión de documentos a medida en PHP en una máquina Linux que almacenará varios formatos de archivo (potencialmente 1000 de archivos) y tenemos que ser capaces de verificar si un documento de texto se ha cargado antes para evitar la duplicación en la base de datos.

En esencia, cuando un usuario sube un archivo nuevo que nos gustaría ser capaces de presentar con una lista de archivos que están duplicados, ya sea o tenga un contenido similar. Esto permitiría que les permite elegir uno de los documentos preexistentes o continuar la posibilidad de subir su propia cuenta.

Los documentos similares serían determinadas por mirando a través de su contenido para sentances similares y tal vez una lista de palabras clave generada dinámicamente. entonces podemos mostrar un porcentaje equivalente al usuario para ayudarles a encontrar los duplicados.

Me puede recomendar algún paquete para este proceso y cualquier idea de cómo puede haber hecho esto en el pasado?

En el duplicado directo Creo que se puede hacer por conseguir todo el contenido del texto y

  • Excluyendo los espacios en blanco
  • La eliminación de puntuacion
  • Convertir para bajar o mayúsculas

a continuación, formar un hash MD5 para comparar con los nuevos documentos. Excluyendo estos artículos fuera debería ayudar a evitar duplicados no se encuentran si el usuario edita un documento de añadir en saltos de párrafo adicionales, por ejemplo. ¿Alguna idea?

Este proceso podría también, potencialmente, ejecutar como un trabajo nocturno y que podría notificar al usuario de cualquier duplicados cuando el próximo inicio de sesión si el requisito de cálculo es demasiado grande para funcionar en tiempo real. Realtime sería preferido sin embargo.

¿Fue útil?

Solución

Actualización: Ahora he escrito una extensión de PHP llamado php_ssdeep para la API C ssdeep para facilitar la comparación de hash y croquetas difusos en PHP de forma nativa. Más información se puede encontrar en encima en mi blog . Espero que esto sea útil para las personas.

He encontrado un programa que hace lo que su creador, Jesse Kornblum, llama "Fuzzy hashing". Muy básicamente, hace que los hash de un archivo que se puede utilizar para detectar archivos similares o idénticos partidos.

La teoría detrás de esto está documentado aquí: La identificación de archivos casi idénticos utilizando contexto provocada por tramos de hash

ssdeep es el nombre del programa y que se puede ejecutar en Windows o Linux. Fue diseñado para ser utilizado en la informática forense, pero parece adecuado suficiente para nuestros propósitos. He hecho una prueba corta en una vieja máquina Pentium 4 y se tarda unos 3 segundos para pasar por un hash de archivo de 23 MB (hashes de poco menos de 135.000 archivos) en busca de los partidos contra dos archivos. Ese tiempo incluye la creación de hashes de los dos archivos que estaba buscando en contra también.

Otros consejos

Estoy trabajando en un problema similar en web2Project y después de preguntar por ahí y la excavación, llegué a la conclusión de "el usuario no le importa". Que tienen documentos duplicados no importa al usuario, siempre y cuando puedan encontrar su propio documento por su propio nombre.

Una vez dicho esto, este es el enfoque que estoy tomando:

  • Permitir a un usuario cargar un documento asociarlo con cualquier Proyectos / Tareas que quieren;
  • El archivo debe ser renombrado para evitar que alguien que consigue en ella a través de http .. o mejor almacenado fuera de la raíz del servidor web. El usuario seguirá viendo su nombre de archivo en el sistema y si lo descargan, puede configurar los encabezados con el nombre "adecuada";
  • En algún momento en el futuro, proceso el documento para ver si hay duplicados .. en este punto, sin embargo, estamos no modificar el documento. Después de todo, podría haber razones importantes que se cambie el espacio en blanco o de capitalización;
  • Si hay duplicados, elimine el archivo nuevo y luego enlazar a la anterior;
  • Si no hay duplicados, no hacer nada;
  • Índice del archivo de términos de búsqueda - dependiendo del formato de archivo, hay un montón de opciones, incluso para documentos de Word;

A lo largo de todo esto, que no le dice al usuario que era un duplicado ... que no les importa. Nos (desarrolladores, administradores de base de datos, etc.) que la atención es.

Y sí, esto funciona incluso si la que incluirán una nueva versión del archivo más tarde. En primer lugar, se elimina la referencia al archivo, a continuación, - al igual que en la recolección de basura -. Sólo se elimina el archivo antiguo si hay cero referencias a ella

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top