Алгоритм поиска дубликатов
Алгоритм поиска дубликатов
В переводе с английского shingle означает «гонт». Яснее не стало? Гонт – это кровельный материал, а точнее, небольшие дощечки с пазами и выступами, которые собираются в один лист. Применительно к поисковым системам шинглы – это алгоритм для поиска дубликатов путем вычисления и сопоставления контрольных сумм выборки канонизированных (см. значение термина ниже) словосочетаний длиной от одной до десяти (приблизительно) единиц. Работает это следующим образом.
1. Все слова в тексте приводятся к исходным словоформам, стоп — слова (предлоги, союзы, частицы, знаки препинания и другие незначимые и не несущие смысловой нагрузки элементы) удаляются. Это называется канонизацией текста. Таким образом получается исходник для вычисления шинглов. Более жесткая канонизация может учитывать синонимы и, например, исходное слово «недомогать» заменять на «болеть». Это помогает выявлять тексты, где лишь некоторые исходные слова заменены близкими по смыслу
2. Канонизированный текст делится на фразы длиной от трех до десяти (примерно) слов. Разбивка осуществляется или встык, или внахлест, когда в последующую фразу включено одно или несколько последних слов из предыдущей. Малейшее изменение канонизированного текста – и возникают совсем другие шинглы. Чтобы конструкция не разрушилась как карточный домик, в тексте нужно задать четкие, но малоочевидные точки отсчета для членения на шинглы. В качестве примера приведем схожий алгоритм «Яндекса» под названием «Спамооборона», где устанавливаются границы, цитата: «от буквы “ю” до буквы “ю”; или от двухбуквия, сумма численных значений символов (букв) которого кратна 50, до следующего такого же».
3. Далее для каждого шингла вычисляется контрольная сумма (точнее, применяется хэш-функция). Проще говоря, последовательность слов превращается в последовательность цифр.
4. Затем формируется выборка шинглов, вернее, контрольных сумм и непосредственно сравнение и анализ документов. Из всех полученных контрольных сумм отбирается несколько десятков значений. Производится это путем случайной выборки, к примеру, 70 математических функций из заблаговременно составленного реестра, каждая из которых может описывать интересный для целей data mining параметр: пересечение, вложенность и т. д. Все шинглы документа пропускаются через каждое из 70 выражений, что дает на выходе значения, атрибутируемые тому или иному шинглу. Для каждой из 70 функций выбирается шингл с минимальным (возможны и иные критерии) значением контрольной суммы. В результате на базе анализируемого документа составляется сигнатура из 70 значений контрольных сумм. При сравнении с другим документом, который подвергся такой же операции, берутся шинглы, отобранные по совпадающим функциям. К примеру, если при отборе шинглов в обоих случаях было использовано 25 одинаковых функций из 70, то сравнение выполняется по 25 соответствующим контрольным суммам.
5. В результате анализа, если обнаружена высокая доля совпадения контрольных сумм двух документов, делается вывод о том, являются ли эти документы четкими (контент полностью совпадает) или нечеткими (контент претерпел некоторые изменения) дубликатами.
Конечно, алгоритм мы продемонстрировали лишь в общих чертах, чтобы дать представление о принципе поиска дубликатов методом шинглов.
Поисковики используют и другие сложные методы проверки текстов на уникальность. Среди них – статистический анализ частотности слов с использованием распределения Ципфа для поиска аномалий, наложение длинных пассажей (более длинных, чем шинглы, отрывков текста) для поиска совпадений в документах, которые подверглись ручному рерайту с разрушением шинглов, и другие методы.
Таким образом, избежать санкций поисковиков за использование чужого контента можно, лишь создавая оригинальный контент – самостоятельно ли, с привлечением ли копирайтера или рерайтера, способного качественно преобразовать заимствованный текст.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Алгоритм поиска прав
Алгоритм поиска прав Теперь, когда мы определили все типы прав и различные способы, которыми пользователь может их получить, рассмотрим алгоритм поиска и попытаемся понять, как фактически происходит предоставление прав.Поиск прав всегда осуществляется в строго
8.1.1 Алгоритм
8.1.1 Алгоритм Сразу после переключения контекста ядро запускает алгоритм планирования выполнения процессов (Рисунок 8.1), выбирая на выполнение процесс с наивысшим приоритетом среди процессов, находящихся в состояниях "резервирования" и "готовности к выполнению, будучи
Склейка дубликатов
Склейка дубликатов При продвижении порталов и крупных интернет-магазинов оптимизатору часто приходится сталкиваться с проблемой дублирования контента. Карточки товаров и страницы с описаниями моделей могут различаться буквально одним параметром или даже одной
Устранение дубликатов. Предложение DISTINCT.
Устранение дубликатов. Предложение DISTINCT. Следует отметить, что вертикальная выборка может содержать дубликаты строк в том случае, если она не содержит потенциального ключа, однозначно определяющего запись. В таблице PC потенциальным ключом является поле code, которое
2.30. Удаление дубликатов
2.30. Удаление дубликатов Цепочки повторяющихся символов можно сжать до одного методом squeeze:s1 = "bookkeeper"s2 = s1.squeeze # "bokeper"s3 = "Hello..."s4 = s3.squeeze # "Helo."Если указан параметр, то будут удаляться только дубликаты заданных в нем символов:s5 = s3.squeeze(".") # "Hello."Этот параметр подчиняется тем же
8.1.21. Удаление дубликатов из массива
8.1.21. Удаление дубликатов из массива Чтобы удалить из массива повторяющиеся экземпляры, воспользуйтесь методом uniq (или его вариантом для модификации на месте uniq!):breakfast = %w[spam spam eggs ham eggs spam]lunch = breakfast.uniq # ["spam","eggs","ham"]breakfast.uniq! # Массив breakfast
Алгоритм equal_range()
Алгоритм equal_range() template class ForwardIterator, class Type pair ForwardIterator, ForwardIterator equal_range( ForwardIterator first,ForwardIterator last, const Type &value );template class ForwardIterator, class Type, class Compare pairForwardIterator, ForwardIterator equal_range( ForwardIterator first,ForwardIterator last, const Type &value,Compare comp );equal_range() возвращает пару итераторов: первый представляет
Алгоритм find_if()
Алгоритм find_if() template class InputIterator, class Predicate InputIteratorfind_if( InputIterator first,InputIterator last, Predicate pred );К каждому элементу из диапазона [first,last) последовательно применяется предикат pred. Если он возвращает true, поиск прекращается. find_if() возвращает итератор типа InputIterator, указывающий на найденный
Алгоритм find_end()
Алгоритм find_end() template class ForwardIterator1, class ForwardIterator2 ForwardIterator1find_end( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2 );template class ForwardIterator1, class ForwardIterator2,class BinaryPredicate ForwardIterator1find_end( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2,BinaryPredicate pred );В последовательности, ограниченной
Алгоритм find_first_of()
Алгоритм find_first_of() template class ForwardIterator1, class ForwardIterator2 ForwardIterator1find_first_of( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2 );template class ForwardIterator1, class ForwardIterator2,class BinaryPredicate ForwardIterator1find_first_of( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2,BinaryPredicate pred );Последовательность,
Алгоритм for_each()
Алгоритм for_each() template class InputIterator, class Function Functionfor_each( InputIterator first,InputIterator last, Function func );for_each() применяет объект-функцию func к каждому элементу в диапазоне [first,last). func не может изменять элементы, поскольку итератор записи не гарантирует поддержки присваивания. Если же модификация
Алгоритм generate()
Алгоритм generate() template class ForwardIterator, class Generator voidgenerate( ForwardIterator first,ForwardIterator last, Generator gen );generate() заполняет диапазон, ограниченный парой итераторов [first,last), путем последовательного вызова gen, который может быть объектом-функцией или указателем на функцию.#include algorithm#include list#include
Алгоритм generate_n()
Алгоритм generate_n() template class OutputIterator,class Size, class Generator voidgenerate_n( OutputIterator first, Size n, Generator gen );generate_n() заполняет последовательность, начиная с first, n раз вызывая gen, который может быть объектом-функцией или указателем на функцию.#include algorithm#include iostream.h#include listclass even_by_twos {public:even_by_twos( int seed = 0 ) :
Алгоритм max()
Алгоритм max() template class Type const Type&max( const Type &aval, const Type &bval );template class Type, class Compare const Type&max( const Type &aval, const Type &bval, Compare comp );max() возвращает наибольшее из двух значений aval и bval. В первом варианте используется оператор "больше", определенный в классе Type; во втором - операция
Алгоритм min()
Алгоритм min() template class Type const Type&min( const Type &aval, const Type &bval );template class Type, class Compare const Type&min( const Type &aval, const Type &bval, Compare comp );min() возвращает меньшее из двух значений aval и bval. В первом варианте используется оператор “меньше”, определенный для типа Type; во втором - операция
13.4.1. Эвристические оценки и алгоритм поиска
13.4.1. Эвристические оценки и алгоритм поиска Базовые процедуры поиска предыдущего раздела производят систематический и полный просмотр И/ИЛИ-дерева, не руководствуясь при этом какими-либо эвристиками. Для сложных задач подобные процедуры весьма не эффективны из-за