Проверка статей в пачке на уникальность (по шинглам, поиск нечётких дублей)

00110011
На сайте с 08.07.2008
Offline
151
2160

PHP-скрипт. Написал для себя; дай, думаю, и сюда запульну.

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

Для чего вообще

Проверяет статьи в пачке на уникальность относительно друг друга, работатет по методу сравнения шинглов, т.е. ищет нечёткие дубли.

Как работает

Например, есть у вас пачка статей (тыща штук, скажем), и вам нужно из этой пачки выбрать все статьи с уникальностью не менее, допустим, 85%. А статьи, которые будут иметь меньшую уникальность, выкинуть нафик.

Кладёте в рабочую директорию /pages ваши статьи, выставляете в настройках скрипта нужный процент (вместо уникальности в настройках используется процент неуникальности, т.е. в данном случае 15% вместо вышепомянутых 85%), запускаете скрипт - и вуаля, в рабочей директории остаются только уникальные тексты, все неуникальные складируются в директорию /rejected

Запуск

Скрипт консольный (не серверный), для запуска на локальной машине; соотв., у вас на компе должен быть установлен дистрибутив PHP (для винды по умолчанию он ставится в C:\Program Files\PHP). Если он стоит у вас именно там, тогда скрипт можно запускать из консоли прямо так: "php separator.php" (bat-файлик для удобного запуска прилагается). Если у вас установлен Денвер, и вам неохота ставить ещё и отдельный дистрибутив PHP, то можно воспользоваться денверовской установкой PHP, тогда из консоли скрипт запускается примерно так: "C:\путь_к_денверу\usr\local\php5\php.exe C:\путь_к_скрипту\separator.php"

Скорость работы

Скрипт никак специально не оптимизировался, ибо не предназначен для промышленного датамайнинга с миллионами и миллиардами статей. Для использования в быту скорость вполне удовлетворительная, я щетаю. Для примера, массив в 1К статей (по 1,5-2,5К симв. с пробелами на статью) обрабатывается около трёх минут; массив в 15К таких же статей обрабатывается около трёх часов.

Чево у ей внутре (тонкости процесса)

Считываем все файлы из рабочей директории (function rdir), получаем их тексты, чистим эти тексты (function clean_text - удаляем тэги, все не буквенно-цифровые символы, лишние пробелы и переносы, слова короче трёх букв и приводим тексты к нижнему регистру; если ваши тексты в юникоде (utf-8), вы должны указать это в настройках скрипта, иначе чистка пойдёт не тем путём), получаем массив шинглов для каждого текста (function get_shingles, длина шингла в словах настраивается, по умолчанию 5 слов на шингл), опосля чего берём каждый массив и тупо сравниваем с массивами всех других статей (тех, которые ещё не выброшены). Если в каких-то из двух сравниваемых в каждой итерации массивов окажется слишком много одинаковых шинглов (порог одинаковости задаётся в настройках), выкидываем один из них (точнее, выкидываем статью, ассоциированную с этим массивом).

Как-то так.

zip separator.zip
Мы, бояре, народ работящий... Такая уж наша боярская доля (http://www.perlodrom.ru/kino/sneg/m/07.mp3) Проверка пачки статей на уникальность по шинглам (/ru/forum/765207)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий