МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

advertisement
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»
(ФГБОУ ВПО «КубГУ»)
Кафедра вычислительных технологий
РАЗРАБОТКА ПОИСКОВОЙ СИСТЕМЫ ДЛЯ НАПОЛНЕНИЯ
ЭЛЕКТРОННОЙ НАУЧНОЙ БИБЛИОТЕКИ
«МОДЕЛИРОВАНИЕ КОМПЬЮТЕРНЫХ СИСТЕМ И СЕТЕЙ»
О.Е.Кучин
Краснодар 2014
2
СОДЕРЖАНИЕ
ВВЕДЕНИЕ…………………………………………………………………...3
1. Понятие информационного поиска………………………………………4
2. Информационный поиск как наука………………………………………5
3. Модели информационного поиска……………………………………….6
4. Информационно – поисковые системы………………………………….7
5. Поиск информации в интернете………………………………………….13
5.1. Поиск с помощью поисковых машин……………………………….15
6. Ранжирование……………………………………………………………..17
6.1. Ранжирование по содержимому…………………………………….17
6.2. Использование внешних ссылок на сайт…………………………...18
7. Описание структуры прототипа поисковой системы….……………….23
ЗАКЛЮЧЕНИЕ..……………………………………………………………..28
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ.………………….…….29
ПРИЛОЖЕНИЕ 1. Исходный код программы……………………………..30
ВВЕДЕНИЕ
3
На данный момент нет практически ни одной области человеческой
деятельности, которая в той или иной степени не была связана с процессами
получения и обработки информации. Информация стала важным инструментом
политики и культуры, промышленности, науки и образования. Информация это
сведения
об
окружающем
мире,
которые
повышают
уровень
осведомленности человека.
Изучение и использование поисковых систем, методов ранжирования и
других вопросов телекоммуникационных технологий, как в технологическом,
так и в информационном, модельном аспектах для получения необходимой
информации является актуальной проблемой в настоящее время.
В данной курсовой работе рассматриваются теоретические и практические
основы
информационного
поиска,
классификация,
разновидности
информационно-поисковых систем и текущие проблемы в этой области, а
также общая структура поисковой системы.
Цель курсовой работы – создать собственную поисковую систему,
проанализировать понятие информационного поиска и его эффективность.
Задачей курсовой работы является анализ поисковых систем и описание их
основных характеристик, а также написание собственной поисковой машины.
1. Понятие информационного поиска
4
Информационный поиск, родившись на стыке библиотечного дела и
информатики в середине XX века, некоторое время оставался скромной
научной и прикладной областью, в которой работало небольшое количество
ученых. Бурный рост интернета в конце прошлого — начале нынешнего века
стал мощнейшим стимулом развития дисциплины.
Современный информационный поиск — это миллионы пользователей,
огромные объемы данных, мощные вычислительные системы, разнообразные
алгоритмы. Для решения изначальной задачи — поиска информации,
соответствующей
потребности
пользователя,
—
привлекаются
методы
машинного обучения, анализа мультимедийной информации, компьютерная
лингвистика,
геоинформационные
сервисы,
исследуется
психология
пользователей, их социальные связи, удобство интерфейсов и т.д.
Термин "информационный поиск" (ИП) имеет много значений. Формальное
понятие информационного поиска в нашем случае (англ. термин Information
retrieval)
–
это
задача
поиска
неструктурированной
или
плохо
структурированной информации (т.к. большинство всё-таки имеет структуру,
хотя и не всегда очевидную). Это относится к поиску информации в
документах, поиск самих документов, извлечению метаданных из документов,
поиску текста, изображений, видео и звука в локальных реляционных и
гипертекстовых базах данных.
Термин «информационный поиск» был впервые введен американским
математиком Келвином Муэрсом в 1947 году и употребляется в литературе с
1950 года.
Объектами информационного поиска могут быть документы, сведения об их
наличии и (или) местонахождении, фактографическая информация.
Информационный поиск – в широком смысле – последовательность
операций, направленных на предоставление информации заинтересованным
лицам, процесс отыскания в некотором множестве текстов (документов) всех
таких, которые посвящены указанной в запросе теме или содержат нужные
потребителю факты и сведения.
5
2. Информационный поиск как наука
Информационный поиск — большая междисциплинарная область науки,
стоящая
на
пересечении
когнитивной
психологии,
информатики,
информационного дизайна, лингвистики, семиотики, и библиотечного дела.
Информационный поиск рассматривает поиск информации в документах,
поиск самих документов, извлечению метаданных из документов, поиску
текста, изображений, видео и звука в локальных реляционных базах данных, в
гипертекстовых базах данных таких, как Интернет и локальные интернетсистемы.
В настоящее время информационный поиск — это бурно развивающаяся
область науки, популярность которой обусловлено экспоненциальным ростом
объемов информации, в частности в сети Интернет.
Классическая задача информационного поиска, с которой началось
развитие этой области, — это поиск документов, удовлетворяющих запросу, в
рамках некоторой статической коллекции документов.
Запрос — это формализованный способ выражения информационных
потребностей пользователем системы.
Объект запроса — это информационная сущность, которая хранится в базе
автоматизированной системы поиска. Несмотря на то, что наиболее
распространенным объектом запроса является текстовый документ, не
существует никаких принципиальных ограничений. В частности, возможен
поиск изображений, музыки и другой мультимедиа информации.
Центральная задача информационного поиска — помочь пользователю
удовлетворить
его
информационную
потребность.
Так
как
описать
информационные потребности пользователя технически непросто, они
6
формулируются как некоторый запрос, представляющий из себя набор
ключевых слов, характеризующий то, что ищет пользователь.
Информационный поиск, должен обеспечивать, решение 4 основных задач:
 поиск
релевантной
(точно
соответствующей
информационной
потребности специалиста) информации;
 поиск аналоговой информации в смежных областях (расширение
исходной информации);
 обобщение и уточнение полученной информации;
 анализ и оценку информации, исходя из собственных реальных задач.
