Поиск словосочетаний

lagif
На сайте с 15.12.2004
Offline
30
2545

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

Чем длинее запрос пользователя, тем дольше информация ищется в индексе. Есть ли какие-нибудь продвинутые алгоритмы (описания) поиска словосочетаний по индексу (я понимаю, что все тонкости зависят и от структуры индекса, от этого абстрагироваться не_льзя)? Собственно, весь сабж. Все мои идеи уже исчерпались, решила поспрошать у умного народа.

Это тоже пройдет...
MG
На сайте с 18.10.2002
Offline
27
#1

Весь вопрос в том, что такое "словосочетание". Если имеется в виду слова стоящие рядом, то инвертированный файл при правильной организации дает время поиска не хуже (а реально лучше) O(n), где n - число слов запроса. Что, в принципе, не плохо :).

Для того, чтобы получить лучшее время нужно использовать структуры типа NextWord, см. например http://citeseer.ist.psu.edu/bahle02efficient.html ну или скромную мою работу http://rcdl2002.jinr.ru/Reports/Vol_2/vol2_26-37.pdf

E
На сайте с 12.01.2004
Offline
17
#2
Чем длинее запрос пользователя, тем дольше информация ищется в индексе

Иногда может быть и наоборот - чем больше слов в запросе, тем короче список результатов поиска, а значит и меньше времени потребуется на ранжирование. При большом количестве слов в запросе производительность, как мне кажется, будет больше "упираться" на объединение списков документов соответствующих каждому слову запроса. Подробне про объединение упорядоченных последовательностях можно посмотреть: Интерполяционный поиск, Hwang-Lin merging, binary merging algorithm

lagif
На сайте с 15.12.2004
Offline
30
#3

А как насчет неравномерного индекса, основанного на частоте запросов к тем или иным словам или частоте в языке тех или иных слов?

E
На сайте с 12.01.2004
Offline
17
#4

Основной недостаток этих методов (глобальный инвертированный индекс) - стоимость перестройки индекса. При изменении одного документа прийдется перестраивать все индексные файлы в которых содержаться слова из этого документа.

lagif
На сайте с 15.12.2004
Offline
30
#5

eshum,

Есть еще один выход хранить где-то прямой индекс. При разумной структуре обратного слишком много изменений производить не придется.

MG
На сайте с 18.10.2002
Offline
27
#6
Как писал eshum
Основной недостаток этих методов (глобальный инвертированный индекс) - стоимость перестройки индекса. При изменении одного документа прийдется перестраивать все индексные файлы в которых содержаться слова из этого документа.

При "правильной" организации инвертированного файла, конечно нет. Все зависит от приоритетов при разработке поисковой структуры - скорость поиска или обновления, насколько критична компактность и т.д.

Если данные часто меняются и требуется большая скорость обновления, то пост-листы бьются на отдельно обновляемые кусочки (что, кстати может улучшать производительность MPMGJN и, соответственно, поиска фраз), позиции в документах делаются устойчивыми к изменению документа и еще десяток известных решений. Тем самым достигается уменьшение на порядки объема изменений по сравнению с обновление "в лоб".

E
На сайте с 12.01.2004
Offline
17
#7
Как писал MaxGubin

Если данные часто меняются и требуется большая скорость обновления, то пост-листы бьются на отдельно обновляемые кусочки (что, кстати может улучшать производительность MPMGJN и, соответственно, поиска фраз), позиции в документах делаются устойчивыми к изменению документа и еще десяток известных решений. Тем самым достигается уменьшение на порядки объема изменений по сравнению с обновление "в лоб".

Согласен, если требуется бысто обновить произвольный документ, лучше хранить постлист кусочками. Правда есть спорные моменты: что делать если после обновления блок становится больше по размеру, переносить данные в новый? Или как быть с фрагментацией таких блоков которая возникнет после некоторого количества обновлений? Если таких блоков будет много в постлисте и они не будут располагаться подряд, упадет производительность поиска т.к. подвод головки винчестера к началу блока (diskseek) не самая быстрая опрерация.

Что касается глобального инвертированного индекса (когда инфомация о документе находится в разных индексных файлах), обновления еще более затруднительны если эти файлы находятся на разных машинах.

MG
На сайте с 18.10.2002
Offline
27
#8
Как писал eshum

что делать если после обновления блок становится больше по размеру, переносить данные в новый?

Такая проблема есть в любой динамической индексной структуре. Простое и, обычно, хорошее решение предложил в 60-х г-н Bayer для листов Б-дерева.


Что касается глобального инвертированного индекса (когда инфомация о документе находится в разных индексных файлах), обновления еще более затруднительны если эти файлы находятся на разных машинах.

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

E
На сайте с 12.01.2004
Offline
17
#9
Как писал MaxGubin

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

Судя по всему так работал Рамблер предыдущей версии и .Turtle

MG
На сайте с 18.10.2002
Offline
27
#10

Да, я это читал, когда-то давным-давно, но забыл. Им, конечно, виднее :). С точки зрения частичной пересмотройки, поиска фраз (о чем мы говорили), масштабируемости и устойчивости к потерям узлов кластера это решение не очень.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий