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

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

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

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

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

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

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

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

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

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


person Treffynnon    schedule 13.11.2009    source источник
comment
Использование хеша MD5 поможет вам только с двумя абсолютно одинаковыми документами. Если отличается только один символ, результирующие хэши MD5 совсем не похожи (это одна из точек хэшей). Следовательно, это не сработает для поиска похожих файлов...   -  person Franz    schedule 13.11.2009
comment
Я понимаю это. Вот почему я упомянул эту технику для поиска точных совпадений, а не для похожих файлов.   -  person Treffynnon    schedule 13.11.2009


Ответы (2)


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

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

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

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

person Treffynnon    schedule 13.11.2009

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

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

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

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

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

person CaseySoftware    schedule 13.11.2009
comment
Интересные идеи. Однако в нашей системе не должно быть дубликатов, поскольку документы используются на многих разных сайтах из одного центрального места, и все сайты должны обновляться одновременно. Я не предлагал изменить сам документ. Просто чтобы хеш-совпадение максимально соответствовало похожим документам. Если есть совпадение, я бы попросил пользователя либо принять доступный в настоящее время файл, либо обновить его новым файлом, который они загружают, либо просто добавить его в качестве другого файла, который им абсолютно необходим. Я не могу удалить старый файл, так как он не прозрачен для пользователя. - person Treffynnon; 13.11.2009
comment
Извините, я немного неправильно сформулировал свой ответ. Моя точка зрения заключалась в том, что изменение его перед сравнением документов означает, что вы на самом деле не сравниваете документы... вы сравниваете измененные документы. Например, «Привет, меня зовут Кит» — это то же предложение, что и «Привет, меня зовут Кит». Концептуально они одинаковы, но мое имя не пишется с большой буквы в первом, вероятно, опечатка. Предлагаемая вами идея будет рассматривать эти документы одинаково и помечать один как дубликат. - person CaseySoftware; 15.11.2009
comment
Это именно то, что я надеялся сделать. :) Это по сути одно и то же предложение. В одном просто опечатка. Поэтому я хочу, чтобы они обновили существующий документ, а не загружали новый. - person Treffynnon; 16.11.2009