<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Code-Is-Art &#187; Алгоритмы</title>
	<atom:link href="http://www.codeisart.ru/rubric/algorithm/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeisart.ru</link>
	<description>Статьи по SEO, дизайну и программированию. Переводы на веб-тематику. Исследования и наработки в области интернет-технологий.</description>
	<lastBuildDate>Tue, 08 Nov 2011 13:43:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Часть 1. Алгоритм шинглов для веб-документов</title>
		<link>http://www.codeisart.ru/part-1-shingles-algorithm-for-web-documents/</link>
		<comments>http://www.codeisart.ru/part-1-shingles-algorithm-for-web-documents/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 09:26:10 +0000</pubDate>
		<dc:creator>Skaizer</dc:creator>
				<category><![CDATA[Алгоритмы]]></category>
		<category><![CDATA[SEO/SEM]]></category>
		<category><![CDATA[шинглы]]></category>

		<guid isPermaLink="false">http://www.codeisart.ru/?p=1585</guid>
		<description><![CDATA[Ранее я&#160;показал элементарную реализацию алгоритма шинглов, позволяющую определять, являются&#160;ли два документа почти дубликатами или нет. В&#160;этот раз я&#160;поясню реализацию алгоритма, описанную Зеленковым&#160; Ю.&#160;Г. и&#160;Сегаловичем И.В. в&#160;публикации &#171;Сравнительный анализ методов определения нечетких дубликатов для Web-документов&#187;. Этим я&#160;начинаю серию из&#160;трех теоретических статей, в&#160;которых постараюсь доступным языком описать принцип алгоритмов шинглов, супершинглов и&#160;мегашинглов для сравнение веб-документов. В&#160;публикации об&#160;алгоритмах [...]]]></description>
			<content:encoded><![CDATA[<p>Ранее я&nbsp;показал <a href="http://www.codeisart.ru/python-shingles-algorithm/">элементарную реализацию алгоритма шинглов</a>, позволяющую определять, являются&nbsp;ли два документа почти дубликатами или нет. В&nbsp;этот раз я&nbsp;поясню реализацию алгоритма, описанную Зеленковым&nbsp; Ю.&nbsp;Г. и&nbsp;Сегаловичем И.В. в&nbsp;публикации &laquo;<a href="http://rcdl2007.pereslavl.ru/papers/paper_65_v1.pdf">Сравнительный анализ методов определения нечетких дубликатов для Web-документов</a>&raquo;.</p>
<p>Этим я&nbsp;начинаю серию из&nbsp;трех теоретических статей, в&nbsp;которых постараюсь доступным языком описать принцип алгоритмов шинглов, супершинглов и&nbsp;мегашинглов для сравнение веб-документов.</p>
<p><span id="more-1585"></span></p>
<p>В&nbsp;публикации об&nbsp;алгоритмах поиска почти дубликатов предлагается версия алгоритма шинглов, использующая случайную выборку 84х случайных шинглов.</p>
<p>Почему именно 84?&nbsp;Использование 84х случайно выбранных значений контрольных сумм позволит легко модифицировать алгоритм до&nbsp;алгоритма супершинглов и&nbsp;мегашинглов, которые гораздо менее ресурсоемки. Их&nbsp;я&nbsp;опишу ближайшее время.</p>
<p><i>Рекомендую вооружиться ручкой и&nbsp;листком бумаги и&nbsp;фигурально представлять в&nbsp;виде рисунка каждый из&nbsp;этапов, описанных ниже.</i></p>
<h3>Итак, алгоритм шинглов для веб-документов</h3>
<p>Разберем, через какие этапы проходит текст, подвергшийся сравнению:</p>
<ol>
<li>канонизация текста;</li>
<li>разбиение на&nbsp;шинглы;</li>
<li>вычисление хэшей шинглов с&nbsp;помощью 84х статических функций;</li>
<li>случайная выборка 84&nbsp;значений контрольных сумм;</li>
<li>сравнение, определение результата.</li>
</ol>
<h4>1.&nbsp;Канонизация текста</h4>
<p>Что такое канонизация текста я&nbsp;описывал в&nbsp;своей прошлой статье об&nbsp;алгоритме шинглов. Но&nbsp;в&nbsp;коротко повторюсь. Канонизация текста приводит оригинальный текст к&nbsp;единой нормальной форме.</p>
<p>Текст очищается от&nbsp;предлогов, союзов, знаков препинания, HTML тегов, и&nbsp;прочего не&nbsp;нужного &laquo;мусора&raquo;, который не&nbsp;должен участвовать в&nbsp;сравнении. В&nbsp;большинстве случаев так&nbsp;же предлагается удалять из&nbsp;текста прилагательные, так как они не&nbsp;несут смысловой нагрузки.</p>
<p>Так&nbsp;же на&nbsp;этапе канонизации текста можно приводить существительные к&nbsp;именительному падежу, единственному числу, либо оставлять от&nbsp;них только корни.</p>
<p>С&nbsp;канонизацию текста можно экспериментировать и&nbsp;экспериментировать, простор для действий тут широк.</p>
<p>На&nbsp;выходе имеем текст, очищенный от&nbsp;&laquo;мусора&raquo;, и&nbsp;готовый для сравнения.</p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/08/shingles-1.png" alt="Процесс канонизации текста" /></p>
<h4>2.&nbsp;Разбиение на&nbsp;шинглы</h4>
<p>Шинглы (англ)&nbsp;&mdash; чешуйки, выделенные из&nbsp;статьи подпоследовательности слов.</p>
<p>Необходимо из&nbsp;сравниваемых текстов выделить подпоследовательности слов, идущих друг за&nbsp;другом по&nbsp;10&nbsp;штук (длина шингла). Выборка происходит внахлест, а&nbsp;не&nbsp;встык.</p>
<p>Таким образом, разбивая текст на&nbsp;подпоследовательности, мы&nbsp;получим набор шинглов в&nbsp;количестве равному количеству слов минус длина шингла плюс один (кол_во_слов&nbsp;&mdash; длина_шингла + 1).</p>
<p>Напоминаю, что действия по&nbsp;каждому из&nbsp;пунктов выполняются для каждого из&nbsp;сравниваемых текстов.</p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/08/shingles-2.png" alt="Процесс разбиения текста на шинглы" /></p>
<h4>3.&nbsp;Вычисление хэшей шинглов с&nbsp;помощью 84х статических функций</h4>
<p>Вот этот этап самый интересный. Принцип алгоритма шинглов заключается в&nbsp;сравнении случайной выборки контрольных сумм шинглов (подпоследовательностей) двух текстов между собой.</p>
<p>Проблема алгоритма заключается в&nbsp;количестве сравнений, ведь это напрямую отражается на&nbsp;производительности. Увеличение количества шинглов для сравнения характеризуется экспоненциальным ростом операций, кто критически отразится на&nbsp;производительности.</p>
<p>Предлагается представить текст в&nbsp;виде набора контрольных сумм, рассчитанных через 84х уникальные между собой статические хэш функции.</p>
<p>Поясню: для каждого шингла рассчитывается 84&nbsp;значения контрольной суммы через разные функции (например SHA1, MD5, CRC32 и&nbsp;т.д., всего 84&nbsp;функции). Итак каждый из&nbsp;текстов будет представлен, можно сказать, в&nbsp;виде двумерного массива из&nbsp;84х строк, где каждая строка характеризует соответствующую из&nbsp;84х функций контрольных сумм.</p>
<p>Из&nbsp;полученных наборов будут случайным образом отобраны 84&nbsp;значения для каждого из&nbsp;текстов и&nbsp;сравнены между собой в&nbsp;соответствии функции контрольной суммы, через которую каждый из&nbsp;них был рассчитан. Таким образом, для сравнения будет необходимо выполнить всего 84&nbsp;операции.</p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/08/shingles-3.png" alt="Нахождение контрольных сумм шинглов" /></p>
<h4>4.&nbsp;Случайная выборка 84&nbsp;значений контрольных сумм</h4>
<p>Как я&nbsp;описывал выше, сравнивать элементы каждого из&nbsp;84х массивов между собой&nbsp;&mdash; ресурсоемко. Для увеличения производительности выполним случайную выборку контрольных сумм для каждой из&nbsp;84х строк двумерного массива, для обоих текстов. Например, будем выбирать самое минимальное значение из&nbsp;каждой строки.</p>
<p>Итак, на&nbsp;выходе имеем набор из&nbsp;минимальных значений контрольных сумм шинглов для каждой из&nbsp;хэш функций.</p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/08/shingles-4.png" alt="Случайная выборка шинглов" /></p>
<h4>5.&nbsp;Сравнение, определение результата</h4>
<p>И&nbsp;последний этап&nbsp;&mdash; сравнение. Сравниваем между собой 84&nbsp;элемента первого массива с&nbsp;соответствующими 84ю элементами второго массива, считаем отношение одинаковых значений, из&nbsp;этого получаем результат.</p>
<p><img src="http://www.codeisart.ru/wp-content/uploads/2009/08/shingles-5.png" alt="Сравнение, результат" /></p>
<h3>Заключение</h3>
<p>Надеюсь, я&nbsp;доступно смог изложить теорию нахождения почти дубликатов для веб-документов, описанную в публикации Зеленкова&nbsp; Ю.&nbsp;Г. и&nbsp;Сегаловича И.В. не&nbsp;вдаваясь в&nbsp;особенности реализации на&nbsp;конкретном языке программирования.</p>
<p>Во&nbsp;второй статье цикла я&nbsp;собираюсь описать алгоритм супершинглов для веб-документов.</p>
<p>Надеюсь было интересно, удачи.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeisart.ru/part-1-shingles-algorithm-for-web-documents/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Served from: www.codeisart.ru @ 2012-02-04 10:29:17 -->