3. Модели информационного поиска
Основной идеей построения поисковых систем было создание индекса,
представляющего собой некую базу данных, в которой ставиться соответствие
между существующими частями документов (словами, термами) и самими
документами, т.е. там, где эти слова встречаются. На основе этих индексов
действуют несколько моделей поиска.
Модель поиска – это некоторое упрощение реальности, на основании
которого получается формула, позволяющая программе принять решение:
какой документ считать найденным.
Классическими моделями являются
модели: булевская модель, векторная, вероятностная и алгебраическая модель.
Булевская модель. Она является самой распространенной и простой
моделью,
основанной
на
булевской
алгебре.
Согласно
этой
модели,
выполняется поиск в индексе, представленный как матрица документов и
термов (слов). Над множествами результатов поиска выполняются логические
операции: И, ИЛИ, НЕ. Если слово, указанное в запросе, присутствует в
документе, то он считается найденным, в противном случае не найденным.
Векторная модель. Основной идей этой модели является представление
документов и запросов в виде векторов. Каждому терму в документе и запросу
7
ставится в соответствии неотрицательный вес. Таким образом, каждый запрос и
документ
может
быть
представлен
в
виде
k-мерного вектора.
Dj = (w1j, w2j, ... , wkj), где Dj – j-й документ, wij– вес, i-го терма в j -м документе.
Данная модель достаточно широко применяется на практике.
Вероятностная модель. Каркасом для таких моделей выступает теория
вероятностей. Вероятностная модель поиска базируется на теоретических
подходах байесовских условных вероятностей.
Основным подходом вероятностной модели является вероятностная оценка
веса термов в документе. С другой стороны, в качестве оценки соответствия
документа запросу используется вероятность того, что пользователь признает
документ подходящим. При описании вероятностной модели, так же,
используется словарь массива, включающий все термы, встречающиеся хотя бы
в одном документе из информационного массива. Документу сопоставляется
вектор x = (t1, ..., tn). Здесь, как и ранее, терм задается своим порядковым
номером в словаре, а n - общее количество термов в словаре коллекции. Данные
модели редко применяются на практике.
Вполне естественно, что не все модели могут быть отнесены только к
одному из этих классов, есть и гибридные модели.
4. Информационно – поисковые системы
Информационно-поисковая система (ИПС) - это система, обеспечивающая
поиск и отбор необходимых данных в специальной базе с описаниями
источников информации (индексе) на основе информационно-поискового языка
и соответствующих правил поиска. Массив элементов информации, в котором
производится ИП, называется поисковым массивом. Поисковые системы так же
называют поисковыми машинами.
Главной задачей любой ИПС является поиск информации, релевантной
информационным потребностям пользователя. Очень важно в результате
8
проведенного поиска найти все документы, относящиеся к запросу, и ничего
лишнего. Так же важной задачей информационно-поисковой системы является
индексирование. Процесс индексирования заключается в получении и
переработке страниц интернет-сайтов и последующем ее хранении. При этом
индекс (базу) поисковой системы стараются устроить таким образом, чтобы
процесс поиска был как можно более быстрым и эффективным.
ИПС представляет собой комплекс программных и аппаратных средств,
который обеспечивает отбор и представление электронных документов по
заданным критериям. Под документом чаще всего понимается содержательно
законченный текстовый информационный ресурс, который можно каким-либо
образом
уникально
идентифицировать.
ИПС
оперируют
электронными
документами, то есть представлениями документов на машиночитаемых
носителях в ЭВМ. Данные системы работают с множествами документов,
которые называются коллекциями документов.
В общем случае процедура ИП состоит из четырех этапов:
1. Уточнения информационной потребности и формулировки запроса;
2. Определения совокупности держателей информационных массивов;
3. Извлечения информации из информационных массивов;
4. Ознакомления пользователя с полученной информацией и оценки
результатов поиска.
Итак, в определенный момент времени у некоторого пользователя возникает
информационная потребность в документах по той или иной нужной ему
тематике, которая обычно достаточно узка. В начальный момент эта
потребность часто не может быть точно выражена словами. При этом любая
поисковая система требует достаточно четких запросов.
Следовательно, пользователь должен представить свою информационную
потребность в виде некоторого выражения, которое может быть воспринято
поисковой системой.
Выделяют четыре этапа представления информационной потребности:
9
− реальная информационная потребность – это неосознанная истинная
информационная потребность пользователя (потребность в некоторой новой
информации при решении стоящей перед пользователем задачи);
− осознанная информационная потребность – появляется после осознания
пользователем стоящей перед ним проблемы (осознанная потребность
отличается от реальной);
−
выраженная информационная потребность
– результат описания
осознанной информационной потребности с помощью естественного языка;
−
формализованная
информационная
потребность
–
это
результат
представления выраженной потребности средствами формального поискового
языка ИПС.
Информационно-поисковый язык – искусственный язык, предназначенный
для формализованного описания смыслового содержания документов, данных,
отдельных понятий или терминов и обеспечения последующего их поиска в
информационно-поисковых массивах.
Необходимость
специальном
формулирования
информационной
информационно-поисковом
языке
потребности
определяется
тем,
на
что
интерпретировать естественный язык весьма сложно.
Многие
популярные
поисковые
системы
составлять запросы на естественном языке.
позволяют
пользователям
Однако в таком случае
информационную потребность в формализованном виде определяет сама
система.
Информационная потребность, сформулированная на информационнопоисковом языке, называется запросом. Запрос поступает в ИПС, и система
возвращает некоторый ответ. Степень соответствия ответов поисковой системы
запросу пользователя, а значит, и его информационной потребности,
называется релевантностью.
Релевантность – это фундаментальное понятие теории информационного
поиска. Тем не менее, оно не является специфичным для информационнопоисковых систем, и изучается многими направлениями науки: философией,
10
психологией,
теорией
искусственного
интеллекта,
теорией
обработки
естественных языков и другими.
Понятие релевантности возникло одновременно с появлением первых
библиотек, посетителям которых требовалось найти книги для удовлетворения
информационной
потребности.
Стимулом
для
детального
анализа
релевантности послужило появление в середине ХХ века информационнопоисковых систем. Обсуждение понятия релевантности продолжается уже
более полувека, но, несмотря на это, его единого общепринятого определения
до сих пор не существует.
Наиболее часто используются следующие виды релевантности:
1.Когнитивная релевантность, или пертинентность – характеризует
степень соответствия информации из документа и реальной информационной
потребности пользователя. Это истинная и наиболее трудноопределимая
релевантность. Остальные виды релевантности являются ее приближениями.
2.Тематическая (предметная) релевантность – характеризует степень
близости предмета (тематики) информационной потребности и найденного
документа. Под тематикой здесь понимается область интересов пользователя, в
пределах которой существует его информационная потребность.
3.Ситуационная релевантность – определяет полезность информационного
ресурса для задачи, решаемой пользователем, с точки зрения временных затрат,
способа взаимодействия пользователя с системой и прочее.
4.Системная (алгоритмическая) релевантность – характеризует степень
близости между формализованной информационной потребностью (запросом)
и найденным поисковой системой документом.
На практике релевантность в основном определяется
при
оценке
просматриваемых документов – подходит ли данный документ пользователю
или не подходит. Один и тот же документ может быть релевантным согласно
одному определению релевантности и нерелевантным согласно другому. Так,
документ, релевантный алгоритмически, может оказаться непертинентным.
11
Например, если в неспециализированной ИПС искать информацию о теории
автоматов и использовать для этого запрос, состоящий из слова "автомат", то
велика вероятность получения ряда непертинентных документов из области
вооружения и электротехники, описывающих торговые автоматы и оружие.
При
этом
найденные
непертинентные
документы
формально
будут
соответствовать запросу, так как в их тексте содержится термин запроса –
"автомат".
Различные
определения
релевантности
весьма
затрудняют
оценку
эффективности поиска информации. Качество поиска в информационнопоисковых системах обычно характеризуется такими критериями как полнота,
точность, выпадение и шум.
Полнота поиска (recall). Отношение числа найденных релевантных
документов, к общему числу релевантных документов в базе:
,
где Drel — это множество релевантных документов в базе, а Dretr —
множество документов, найденных системой.
Точность (precision). Определяется как отношение числа релевантных
документов, найденных ИПС, к общему числу документов:
,
где Drel — это множество релевантных документов в базе, а Dretr —
множество документов, найденных системой.
Выпадение (fall-out). Выпадение характеризует вероятность нахождения
нерелевантного ресурса и определяется, как отношение числа найденных
нерелевантных документов к общему числу нерелевантных документов в базе:
12
,
где Dnrel — это множество нерелевантных документов в базе, а Dretr —
множество документов, найденных системой.
Из-за многозначности определения релевантности абсолютного критерия
точности поиска не существует, и в результатах любого поиска всегда
присутствуют
как
релевантные,
так
и
нерелевантные
документы.
Нерелевантные документы, которые сравниваются с релевантными, иногда
называются шумом.
Шум (noise). Определяется путем деления количества выданных в
результате выполнения поиска нерелевантных документов на общее число
выданных документов:
,
где Dnrel — это множество нерелевантных документов в базе, а Dretr —
множество документов, найденных системой.
Слишком большой шум затрудняет выделение пертинентных документов из
множества найденных, а слишком малый не даёт уверенности в достаточной
полноте поиска.
Практика показывает, что пользователь, который ищет информацию,
полагает число найденных документов удовлетворительным, когда количество
непертинентных документов лежит в интервале 10–30% от общего числа
найденных. Важно отметить, что в результате анализа статистики запросов
большого числа пользователей к известным поисковым системам выяснилось,
что средняя длина запроса не превышает двух слов, и пользователи, как
правило, используют самую простую форму запроса. Поэтому нельзя
рассчитывать на то, что пользователь поисковой системы будет формулировать
достаточно сложные эффективные запросы. Современная поисковая система
должна самостоятельно выявлять информационные потребности конкретного
пользователя и учитывать их при поиске.
13
Проблемы, возникающие при поиске информации.
Одна из проблем является чисто методологической. Для проведения
эффективного поиска мы заинтересованы в одновременном решении двух
противоположных задач: увеличение охвата с целью извлечения максимального
количества значимой информации; и наоборот, уменьшение охвата с целью
минимизации шумовой информации. Одновременно осуществить это довольно
сложно, хотя и возможно. Один из методов - это введение явных ограничений
(запрещенных слов). Другой метод состоит в правильном формировании
запросов, в частности, в предпочтении нескольких конкретизированных
запросов одному общему.
Другая проблема – большая вариативность человеческого языка. Если в
английском языке некоторые слова имеют множество различных значений, то
русский отличается богатством морфологических вариаций слов, а для полноты
поиска необходимо учитывать еще и синонимы, а также различные склонения
слов.
5. Поиск информации в интернете
Поиск информации является одной из наиболее распространенных и
одновременно наиболее сложных задач, с которыми приходится сталкиваться в
Сети
любому
пользователю.
информационном
поиске
в
Причина
Интернете,
сложностей,
определяется
возникающих
двумя
при
главными
факторами. Во-первых, число источников в Сети чрезвычайно велико. Вовторых, массив информации в Сети не только огромен по объему, но еще и
крайне динамичен. За те полминуты, что мы потратим на чтение первых строк
этого раздела, в виртуальной вселенной появится порядка сотни новых или
измененных документов, десятки будут перемещены на новые адреса, а
единицы - навсегда прекратят свое существование.
Необходимость и важность проблемы информационного поиска привела к
образованию в Интернете целой отрасли, задача которой заключается именно в
14
оказании помощи пользователю в его навигации в киберпространстве.
Составляют эту отрасль специальные поисковые службы или сервисы. Условно
их можно разделить на каталоги (dirесtоriеs) и поисковые мaшины (sеаrсh
еnginеs).
Эти разновидности внешне очень похожи, поскольку каждый каталог, как
правило, обладает собственной поисковой машиной, а каждая поисковая
машина - собственным каталогом. Однако принципы их работы базируются на
абсолютно разных подходах и технологиях. Каждый из этих инструментов
имеет определенные преимущества, а основная разница между ними
заключается в участии/неучастии человека.
Поисковые машины запускают в Web программных «пауков» (spiders),
которые путешествуют со страницы на страницу и на каждой индексируют ее
полный текст.
Каталоги же формируются людьми-редакторами, которые прочитывают
страницы, отсеивают неподходящие и классифицируют узлы по темам. При
этом каждая разновидность поисковых сервисов применяется для решения
определенного типа задач.
Приступая к информационному поиску в Интернете, следует всегда помнить
несколько основных моментов. Прежде всего, никакие средства навигации каталоги
или
поисковые
информационного
массива
машины
-
Интернета.
не
охватывают
Причина
этого
всего
-
текущего
постоянный
колоссальный прирост объемов информации в Интернете, который, несмотря
на все усилия навигационных служб, содержит огромное число белых пятен.
Помимо
быстрого
роста
и
изменения
местоположения
документов,
большинство поисковых систем имеют внутренние ограничения на отражение
материалов одного сайта и на объем индексируемой части страницы.
В тоже время многие крупные сайты имеют собственную систему поиска,
которая отражает весь их информационный массив. Выявив такие сервера с
помощью каталогов, можно провести более детальное их обследование
использовав локальный поисковый механизм. Таким образом, для достижения
15
наиболее полных результатов следует применять каталоги и поисковые
машины в сочетании друг с другом.
5.1 Поиск с помощью поисковых машин
Поисковые машины (системы) — это более современный и удобный способ
навигации и поиска в Сети. В отличие от каталогов, поисковая система — это
полностью автоматизированная структура.
К преимуществам поисковых машин следует отнести следующие: малое
количество в результатах поиска устаревших ссылок; намного большее
количество Web-узлов, по которым производится поиск; более высокая
скорость поиска; высокая релевантность поиска; наличие дополнительных
сервисных
функций,
облегчающих
работу
пользователя,
например,
возможность перевода текста документа на иностранный язык, способность
выделять все документы с определенного сайта, сужение критериев в ходе
поиска, нахождение документов "по образцу" и многое другое.
В
основу
работы
поисковых
машин
заложены
совершенно
иные
технологические принципы. Задача поисковых машин - обеспечивать детальное
разыскание информации в электронной вселенной, что может быть достигнуто
только за счет учета (индексирования) всего содержания максимально
возможного
числа
Web-страниц.
В
отличие
от
каталогов,
все
они
функционируют в автоматизированном режиме и имеют одинаковый принцип
действия.
Поисковые системы состоят из двух базовых компонентов. Первый
компонент представляет собой программу-робот (spider, crawler), задача
которого - обход Web-страниц с целью занесения информации о них в базу
данных поисковой системы. При этом робот, просматривая содержимое
16
документа, находит новые ссылки, как на другие документы данного сервера,
так и на внешние сайты. Программа самостоятельно направляется по
указанным ссылкам, находит новые документы и ссылки в них, после чего
процесс повторяется вновь, напоминая хорошо известный в библиографии
"метод
снежного
кома".
Выявленные
документы
обрабатываются
(индексируются) вторым компонентом поисковой системы. При этом, как
правило, учитывается все содержание страницы, включая текст, иллюстрации,
аудио и видео файлы и пр. Индексации подвергаются все слова в документе,
что как раз и дает возможность использовать поисковые системы для
детального поиска по самой узкой тематике. Образуемые гигантские индексные
файлы, хранящие информацию о том, какое слово, сколько раз, в каком
документе и на каком сервере употребляется, и составляет базу данных, к
которой происходит обращение пользователей, вводящих в строку запроса
сочетания ключевых слов.
Выдача результатов осуществляется с помощью специального модуля,
который
производит
интеллектуальное
ранжирование
результатов.
Ранжированием называется операция сортировки полученных результатов.
При этом берется в расчет местоположение термина в документе (название,
заголовок, основной текст), частота его повторения, процентное соотношение
искомого термина к остальному тексту страницы, a также число и
авторитетность внешних ссылок на данную страницу с других сайтов.
Однако у поисковых машин существуют некоторые недостатки:
1. Ограниченная область поиска. Если какой – либо сайт не был внесен в
базу данных поисковой машины, он для нее не «существует», и его документы
в результаты поиска попасть не могут;
2. Относительная сложность использования. Для того чтобы составленный
запрос на поиск точно соответствовал тому, что именно требуется найти, нужно
хотя бы немного представлять, как работает поисковая машина, и уметь
использовать простейшие логические операторы. Поисковые каталоги в этом
смысле проще и привычнее.
17
3. Менее наглядная форма представления результатов запроса. Каталог
выдает название сайта с его краткой аннотацией и другой полезной
информацией. Результаты работы поисковой машины менее наглядны;
поскольку базу данных поисковой машины пополняют программы – роботы,
владельцы рекламных сайтов могут их «обмануть», из-за чего релевантность
поиска может быть значительно снижена (SEO).
Поисковые машины более распространены, чем каталоги, и число их,
составляющее
сегодня
нескольких
десятков,
продолжает
неуклонно
увеличиваться.
Глобальные поисковые машины уделяют большое внимание зарубежным
ресурсам Сети. Поиск информации на серверах в пределах отдельной страны
является задачей локальных машин, которые специально приспособлены к
особенностям конкретного языка.
6. Ранжирование
В случае больших объёмов данных человек не имеет практической
возможности просмотреть все результаты, выданные поисковой машиной, так
как их слишком много и вывод результата будет осуществлена в том порядке, в
котором паук посещал страницы. В связи с этим, необходимо производить
упорядочивание позиций результата. Чтобы решить эту проблему, необходимо
как-то присвоить страницам ранг относительно данного запроса и уметь
возвращать их в порядке убывания рангов.
В следующей части будут рассмотрены некоторые способы ранжирования
результатов. Для ранжирования по содержимому есть несколько возможных
метрик, которые для определения релевантности запросу учитывают только
содержимое страницы. При ранжировании с учетом внешних ссылок для
определения того, что важно, принимается во внимание структура ссылок на
сайт.
18
6.1 Ранжирование по содержимому
По частоте слов. Метрика, основанная на частоте слов, ранжирует
страницу исходя из того, сколько раз в ней встречаются слова, упомянутые в
запросе.
Использование только частоты термина в документе недостаточно, так как
не все термины документа одинаково важны в подсчете релевантности:
например, слово "модульный" дает больше информации о тематике документа,
чем, например, союз "или". Другими словами, разные термины оказывают на
релевантность разное влияние, даже если они встречаются в документе
одинаково часто.
По расположению в документе. Еще одна простая метрика для определения
релевантности страницы запросу – расположение поисковых слов на странице.
Обычно, если страница релевантна поисковому слову, то это слово
расположено близко к началу страницы, быть может, даже находится в
заголовке. Чтобы воспользоваться этим наблюдением, поисковая машина
может приписывать результату больший ранг, если поисковое слово
встречается в начале документа.
Важно понимать, что ни одна из вышеупомянутых метрик не лучше другой
во всех случаях. Оба списка приемлемы в зависимости от намерений ищущего,
и для достижения оптимальных результатов для конкретного набора
документов и приложения требуется задавать разные веса.
По расстоянию между словами. Если запрос содержит несколько слов, то
часто бывает полезно ранжи-ровать результаты в зависимости от того,
насколько близко друг к другу встречаются поисковые слова. Как правило,
вводя запрос из нескольких слов, человек хочет найти документы, в которых
эти слова концептуально связаны. Это более слабое условие, чем фраза,
заключенная в кавычки, когда слова должны встречаться точно в указанном
порядке без промежуточных слов. Рассматриваемая метрика допускает
изменение порядка и наличие дополнительных слов между поисковыми.
19
6.2 Использование внешних ссылок на сайт
Все обсуждавшиеся до сих пор метрики ранжирования были основаны на
содержимом страницы. Хотя многие поисковые машины и по сей день
работают таким образом, часто результаты можно улучшить, приняв во
внимание, что говорят об этой странице другие, а точнее те сайты, на которых
размещена ссылка на нее. Особенно это полезно при индексировании страниц
сомнительного содержания или таких, которые могли быть созданы спамерами,
поскольку маловероятно, что на такие страницы есть ссылки с настоящих
сайтов.
Простой подсчёт ссылок. Простейший способ работы с внешними
ссылками заключается в том, чтобы подсчитать, сколько их ведет на каждую
страницу, и использовать результат в качестве метрики. Так обычно
оцениваются научные работы; считается, что их значимость тем выше, чем
чаще их цитируют.
Очевидно, что при использовании одной лишь этой метрики будут
возвращены все страницы, содержащие поисковые слова, упорядоченные по
числу внешних ссылок на них. Чтобы объединить релевантность с
ранжированием по внешним ссылкам, надо использовать последнее в
сочетании с одной из рассмотренных выше метрик.
Описанный алгоритм трактует все внешние ссылки одинаково, но такой
уравнительный
подход
открывает
возможность
для
манипулирования,
поскольку кто угодно может создать несколько сайтов, указывающих на
страницу, ранг которой он хочет поднять. Также возможно, что людям более
интересны страницы, которые привлекли внимание каких-то популярных
сайтов.
Алгоритм PageRank. Этот алгоритм был придуман основателями компании
Google, и вариации этой идеи теперь применяются во всех крупных поисковых
машинах. Этот алгоритм приписывает каждой странице ранг, оценивающий ее
20
значимость. Значимость страницы вычисляется исходя из значимостей
ссылающихся на нее страниц и общего количества ссылок, имеющихся на
каждой из них.
Теоретически алгоритм PageRank (названный по фамилии одного из его
изобретателей Лари Пейджа (Larry Page)) рассчитывает вероятность того, что
человек, случайно переходящий по ссылкам, доберется до некоторой страницы.
Чем больше ссылок ведет на данную страницу с других популярных страниц,
тем выше вероятность, что экспериментатор чисто случайно наткнется на нее.
Разумеется, если пользователь будет щелкать по ссылкам бесконечно долго, то
в конце концов он посетит каждую страницу, но большинство людей в какой-то
момент останавливаются. Чтобы учесть это, в алгоритм PageRank введен
коэффициент затухания 0.85, означающий, что пользователь продолжит
переходить по ссылкам, имеющимся на текущей странице, с вероятностью 0.85.
Рисунок 1 – Вычисление ранга PageRank страницы A
Пример:
Каждая из страниц B, C и D ссылается на A, и для них ранг уже вычислен
(рис. 1). На странице B есть ссылки еще на три страницы, а на странице C – на
четыре. D ссылается только на A. Чтобы вычислить ранг A, берем ранги (PR)
каждой ссылающейся на A страницы, делим их на общее число ссылок на этой
странице, складываем получившиеся значения, затем умножаем результат на
коэффициент затухания 0,85 и добавляем минимальную величину 0,15. Вот как
производится вычисление PR(A):
21
PR(A) = 0,15 + 0,85 × (PR(B)/ссылки(B) + PR(C)/ссылки(C) +
PR(D)/ссылки(D))
= 0,15 + 0,85 ×(0,5/4 + 0,7/5 + 0,2/1)
= 0,15 + 0,85 ×(0,125 + 0,14 + 0,2)
= 0,15 + 0,85 ×0,465
= 0,54525
Обратите внимание, что D дает больший вклад в ранг A, чем B или C, хотя
ее собственный ранг меньше. Это вызвано тем, что D ссылается только на A и,
значит, привносит в результат свой ранг целиком.
К сожалению, имеется тут небольшая проблема – в данном примере для всех
страниц, ссылающихся на A, уже вычислен ранг. Но невозможно вычислить
ранг страницы, пока неизвестны ранги ссылающихся на нее страниц, а эти
ранги можно вычислить, только зная ранги страницы, которые ссылаются на
них. Так как же вычислить значение
PageRank для множества страниц, ранги которых еще неизвестны? Решение
состоит в том, чтобы присвоить всем страницам произвольный начальный ранг
(в программе ниже взято значение 1,0, но на самом деле точная величина
несущественна) и провести несколько итераций. После каждой итерации ранг
каждой страницы будет все ближе к истинному значению PageRank.
Количество необходимых итераций зависит от числа страниц, но для того
небольшого набора 20 должно быть достаточно.
Использование текста ссылки. Еще один полезный способ ранжирования
результатов – использование текста ссылок на страницу при определении
степени ее релевантности запросу. Часто удается получить более качественную
информацию из того, что сказано в ссылках, ведущих на страницу, чем из
самой страницы, поскольку авторы сайтов обычно включают краткое описание
того, на что ссылаются.
Если страница, на которую ведет ссылка, совпадает с каким-нибудь
результатом поиска, то ранг источника ссылки прибавляется к окончательному
рангу этой страницы. Страница, на которую ведет много ссылок со значимых
22
страниц, содержащих поисковые слова, получит крайне высокий ранг. Для
многих найденных страниц вообще не будет ссылок с подходящим текстом,
поэтому их ранг окажется равен нулю.
Вывод
Не существует стандартных весов для всех рассмотренных метрик, которые
были бы одинаково хороши во всех случаях. Даже самые крупные поисковые
машины часто изменяют методы ранжирования результатов. Метрики и
назначаемые им веса сильно зависят от конкретного приложения.
7. Описание структуры созданной поисковой системы
Spider
DB
Ranker
Indexer
Ranked list
Паук(Spider).
Этот модуль «опрашивает» заданные страницы и сохраняет полученные
результаты в заранее определенном формате. Все страницы сохраняются в один
файл, который на следующем этапе работы поисковой системы обрабатывается
индексатором.
Принцип работы паука сводится к 2 основным действиям: опросить
страницу и сохранить ответ.
Пауку дается список, но не строго тех страниц, которые он должен обойти, а
точек входа. Опросив такие страницы, паук получает список страниц, на
23
которые они ссылаются, и опрашивает на следующем этапе уже их. Этот
процесс продолжается пока не сработает условие прекращения работы паука.
Таких условий тоже может быть несколько. Мы воспользовались условием
глубины опроса: паук опрашивает точку входа и делает еще не более заданного
количества переходов «в глубину» сайта. Таким образом мы опрашиваем ту
часть сайта, которую, скорее всего, просмотрят пользователи, перейдя по той
же ссылке, по которой располагается наша точка входа, и при этом можем быть
точно уверены в том, что рано или поздно паук прекратит свою работу именно
благодаря этому условию.
Для каждой страницы вызывается функция addtoindex() с помощью которой
выполняется индексация страницы.
Также у нас есть условие, согласно которому паук не должен обрабатывать
страницы больше указанной глубины вложенности, которое проверяется на
этапе подготовки запроса к странице. Если страница находится за пределами
указанной нами глубины, то запрос не выполняется и паук переходит к
обработке следующей страницы в списке ссылок.
Для работы паука использовались высокоуровневые библиотеки urllib2 и
BeautifulSoup. Краткое описание:
 urllib2 – Этот модуль предоставляет средства высокого уровня для
