Проверка дубликатов документов и аналогичных документов в приложении для управления документами - PullRequest
8 голосов
/ 13 ноября 2009

Обновление: Теперь я написал расширение PHP с именем php_ssdeep для API-интерфейса ssdeep C для упрощения нечеткого хеширования и сравнения хешей в PHP. Больше информации можно найти в моем блоге . Я надеюсь, что это полезно для людей.

Я участвую в написании специального приложения для управления документами на PHP на Linux-боксе, в котором будут храниться различные форматы файлов (возможно, тысячи файлов), и мы должны иметь возможность проверить, был ли загружен текстовый документ, чтобы избежать дублирования в базе данных.

По сути, когда пользователь загружает новый файл, мы хотели бы иметь возможность представить ему список файлов, которые являются дубликатами или содержат аналогичное содержимое. Это позволит им выбрать один из ранее существующих документов или продолжить загрузку своих собственных.

Подобные документы будут определены путем просмотра их содержимого на предмет похожих отправок и, возможно, динамически генерируемого списка ключевых слов. Затем мы можем отобразить процент совпадения для пользователя, чтобы помочь им найти дубликаты.

Можете ли вы порекомендовать какие-либо пакеты для этого процесса и какие-либо идеи о том, как вы могли это сделать в прошлом?

Прямой дубликат, я думаю, можно сделать, получив весь текстовый контент и

  • Удалять пробелы
  • Удаление пунктуации
  • Преобразовать в нижний или верхний регистр

затем сформируйте хеш MD5 для сравнения с любыми новыми документами. Удаление этих элементов должно помочь предотвратить обнаружение ошибок, если пользователь, например, редактирует документ, добавляя дополнительные разрывы абзацев. Есть мысли?

Этот процесс может также потенциально выполняться как ночная работа, и мы могли бы уведомлять пользователя о любых дубликатах при следующем входе в систему, если вычислительные требования слишком велики для выполнения в реальном времени. Однако в реальном времени предпочтительнее.

Ответы [ 2 ]

5 голосов
/ 13 ноября 2009

Обновление: Теперь я написал расширение PHP с именем php_ssdeep для API-интерфейса ssdeep C для упрощения нечеткого хеширования и сравнения хешей в PHP. Больше информации можно найти в моем блоге . Я надеюсь, что это полезно для людей.

Я нашел программу, которая делает то, что ее создатель, Джесси Корнблюм, называет «Нечеткое хеширование». По сути, он создает хэши файла, который можно использовать для обнаружения похожих файлов или идентичных совпадений.

Теория, лежащая в основе этого, задокументирована здесь: Идентификация почти идентичных файлов с использованием контекстного кусочного хеширования

ssdeep - это название программы, которое можно запустить в Windows или Linux. Он был предназначен для использования в криминалистических вычислениях, но кажется достаточно подходящим для наших целей. Я провел небольшой тест на старой машине с процессором Pentium 4, и мне понадобилось около 3 секунд, чтобы пройти по хэш-файлу размером 23 МБ (хэши для чуть менее 135 000 файлов) в поисках совпадений с двумя файлами. Это время включает в себя создание хэшей для двух файлов, которые я также искал.

1 голос
/ 13 ноября 2009

Я работаю над аналогичной проблемой в web2project, и после осмотра и копания, я пришел к выводу, что «пользователю все равно». Наличие дубликатов документов не имеет значения для пользователя, если они могут найти свой собственный документ под своим именем.

При этом, вот подход, который я использую:

  • Разрешить пользователю загружать документ, связывая его с любыми проектами / задачами, которые он хочет;
  • Файл должен быть переименован, чтобы кто-то не мог получить к нему доступ через http .. или лучше хранить вне веб-корня. Пользователь по-прежнему будет видеть свое имя файла в системе, и если он его загрузит, вы можете установить заголовки с «правильным» именем файла;
  • В какой-то момент в будущем обработайте документ, чтобы увидеть, есть ли дубликаты ... на данный момент, мы не модифицируем документ. В конце концов, могут быть важные причины изменения пробела или заглавных букв;
  • Если есть дубликаты, удалите новый файл, а затем ссылку на старый;
  • Если нет дупов, ничего не делать;
  • Индексируйте файл для поисковых терминов - в зависимости от формата файла, существует множество параметров, даже для документов Word;

На протяжении всего этого мы не говорим пользователю, что это был дубликат ... им все равно. Это нас (разработчиков, администраторов БД и т. Д.) Заботит.

И да, это работает, даже если позже они загрузят новую версию файла. Сначала вы удаляете ссылку на файл, затем - как и в сборщике мусора - вы удаляете старый файл, только если на него нет нулевых ссылок.

...