Проверка дубликатов документов и аналогичных документов в приложении для управления документами

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

Вопрос

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

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

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

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

При этом я придерживаюсь вот такого подхода:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top