чтения сетевых ресурсов, используя различные протоколы. В
частности функция urlopen() ведет себя аналогично встроенной
функции open(), но воспринимает URL (Uniform Resource Locator,
единообразный указатель ресурса) вместо имени файла.
 BeautifulSoup - это парсер для синтаксического разбора файлов
HTML/XML, написанный на языке программирования Python,
который может преобразовать даже неправильную разметку в дерево
синтаксического разбора. Он поддерживает простые и естественные
способы навигации, поиска и модификации дерева синтаксического
разбора.
24
Работа паука - это один из самых ресурсоемких в плане времени этапов
работы нашего поисковика. При этом он также является и очень ответственным
– ведь на основе собранной им информации будет работать вся остальная
система. Исходный код паука находится в приложении 1.
Пример работы паука (обходит страницы и сразу проходит индексация):
Рисунок 2 – пример работы паука
Индексатор(Indexer).
Индекс
представляет
собой
список
слов,
с
каждым
из
которых
ассоциировано множество документов, где это слово встречается, и место
вхождения слова в документ. Мы анализируем только текст на странице,
25
игнорируя все нетекстовые элементы. Кроме того, индексируются только сами
слова, а все знаки препинания удаляются.
Индексы на данный момент хранятся в базе данных SQLite. SQLite – это
встраиваемая СУБД, которую очень легко настроить, причем вся база данных
хранится в одном файле. Поскольку запросы формулируются на языке SQL,
будет нетрудно перенести код примеров на другую СУБД.
Схема нашего индекса состоит из пяти таблиц. Первая (urllist) – это список
проиндексированных URL. Вторая (wordlist) – список слов, а третья
(wordlocation) – список мест вхождения слов в документы. В оставшихся двух
таблицах хранятся ссылки между документами. В таблице link хранятся
идентификаторы двух URL, связанных ссылкой, а в таблице linkwords есть два
столбца – wordid и linkid– для хранения слов, составляющих ссылку. Вся схема
показана на рисунке 2:
Рисунок 3 – схема базы данных поисковой машины
В каждой таблице SQLite по умолчанию имеется поле rowid, поэтому можно
не задавать явно ключевые.
Таблица wordlocation обеспечивает простой способ связать слова с
документами, так что мы можем легко найти, какие страницы содержат данное
слово.
Одна из возможностей улучшения – удалять из слов суффиксы,
воспользовавшись алгоритмом выделения основы. Например, слово ranked при
этом превращается в rank, поэтому человек, который ищет слово rank, получит
также документы, содержащие слово ranked.
Таблица urllist после индексации (поле rowid скрыто):
26
Рисунок 4 – проиндексированные страницы
Ранжировщик(Ranker).
В нашем поисковой машине есть несколько способов вычисления ранга
страницы:
 Частота слов (функция frequencyscore()).
 Расположение в документе (функция locationscore()).
 Расстояние между словами (функция distancescore()).
 Алгоритм PageRank (функции calculatepagerank() и pagerankscore()).
 Простой подсчёт ссылок (функция inboundlinkscore()).
