Verificação de duplicatas de documentos e documentos semelhantes em uma aplicação de gestão de documentos

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

Pergunta

Update: Eu já escrevi uma extensão PHP chamado php_ssdeep para o ssdeep C API para facilitar hashing e hash comparações difusos em PHP nativamente. Mais informações podem ser encontradas mais no meu blog . Espero que este seja útil para as pessoas.

Estou envolvido em escrever um aplicativo de gerenciamento de documento personalizado em PHP em uma caixa de Linux que irá armazenar vários formatos de arquivo (potencialmente 1000 de arquivos) e precisamos ser capazes de verificar se um documento de texto foi enviado antes para evitar a duplicação no banco de dados.

Essencialmente, quando um usuário faz upload de um novo arquivo que gostaria de ser capaz de apresentá-los com uma lista de arquivos que são ou duplicatas ou que contenham conteúdo semelhante. Este seria, então permitir que eles escolham um dos documentos pré-existentes ou continuar upload seu próprio.

documentos similares seria determinada por olhar através de seu conteúdo para sentances semelhantes e talvez uma lista gerada dinamicamente de palavras-chave. Podemos, então, exibir uma partida percentual ao usuário para ajudá-los a encontrar as duplicatas.

Você pode recomendar quaisquer pacotes para esse processo e quaisquer idéias de como você poderia ter feito isso no passado?

A segunda via direta eu acho que pode ser feito por obter todo o conteúdo do texto e

  • Stripping espaços em branco
  • A remoção de pontuação
  • Converter para diminuir ou maiúsculas

então formar um hash MD5 para comparar com quaisquer novos documentos. Decapagem esses itens fora deve ajudar a prevenir não engana a ser encontrado se o usuário edita um documento para adicionar quebras de parágrafo extras por exemplo. Quaisquer pensamentos?

Este processo também poderia potencialmente ser executado como um trabalho noturno e nós poderia notificar o usuário de todas as duplicatas quando eles próximo login se a exigência computacional é muito grande para ser executado em tempo real. Realtime seria preferível no entanto.

Foi útil?

Solução

Update: Eu já escrevi uma extensão PHP chamado php_ssdeep para o ssdeep C API para facilitar hashing e hash comparações difusos em PHP nativamente. Mais informações podem ser encontradas mais no meu blog . Espero que este seja útil para as pessoas.

Eu encontrei um programa que faz o que seu criador, Jesse Kornblum, chama de "hashing distorcido". Muito basicamente faz hashes de um arquivo que pode ser usado para detectar arquivos semelhantes ou correspondências idênticas.

A teoria por trás disso está documentado aqui: Identificando arquivos quase idênticos usando contexto acionado hashing piecewise

ssdeep é o nome do programa e pode ser executado em Windows ou Linux. Foi destinado para uso em computação forense, mas parece bastante adequado para nossos propósitos. Eu fiz um pequeno teste em uma velha máquina Pentium 4 e leva cerca de 3 segundos para passar por um arquivo de hash de 23MB (hashes por pouco menos de 135.000 arquivos) procurando partidas contra dois arquivos. Esse tempo inclui a criação de hashes para os dois arquivos que eu estava procurando contra também.

Outras dicas

Eu estou trabalhando em um problema semelhante no web2project e depois de pedir ao redor e escavação, cheguei à conclusão de "o usuário não se importa". Ter documentos duplicados não importa para o usuário, desde que eles podem encontrar seu próprio documento por seu próprio nome.

Dito isto, aqui é a abordagem que eu estou tomando:

  • Permitir ao usuário enviar um documento associando-a com qualquer Projetos / tarefas que eles querem;
  • O arquivo deve ser renomeado para evitar que alguém chegando-lo via http .. ou melhor armazenados fora da raiz web. O usuário ainda verá seu nome no sistema e se eles baixá-lo, você pode definir os cabeçalhos com o nome "bom";
  • Em algum ponto no futuro, processar o documento para ver se há duplicatas .. neste ponto, porém, estamos não modificar o documento. Afinal, não poderia haver razões importantes o espaço em branco ou capitalização, é alterado;
  • Se houver dupes, exclua o novo arquivo e, em seguida, conectar-se ao antigo;
  • Se não são bobos, não fazer nada;
  • Índice do arquivo de termos de pesquisa - dependendo do formato do arquivo, há muitas opções, mesmo para documentos do Word;

Ao longo de tudo isso, nós não informar ao usuário que era uma duplicata ... eles não se importam. É nós (desenvolvedores, administradores db, etc) que o cuidado é.

E sim, isso funciona mesmo que carregar uma nova versão do arquivo mais tarde. Primeiro, você excluir a referência para o arquivo, então - assim como na coleta de lixo -. Só excluir o arquivo antigo, se há zero referências a ele

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top