Rusl

Рейтинг
37
Регистрация
29.04.2003

Согласен. Вопрос не легко понять.

Как писал eshum


Думаю будут погрешности на "границах рангов", поясню на примере:

Имеем ранги:
1-й ранг от 0 до 99 слов, отбираются шинглы с кратные (по значению) 10
2-й ранг от 100 до 150 слов, отбираются шинглы кратные 15

Имеем два документа с отличием в одно слово:
1-й документ содержит 99 слов (1-й ранг)
2-й документ содержит 100 слов (2-й ранг)

В результате для 1-го документа отберутся шинглы кратные 10, для 2-го кратные 15. Получается шинглы не совпадут.

Вот в этом то все и дело!

Надо правильно выбирать кратность Если вы возмете 10 и 15 - естественно они не совпадут. Но если например 10, 20 и 40 - очень даже.

Просто сравнивая 1-ый ранг (шинглы кратны 10) с 3-им (шинглы кратны 40), из первого для сравнения выбираем только кратные 40-ка. Понимаете?

Как писал Interitus
Rusl, а что с чем вы сравниваете? Ведь если у документа №1 взять каждый 10-й шингл, и у документа №1копия взять каждый 10-й, и эти документы будут отличаться одним словом (вставленным в начало документа №1), то дубль не выловится. А если брать только шинглы, значение которых кратно 8 или 16 - то прекрасно выловится.

Каждый десятый имел ввиду конечно кратный 10. Не имеет никакого значения какую кратность выбрать (естественно при этом нужно исходить из удовлетворительного соотношения "качество"-"количество шинглов (быстрота обработки)").

Как писал eshum

Мне кажется так работать не будет, смысл выбирать не каждый 10 шингл, а каждый шингл хеш значение которого кратно 10. Т.е. для двух документов одинаковой длины количество отобраных шинглов может быть различным.

Тут есть небольшая тонкость. Сравнивая документы одного ранга (документы распределены по рангам в зависимости от объема) мы будем иметь ровно тоже что имели бы взяв шинглы кратные какому то числу для этого ранга, как если бы документов других рангов небыло (надеюсь не слишком сумбурно все излагаю).

Вопрос в том, как сравнивать документы разных рангов, ведь если кратность шинглов будет для них различна (как я и предлагаю), то сравнимы они будут только при условии кратности этих кратностей (5, 10, 20 или 15, 30, 60), то есть так, чтобы кратность для меньшего по значению ранга была кратна кратности большего.

Таким образом сравнивая например страницы 1-го и 2-го ранга (страницы 1-го ранга от 0 до 99 слов, 2-го от 100 до 999) мы будем выбирать из шинглов (первой страницы) только шинглы кратные 20 (при условии что кратность по рангам распределена так: 10, 20, 40), сокращая таким образом сравниваемые шинглы документа 1-го ранга приблизительно в 2 раза. Но это помогает нам "унифицировать" шинглы, хотя и за счет небольшой потери в качестве.

1. Число всех шинглов для данного документа будет n-1 (где n-размерность шингла. в нашем случае 10)

2. Короткие документы размножать нет смысла. Лучше либо зациклить получение шинглов (то есть текст-кольцо) либо уменьшать кратность выбираемых шинглов, так, чтобы они были "совместимы" с шинглами больших документов (например для текста, где количество слов от 0 до 99 выбираем каждый 10 шингл, 100-999, каждый 20-й, больше 1000 каждый 40-й. Таким образом шинглы из коротких документов буду сравними с шинглами из длинных и можно определить степень включенности меньшего в большее, хотя и с большей погрешность чем документы одних рангов).

"Страницы с одинаковой контрольной суммой проверяются методом шинглов на похожесть."

Вот это странное решение. Зачем? Ведь одинаковые контрольные суммы говорят что документы абсолютно похожи (с точностью до знака).

Вообще не обязательно проверять все шинглы (так действительно никаких мощностей не хватит). Но так как распределение контрольных сумм (хешей шинглов) равномерное, то мы можем использовать значения шинглов кратных какому-нибудь числу (10-30). Критерий выборки, в данном случае, получается не привязанным к особенностям текста, так как значения контрольных сумм для разных документов распределены равномерно. И получается что количество сравниваемых шинглов приблизительно равно 1/10-1/30 от общего объема текста (если мерять его в словах). Хотя в принципе думаю Вы это и так прекрасно знаете.

Как писал AlexA
Снова не могу не согласиться с Вами, Artisan. И распределение CRC неравновероятное...
CRC действительно хорош быстродействием, что в методе шинглов (пересекающихся покрытий) совсем не лишнее.

А откуда известно о характере распределения? Имею ввиду, все знают что распределение не подчиняется нормальному закону распределения (надеюсь я правильно понял термин равновероятное), но никто не говорит на чем основано подобное заключение и откуда взялась цифра 0.002.

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

Как писал euhenio


Хотя Сегалович в своем примере в статье про шинглы явно не CRC32 использовал...

"Существует обширная литература по алгоритмам вычисления контрольных сумм, я упомяну здесь самые известные: fnv, md5, crc. Обычно более-менее все равно, какой из них выбрать, но в любом случае при выборе алгоритма его положительной стороной можно считать хорошее быстродействие."

Вот здесь.

Хотя может быть он лукавит.

Как писал Artisan


CRC любой разрядности предназначена для контроля целостности а не для хэширования и по определению не является равновероятной для случайной выборки данных а как раз наоборот есть существенный перекос который определяется магическим числом. Для шинглов лучше всего применять MD5 или другие подходящие для хэширования функции если эта слишком медленная для задачи. Но даже применение MD5 не гарантирует пригодность хэширования как метода вообще для всех задач а для некоторых задач результат может получиться очень забавным и совсем не таким который ожидается.

Дело в том, что работаю в Фоксе, а там уже есть готовая функция на базе CRC32. Вся проблема в вероятности. Быть может как раз в моем случае она будет вполне приемлема.

Как писал Artisan


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

Поймите меня правильно, самому расчитать вероятность не большая проблема. Проблема понять алгоритм CRC32, для того чтобы эту вероятность расчитать.

Насчет постановки задачи. Пытаюсь чистить выборку и удалять дублирующую информацию (точнее дубликаты и почти-дубликаты), с помощью шинглов. Соответственно, здесь и необходимо хэширование.

Всего: 62