Информационный поиск

advertisement
Информационный поиск
Информационный поиск (IR) — это процесс поиска в большой коллекции (хранящейся, как
правило, в памяти компьютеров) некоего неструктурированного материала (обычно —
документа), удовлетворяющего информационные потребности.
К информационному поиску можно также отнести некоторые задачи, не подпадающие
под базовое определение. Когда говорят «неструктурированные данные»,
подразумевают данные, которые не имеют ясной, семантически очевидной и легко
реализуемой на компьютере структуры. Они представляют собой противоположность
структурированным данным, каноническим примером которых являются реляционные
базы данных наподобие тех, которые обычно используются предприятиями для хранения
реестров продукции, персональных данных сотрудников и пр. В реальности же совершенно «неструктурированных данных» практически не существует. Например, обычные текстовые данные имеют скрытую структуру, характерную для естественных языков.
Однако даже если требовать явного наличия структуры, то большинство текстов таковую
очевидно имеют, поскольку в них есть заголовки, абзацы и сноски, которые обычно
представлены в тексте в виде явной разметки (например, в коде веб-страниц). Поэтому
методы информационного поиска используются также для «полуструктурированного»
поиска, например для нахождения документа, в заголовке которого содержится слово
Java, а в теле — слово threading.
К информационному поиску относятся и такие задачи, как навигация пользователей но
коллекции документов и фильтрация документов, а также дальнейшая обработка
найденных документов. Если имеется набор документов, то возникает задача
кластеризации, которая заключается в определении наилучшей группировки документов
по их содержанию. Это напоминает расстановку книг на полке по темам. Если задан
набор тем, постоянные информационные потребности и другие категории (например,
пригодность текстов для различных возрастных групп), то возникает задача
классификации — определить к какому классу относится (и относится ли вообще) каждая
группа документов. Для её решения часто сначала вручную классифицируют какое-то
количество документов, надеясь классифицировать новые документы автоматически.
Системы информационного поиска можно классифицировать по масштабу их действия.
Для этого полезно выделять три уровня. В процессе веб-поиска система должна
выполнить поиск среди миллиардов документов, размещённых на миллионах
компьютеров. Отличительными особенностями веб-поиска является необходимость
сбора документов для индексации, способность создавать системы, эффективно
работающие с огромными массивами информации, а также учет определенных аспектов
веба, таких использование гипертекста и противодействие попыткам веб-мастеров
искусственно повысить позиции своих сайтов, манипулируя содержимым веб-страниц. На
другом полюсе находится персональный информационный поиск. В последние годы
многие операционные системы имеют встроенные возможности поиска (например.
Mac OS X компании Apple, реализующая технологию Spotlight, и операционная система
Windows Vista, предоставляющая функцию Instant Search). Кроме того, программы
электронной почты обычно предоставляют не только функции поиска, но и средства
классификации текстов, по крайней мере они должны иметь фильтры от спама, а также
средства ручной или автоматической сортировки писем по папкам. Для этих систем
критично обрабатывать многообразие форматов документов на обычном персональном
компьютере. Важны простое сопровождение и инсталляция, а также небольшой объем
занимаемой памяти, позволяющий выполнять работу, не раздражая пользователя.
Промежуточное положение между упомянутыми двумя классами занимают системы
корпоративного (enterprise), ведомственного (institutional) и ориентированного на
предметную область (domain-specific) поиска, которые работают, например, с
коллекциями внутренних документов корпораций, базами патентов или научными
статьями по различным областям науки. В этих случаях документы, как правило, хранятся
в централизованных файловых системах, и одна или несколько специализированных
машин осуществляют поиск по коллекции.
Пример информационного поиска
В библиотеках многих людей есть толстый том собрания произведение Вильяма нашего
Шекспира. Допустим, вы хотите определить, в какой пьесе используются слова Brutus AND
Caesar AND NOT Calpurnia. Для этого можно, например, прочитать текст от начала до
конца, отмечая пьесы, содержащие слова Brutus и Caesar, и исключая из рассмотрения
пьесы, в которых встречается слово Calpurnia. Простейший компьютерный метод решения
этой задачи сводится к последовательному просмотру (linear scanning) всех документов.
Этот процесс часто называют прямым поиском или, на английском, grepping (от названия
команды grep, которая в операционной системе Unix выполняет этот процесс). Прямой
поиск по тексту может быть очень эффективным, особенно на современных компьютерах.
Довольно часто такая обработка допускает поиск по шаблону с джокерами (wildcard pattern matching). На современных компьютерах выполнения простых запросов на коллекциях данных среднего размера (общий объем тома собрания избранных произведений
Шекспира составляет чуть меньше одного миллиона слов) вполне достаточно для
рядового пользователя.
Тем не менее во многих случаях необходимо нечто большее.
1. Иногда нужно быстро обработать большую коллекцию документов. Объем данных,
доступных онлайн, растет по меньшей мере с той же скоростью, с которой
увеличивается скорость работы компьютеров. Возникает потребность выполнять
поиск информации в массивах данных, содержащих миллиарды и триллионы слов.
2. Иногда требуется большая гибкость при выполнении операции сравнения.
Например, было бы непрактично выполнять запрос Romans NEAR countrymen с
помощью команды greр, где слово NEAR может означать «не далее 5 слов» или «в
пределах одного предложения».
3. Иногда необходимо выполнить ранжированный поиск. Во многих ситуациях нужен
не просто ответ, а наилучший ответ на запрос относительно документов,
содержащих определенное слово.
Для того чтобы избежать последовательного просмотра текстов при выполнении каждого
запроса, заранее составляется индекс документов. Вернемся к тому Шекспира и опишем
на его примере основы модели булева поиска. Допустим, что для каждого документа (в
данном примере — для каждой пьесы Шекспира) создана запись, в которой указано,
содержит ли он конкретное слово из лексикона Шекспира (состоящего из 32 тысяч слов). В
результате возникнет бинарная матрица инцидентности «термин—документ» (term—
document incidence matrix), представленная ниже таблицей 1. Термины (terms) — это
единицы индексирования. Как правило, это обычные слова, но в литературе по
информационному поиску употребляется название термин, поскольку некоторые
выражения могут быть похожи на «обычные слова», например, New York. Теперь в
зависимости от порядка просмотра матрицы (по строка или по столбцам) можно получить
либо вектор термина, в котором указано в каких документах термин встречается, либо
вектор документа, в котором указано, какие термины в нём употребляются.
Antony
Brutus
Caesar
Calpurnia
Cleopatra
mercy
worser
…
Antony and
Сleopatra
1
1
1
0
1
1
1
Julius
Caesar
1
1
1
1
0
0
0
The
Tempest
0
0
0
0
0
1
1
Hamlet Othello Macbet …
h
0
0
1
1
0
0
1
1
1
0
0
0
0
0
0
1
1
1
1
1
0
Таблица 1. Матрица инфидентности "термин-документ". Элемент матрицы [t,d] равен 1, если пьеса d содержит слово
t, и 0, если не содержит
Для обработки зaпроса Brutus AND Caesar AND NOT Calpurnia возьмем вектора для терминов
Brutus, Caesar и Calpurnia, вычислим двоичное дополнение к последнему вектору и
выполним поразрядную операцию AND.
110100 AND 110111 AND 101111 = 100100
Ответ на запрос выглядит типа: Antony and Cleopatra, Hamlet.
Модель булева поиска — это модель информационного поиска, в ходе которого можно
обрабатывать любой запрос, имеющий вид булева выражения, т.е. выражения, в котором
термины используются в сочетании с операциями AND, OR и NOT. В рамках этой модели
документ рассматривается просто как множество слов.
Рассмотрим теперь более реалистичный сценарий, на примере которого удобно ввести
несколько понятий и обозначений. Допустим, что в нашем распоряжении есть N=106
документов. Под документами подразумеваются любые объекты, на основе которых
решено строить систему информационного поиска. Документами могут быть личные
заметки, или главы книги. Группу документов, по которой осуществляется поиск, будем
называть коллекцией (collection). Её также иногда называют корпусом (corpus) или
массивом текстов (body of texts). Допустим, что каждый документ состоит примерно из
103 слов(2-3 книжные страницы). Если предположить, что в среднем на хранение слова с
учетом пробелов и знаков препинания отводится 6 байтов, то такая коллекция
документов займет около 6 Гбайт. Как правило, в подобных документах может оказаться
около M=5*105 разных терминов. В выбранных числах нет ничего особенного, и они могут
варьироваться в ту или другую сторону, но они всё же дают представление о размерности
рассматриваемых задач.
Можно сформулировать цель — разработать систему, выполняющую поиск по
произвольному запросу. Это самая распространенная задача информационного поиска.
Цель системы — найти в коллекции документы, которые являются наиболее
релевантными по отношению к произвольным информационным потребностям,
сообщаемым системе при помощи однократных, инициированных пользователем
запросов. Информационная потребность — это тема, о которой пользователь хочет знать
больше. Её следует отличать от запроса, т.е. от того, что пользователь вводит в
компьютер, пытаясь выразить свою информационную потребность. Приведённый пример
поиска является довольно искусственным, поскольку обычно пользователи интересуются
более неопределёнными темами. К примеру, пользователь, получающий документы по
запросу «маханико-математический» желает получить документы в которых встречается
«мех-мат».
Интуитивно созданная в примере матрица размером 5*105 x 106 содержит полтриллиона
нулей и единиц — это слишком много, чтобы поместиться в оперативной памяти
среднестатистического компьютера. Тем не менее следует подчеркнуть что эта матрица
является чрезвычайно разреженной, т.е. содержит лишь небольшое количество
ненулевых элементов. Поскольку каждый документ состоит из примерно 103 слов,
матрица будет содержать не более одного миллиарда единиц. Поэтому как минимум
99,8% ячеек будут содержать нули. Намного целесообразнее хранить в памяти только
единицы.
Эта идея является основной по отношению к первой важной концепции
информационного поиска — инвертированному индексу. Это название на самом деле
является избыточным: индекс всегда ставит в соответствие терминам те части документа,
в которых они встречаются. Тем не менее выражения инвертированный индекс, и иногда
— инвертированный файл — стали стандартными в области информационного поиска.
Основная идея инвертированного индекса проиллюстрирована на таблице 2.
Brutus
→
1
2
4
11
31
45
Caesar
→
1
2
4
5
6
16
Calpurnia
→
2
31
54
101
Таблица 2. Инвертированный индекс. Левый столбец - словарь, правая часть - списки словопозиций
Сначала записывается в память словарь терминов. Затем для каждого термина создается
список, в котором указаны документы, содержащие данный термин. Каждый элемент
списка, содержащий информацию о том, что термин находится в документе, а также о
координате термина в этом документе, называется словопозицией (posting).
Соответствующий список называется списком словопозиций или инвертированным
списком.
Обработка булевых запросов
Для понимания процесса обработки запросов с помощью инвертированного индекса и
базовой модели булева поиска рассмотрим обработку простого конъюнктивного запроса
«Brutus and Calpurnia» по инвертированном индексу. Эта обработка сводится к
следующему.
1.
2.
3.
4.
5.
Обнаружение термина Brutus в словаре.
Нахождение списка его словопозиций.
Обнаружение термина Calpurnia в словаре.
Нахождение списка его словопозиций.
Нахождение пересечения этих двух списков.
Операция пересечения является чрезвычайно важной для того чтобы быстро найти
документы, содержащие оба термина, необходимо обеспечить эффективное пересечение
этих списков. Эту операцию иногда называют слиянием (merging) списков словопозиций,
хотя такое называние немного противоречит интуитивному пониманию. Термин
«слияние» возникает потому что использованием алгоритмов слияния (merge algorithms)
— это семейство алгоритмов, которые объединяют несколько упорядоченных списков с
помощью чередования указателей, которые движутся по каждому из списков.
Существует простой и эффективный метод пересечения списков словозиций с помощью
алгоритма слияния.
def INTERSECT(p1, p2):
1 answer = []
2 while p1≠NIL && p2 ≠ NIL:
3
if p1[‘docID’] = p2[‘docID’]:
4
answer.append(p1[‘docID’])
5
p1=p1.next()
6
p2=p2.next()
7
elif p1[‘docID’]<p2[‘docID’]:
8
p1=p1.next()
9
else:
10
p2=p2.next()
11 return answer
Берутся указатели на два списка и совершается обход по этим спискам за время, линейно
зависящее от количества словопозиций в списках. На каждом этапе сохраняются
идентификаторы документов, на которые ссылаются оба указателя. Если они совпадают,
то идентификатор документа помещается в список результатов, затем продвигаем оба
указателя вперед. В противном случае, продвигаем вперед только указатель,
соответствующий списку с меньшим текущим идентификатором документа. Если длины
списков словопозиций равны x и y, то пересечение осуществляется за O(x+y) операций. С
формальной точки зрения сложность обработки запроса равна Θ(N), где N — количество
документов в коллекции. Сложность такого метода индексирования отличается от
последовательного просмотра лишь константой, но на практике эта константа часто
оказывается огромной. Для использования данного алгоритма важно, чтобы
словопозиции были упорядочены в соответствии с единым глобальным критерием
сортировки. Для этого можно, например, использовать сортировку числовых
идентификаторов документов docID.
Этот алгоритм можно обобщить для обработки более сложных запросов, таких как
«(Brutus or Caesar) AND NOT Calpurnia».
Оптимизация запроса — это выбор такого способа организации обработки запроса, чтобы
можно было минимизировать общий объем работы, которую должна выполнить система.
Основным фактором, влияющим на эффективность обработки булевых запросов, является
порядок, в котором осуществляется доступ к спискам словопозиций. Рассмотрим запрос,
состоящий t терминов, объединенных операцией AND. Например, «Brutus AND Caesar
AND Calpurnia».
Для каждого из t терминов необходимо сначала найти списки словопозиций, а затем
применить к ним операцию AND. На практике используется стандартный эвристический
приём, который заключается в том, что термины обрабатываются в порядке возрастания
частоты документов. Если начать с пересечения двух наименьших списков словопозиций,
то все промежуточные результаты не должны превышать наименьшего списка
словопозиций, а значит, выполенится наименьший объём работы.
Это первый аргумент в пользу того, чтобы подсчитывать частоту терминов в словаре; это
позволяет принять решение об упорядочении на основе данных, хранящихся в памяти
компьютера не требуя доступа к спискам словопозиций.
Рассмотрим теперь оптимизацию запросов более общего вида: «(madding AND crowd) AND
(ignoble OR strife) AND (killed OR slain)». Как и раньше, определим частоту каждого термина, а
затем получим оценки сверху размера для каждого оператора OR, суммируя частоты его
операндов. После этого запрос можно обрабатывать в порядке возрастания размера
списка каждого дизъюнктного термина.
Для произвольных булевых запросов нужно найти и временно сохранить ответы для
промежуточных выражений, входящих в более сложные выражения. Однако во многих
ситуациях запросы являются исключительно конъюнкцией терминов. Это объясняется
либо природой языка запросов, либо широкой популярностью такой формы запросов
среди пользователей.
В этом случае вместо просмотра объединенных списков
словопозиций с помощью функции, имеющей два входных аргумента и отдельное
возвращаемое значение, эффективнее пересечь все результирующие списки
словопозиций с текущим промежуточным результатом в памяти. При этом
промежуточный результат инициализируется путем загрузки списка словопозиций самого
редко встречающегося термина.
Download