Все перечисленные способы ранжирования были описаны выше.
27
Пример работы поискового запроса с ранжированием по расстоянию между
словами:
Рисунок 5 – пример работы поискового запроса
28
ЗАКЛЮЧЕНИЕ
В курсовой работе были рассмотрены понятия информационно-поисковых
систем, ранжирования данных и моделей поиска. В процессе решения данной
задачи были достигнуты следующие результаты:
1.
Построена
поисковая
машина,
поддерживающая
пять
типов
ранжирования.
2.
Проведена частичная индексация сайта издательства Springer.
3.
Проверена точность результатов поиска.
Также были изучены структура поисковой системы, взаимодействие и
работа её компонентов. В качестве языка программирования был выбран язык
python.
29
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Россум, Г. Язык программирования Python / Г. Россум, Ф. Л. Дж. Дрейк,
Д. С. Откидач. – 2001. – 454 с.
2. Лутц, М. Изучаем Python, 3-е издание / М. Лутц. – Пер. с англ. – Спб.:
Символ-Плюс, 2009. – 848 с.
3. Маннинг, К. Д. Введение в информационный поиск / К. Д. Маннинг, П.
Рагхаван, Х. Шютце. – Пер. с англ. – М. : ООО “И.Д. Вильямс”, 2011. – 528 с.
4. Ранжирование в Яндексе: как поставить машинное обучение на поток
[Электронный
ресурс].
–
Режим
доступа:
http://habrahabr.ru/company/yandex/blog /174213/ - (Дата обращения: 01.05.2014).
5. Принципы работы современных веб-браузеров [Электронный ресурс]. –
Режим
доступа:
http://www.html5rocks.com/ru/tutorials/internals/howbrowsers-
work/ - (Дата обращения: 09.04.2014).
30
ПРИЛОЖЕНИЕ 1
Исходный код программы
# -*- coding: UTF-8 -*import urllib2
from BeautifulSoup import *
from urlparse import urljoin
from pysqlite2 import dbapi2 as sqlite
# Создать список игнорируемых слов
ignorewords = set(['the', 'of', 'to', 'and', 'a', 'in', 'is', 'it', 'on'])
class crawler:
# Инициализировать паука, передав ему имя базы данных
def __init__(self,dbname):
self.con = sqlite.connect(dbname)
def __del__(self):
self.con.close( )
def dbcommit(self):
self.con.commit( )
# Вспомогательная функция для получения идентификатора
# и добавления записи, если такой ещё нет
def getentryid(self, table, field, value, createnew=True):
cur = self.con.execute("select rowid from %s where %s='%s'" % (table,field,value))
res = cur.fetchone( )
if res == None:
cur = self.con.execute("insert into %s (%s) values ('%s')" % (table,field,value))
return cur.lastrowid
else:
return res[0]
# Индексирование одной страницы
def addtoindex(self, url, soup):
if self.isindexed(url): return
print u'Индексируется '+url
# Получить список слов
text = self.gettextonly(soup)
words = self.separatewords(text)
# Получить идентефикатор URL
urlid = self.getentryid('urllist','url',url)
# Связать каждое слово с этим URL
31
for i in range(len(words)):
word = words[i]
if word in ignorewords: continue
wordid = self.getentryid('wordlist','word',word)
self.con.execute("insert into wordlocation(urlid,wordid,location) values (%d,%d,%d)" %
(urlid,wordid,i))
# Извлечение текста из HTML-страницы (без тегов)
def gettextonly(self, soup):
v = soup.string
if v == None:
c = soup.contents
resulttext = ''
for t in c:
subtext = self.gettextonly(t)
resulttext += subtext+'\n'
return resulttext
else:
return v.strip( )
# Разбиение текста на слова
def separatewords(self, text):
splitter = re.compile('\\W*')
return [s.lower( ) for s in splitter.split(text) if s!='']
# Возвращает true, если данный URL уже проиндексирован
def isindexed(self, url):
u = self.con.execute("select rowid from urllist where url='%s'" % url).fetchone( )
if u!=None:
# Проверяем, что страница посещалась
v = self.con.execute('select * from wordlocation where urlid = %d' % u[0]).fetchone( )
if v != None: return True
return False
# Добавление ссылки с одной страницы на другую
def addlinkref(self, urlFrom, urlTo, linkText):
pass
# Начиная с заданного списка страниц, выполняет поиск в ширину
# до заданной глубины, индексируя все встречающиеся по пути
# страницы, которые возможно индексировать
def crawl(self, pages, depth=4):
for i in range(depth):
newpages=set( )
for page in pages:
try:
c = urllib2.urlopen(page)
except:
print u"Не могу открыть %s" % page
continue
soup = BeautifulSoup(c.read( ))
self.addtoindex(page, soup)
32
links = soup('a')
for link in links:
if ('href' in dict(link.attrs)):
url = urljoin(page, link['href'])
if url.find("'")!= -1: continue
url = url.split('#')[0] # удалить часть URL после знака
if url[0:4] == 'http' and not self.isindexed(url):
newpages.add(url)
linkText = self.gettextonly(link)
self.addlinkref(page, url, linkText)
self.dbcommit( )
pages = newpages
# Создание таблиц в базе данных
def createindextables(self):
self.con.execute('create table urllist(url)')
self.con.execute('create table wordlist(word)')
self.con.execute('create table wordlocation(urlid,wordid,location)')
self.con.execute('create table link(fromid integer, toid, integer)')
self.con.execute('create table linkwords(wordid, linkid)')
self.con.execute('create index wordidx on wordlist(word)')
self.con.execute('create index urlidx on urllist(url)')
self.con.execute('create index wordurlidx on wordlocation(wordid)')
self.con.execute('create index urltoidx on link(toid)')
self.con.execute('create index urlfromidx on link(fromid)')
self.dbcommit( )
def calculatepagerank(self,iterations=20):
# стираем текущее содержимое таблицы PageRank
self.con.execute('drop table if exists pagerank')
self.con.execute('create table pagerank(urlid primary key,score)')
# в начальный момент ранг для каждого URL равен 1
self.con.execute('insert into pagerank select rowid, 1.0 from urllist')
self.dbcommit( )
for i in range(iterations):
print u"Итерация %d" % (i)
for(urlid,) in self.con.execute('select rowid from urllist'):
pr=0.15
# В цикле обходим все страницы, ссылающиеся на данную
for (linker,) in self.con.execute(
'select distinct fromid from link where toid=%d' % urlid):
# находим ранг ссылающейся страницы
linkingpr = self.con.execute('select score from pagerank where urlid=%d' %
linker).fetchone( )[0]
# находим общее число ссылок на ссылающейся странице
33
linkingcount = self.con.execute('select count(*) from link where fromid=%d' %
linker).fetchone( )[0]
pr+=0.85*(linkingpr/linkingcount)
self.con.execute('update pagerank set score=%f where urlid=%d' % (pr,urlid))
self.dbcommit( )
class searcher:
def __init__(self,dbname):
self.con = sqlite.connect(dbname)
def __del__(self):
self.con.close( )
def getmatchrows(self,q):
# Строки для построения запроса
fieldlist = 'w0.urlid'
tablelist = ''
clauselist = ''
wordids = []
# Разбить поисковый запрос на слова по пробелам
words = q.split(' ')
tablenumber = 0
print words
for word in words:
# Получить идентификатор слова
wordrow = self.con.execute("select rowid from wordlist where word='%s'" %
word).fetchone( )
# print wordrow
if wordrow != None:
wordid = wordrow[0]
wordids.append(wordid)
if tablenumber > 0:
tablelist += ','
clauselist += ' and '
clauselist += 'w%d.urlid=w%d.urlid and ' % (tablenumber-1,tablenumber)
fieldlist += ',w%d.location' % tablenumber
tablelist += 'wordlocation w%d' % tablenumber
clauselist += 'w%d.wordid=%d' % (tablenumber,wordid)
tablenumber += 1
# Создание запроса из отдельных частей
fullquery = 'select %s from %s where %s' % (fieldlist,tablelist,clauselist)
# print fullquery
cur = self.con.execute(fullquery)
rows = [row for row in cur]
return rows,wordids
def getscoredlist(self,rows,wordids):
34
totalscores = dict([(row[0],0) for row in rows])
# weights
# weights = [(1.0,self.frequencyscore(rows))]
# weights = [(1.0,self.frequencyscore(rows)), (1.5,self.locationscore(rows)), (1.0,
distancescore(rows))]
# weigths = [(1.0,self.locationscore(rows)),
(1.0,self.frequencyscore(rows)),(1.0,self.pagerankscore(rows))]
weights = [(1.0,self.locationscore(rows))]
for (weight,scores) in weights:
for url in totalscores:
totalscores[url] += weight*scores[url]
return totalscores
def geturlname(self,id):
return self.con.execute("select url from urllist where rowid = %d" % id).fetchone( )[0]
def query(self,q):
rows,wordids = self.getmatchrows(q)
scores = self.getscoredlist(rows,wordids)
rankedscores = sorted([(score,url) for (url,score) in scores.items()],reverse=1)
for (score,urlid) in rankedscores[0:10]:
print '%f\t%s' % (score,self.geturlname(urlid))
def normalizescores(self,scores,smallIsBetter=0):
vsmall = 0.00001 # Предотвратить деление на ноль
if smallIsBetter:
minscore=min(scores.values())
return dict([(u,float(minscore)/max(vsmall,l)) for (u,l) in scores.items()])
else:
maxscore = max(scores,values())
if maxscore==0: maxscore = vsmall
return dict([(u,float(c)/maxscore) for (u,c) in scores.items()])
def frequencyscore(self,rows):
counts = dict([(row[0],0) for row in rows])
for row in rows: counts[row[0]] += 1
return self.normalizescores(counts)
def locationscore(self,rows):
locations = dict([(row[0],1000000) for row in rows])
for row in rows:
loc = sum(row[1:])
if loc < locations[row[0]]: locations[row[0]] = loc
return self.normalizescores(locations,smallIsBetter=1)
def distancescore(self,rows):
# Если есть только одно слово, то любой документ выигрывает!
if len(rows[0])<=2: return dict([(row[0],1.0) for row in rows])
# Инициализировать словарь большими значениями
35
mindistance = dict([(row[0], 1000000) for row in rows])
for row in rows:
dist = sum([abs(row[i] - row[i-1]) for i in range(2,len(row))])
if dist < mindistance[row[0]]: mindistance[row[0]] = dist
return self.normalizescores(mindistance,smallIsBetter=1)
def inboundlinkscore(self,rows):
uniqueurls = set([row[0] for row in rows])
inboundcount = dict([(u,self.con.execute(
'select count(*) from link where toid = %d' % u).fetchone( )[0]) for u in uniqueurls])
return self.normalizescores(inboundcount)
def pagerankscore(self,rows):
pageranks = dict([(row[0],self.con.execute('select score from pagerank where urlid=%d' %
row[0]).fetchone( )[0]) for row in rows])
maxrank = max(pageranks.values( ))
normalizedscores = dict([(u.float(l)/maxrank) for (u,l) in pageranks.items( )])
return normalizedscores
36
Download