Kryukov

Рейтинг
12
Регистрация
11.11.2005
tano:
а на шаблонах типа "*ll*wo*" для поиска "helloworld" какой тормоз будет ? :)
реально через suffix array решается, может что-то более эффективное есть, я не знаю.

Ну хорошо :) ну а на шаблоне типа "*" для поиска "бабушка" наверное будет еще хуже :) . Вы же всетаки что-то знаете о том, что ищите. Если плохо знаете - то уж

grep -i [regexp] везде

работать будет долго, но надежно. Окружающий мир все равно является поиском компромисов - хотим того или нет. Обычно можно (в 90%)сформулировать некоторые допустимые ограничения на синтаксис, дабы не терять производительность - например, построить 2 индекса, перевернув во втором слова. Полного решения не даст (и думаю в общем случае задача плохо выполнима)

Кстати, можно представить сколько мусора Вы соберете на многомиллионной базе слов по Вашей маске - разгребать дольше будете

Короче, я же написал - смотря что надо :) Кстати, 100 млн массив слов по 128 символов - это 1GB (в современных условиях в мозги влезет вместе с доп. информацией)

Keva:
Это правильно!
Для начала определись с тем, что ты будешь ставить в соответствие поисковому ключу.
Потом реши, как будешь организовывать хранилище ключей.
Возможно, в узлах должны храниться какие-то характеристики, общие для вложенных узлов (в случае хранения как дерево).

Ой-й-й-й, тут кажись граничные условия не ставили, а вдруг челу был нужен полноценный regexp - тады только перебор :). Если же просто найти все с произвольным окончанием - то задача для студента 2 курса. Главное городить самому особо ничего не надо, берем BerkeleyDB v.1.85 (она не коммерческая), строим BTREE. Для поиска используем установку курсора на первое соответствующее, далее перебором со сравнением на превышение. Таким образом еще в 1982 году работал SMTP агент, под названием IDA Sendmail (почти обычный сендмаил, но с использованием шаблонов для подмены адресов и прочими "дырявыми" бантиками) Легкий тормоз будет обнаружен на шаблонах типа "a*", в остальном - свистит как пулемет. :)

Если это то, что нада - готов получить свои $500 с фрагментом реализации из рамблера образца 1996г.

lagif:
В качестве рассуждения о нейросети: ее, мне кажется, легче обучить ранжированию, чем скормить необъятный индекс (вот что имелось в виду под ресурсами). Впрочем, мы уже кажется, единодушны во мнении, что нейросеть - тупиковая ветвь развития ИИ :)

Я бы не "стал быть" ( :) ) столь категоричным - различные тиы моделей нейронных сетей _УЖЕ_ работают в жизни (например в экспериментальных РЛС для распознавания боевой самолет или гражданский, иль вообще НЛО :) ) Я сам кодировал году в 1994 фрагмент одной модели. Смысла не помню, но помню, упрощенно что "поджигали" край сети и смотрели в графике на реакцию - занимательные, надо сказать, картинки получались. Но... это просто модель 🚬

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

Андрюха, тема действительно уехала в ОФФ. А если вернуться к изначальному посту: может автор и вправду хочет создать _ВСЕ_ условия для разработки :) , а может не представляет, что это за условия, а может провокация на флейм.

Пойдем разрабатывать, а?

Прошу прощения за полуОФФ

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

Что существует понять несложно: объем базы - миллиарды документов с преспективой роста, время сложного поиска - в районе секунды, не больше, дополнительные бантики - у каждого свои, но есть и общие.

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

Eugen:
Цель - исключительно образовательная. Ничего коммерческого. Поиск подразумевается делать по неструктурировнным документам. Насчет супер-пуппер - не знаю, это уже как оплучится ;).

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

Eugen:
Да но как тогда быть с шумовыми стоп-словами? Ведь они в индексе отсутствуют и соответсвенно запрос "Петя и Вася" не может быть выполнен в силу отсутствия "и" в индексе. Выход - индексировать все слова, включая стоп-слова?.

Именно так :) Однако если запрос без "кавычек" или еще какой-то другой - просто проигнорировать. Я вам больше скажу - запрос: user@domain должен восприниматься как одно слово, зачем мне документы, в которых есть user и domain, но в разных местах?

Eugen:
Я задумывался над этим и вряд ли возможным будет хранение всего разнообразия лексем в ОЗУ, т.к. тут будут и числа и разнообразные сокращения, аббревиатуры и проч, как вы правильно написали..

Кто сказал, что они войдут в память. Даже если допустить, что все документы состоят из "словарных" слов (пардон за каламбур), то как быть с другими языками (китайский, например 🚬 ), а с их морфологией? Просто присвоение уникальных ID для слов или их основ может сократить расход пространства хранилища (диска, например) для общего индекса. Предположим, что средняя длина слова 8 символов, предположим, что всего слов вместе с иероглифами будет не более 2 млрд. Тогда каждое слово можно представить 32 разрядами (4 символа). Подход упрощенный, но мысль, думаю, понятна.

Eugen:
Полное перестроение - это совсем "больно", т.к. лучше уже пользоваться прямым индексом. Т.е хранить оба: прямой и обратный. Прямой позволит определить термины, по которым надо произвести зачистку пост-листа, чтобы удалить документ подлежащий переиндексации.
Но вряд ли это самый лучший способ. Возможно вы сможете посоветовать, где прочитать о лучших? Информационный поиск имеет долгую истории развития и прежде всего развития в плане научных изысканий, а посему существует много публикаций на тему. Я ведь спрашиваю о достаточно базовых вещях, которые вряд ли уж настолько ноу-хау ;).

Ну краулеры могут помечать, что был отсканирован документ с ID таким-то. На этапе слияния индекса с новой порцией в каждой итерации следует вычищать поднятые данные на предмет ID и сопутствующей ему информации. Это тоже упрощенно, не гарантирует, что вычистите все

Желаю удачи

Eugen:
Посмотрел литературу, многое почерпнул ;)
Но все же остались и белые пятна.
Во-первых все тот же поиск подстроки в кавычках. Его можно делать конечно и по индексу, отфильтровуя и оставляя в пост-листе (объединенном по "И" для всех поисковых терминов) только те документы, в которых слова расположены рядом. Это единственный способ? Не будет ли он слишком медленным - просматривать все документы на предмет нахождения слов рядом.
Далее, интересно как же все-таки лучше организовать инвертированный индекс. Можно сделать Б+-деревом, а ведь можно и полностью лексикон (словарь) сохранить в памяти со ссылками на пост-листы для каждого слова лексикона. Что является правильным для поисковика?
Ну и наконец как правильно индексировать изменяющиеся документы. Ведь перед переиндексацией следует удалить все предыдущие ссылки на документ в пост-листах, но т.к. инвертированный индекс предназначен только для поиска по вхождениям терминов - сделать это будет проблематично. Как вариант - держать 2 представления для индексатора и поисковика (прямой и обратный индекс соответственно), но преобразование всего индекса из прямой формы в обратную очень трудоемо и вряд ли подойдет для реальной поисковой системы. Подскажите, как быть?

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

2. По сути вопросов:

(a) обязательно читать Дональда Кнута (Вам будет интересен 3 том, но без остальных - никуда :)

(б) По поводу "кавычек" (почему именно кавычек? синтаксис запроса может быть любым... но однозначным) в индексе неструктурированных документов хранится и координатная информация, отнесенная к каждому термину. В процессе выполнения логических операций в этом же месте производится сравнение ближайшего расстояния. Для кавычек оно должно быть 1. Координатка может быть устроена совсем просто (типа номер вхождения), а может и сложно (типа номер абзаца-номер предложения-номер во фразе-позиция во фразе 🚬 )

(с) инверсный индекс организовать можно и так и так - все зависит от разработчика и задач. Надо помнить, что существует масса "несловарных" терминов типа КТ315, ММВБ, 666 (шайтан :) , многие авторы специально каверкают слова) и пр.

вы будете обязаны их по образу и подобию занести в свои листы знаний.

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

(е) подумайте - а оно Вам надо. Подход типа: расскажите мне, как сделать, а я уж напрограммирую - неприемлим т.к. рассказ - это 90% успеха (ничего личного)

lagif:
Zute,
Но ранжирование - это всего лишь часть поиска. И, на мой взгляд, не самая сложная. И мне кажется, поиск по индексам нейросети осилить куда сложней, чем результаты ранжировать.

Оставляя в покое "поиск по индексам нейросети" (я это не очень понимаю), позволю себе не согласиться с утверждением о простоте ранжирования. Взять к примеру преславутый гуглевский PageRank. Вы можете прикинуть затраты на его вычисления в классическом понимании. Имеем граф на N млрд. узлов и, кто его знает, сколько ребер. При этом он обязан быть связаным, чего в жизни нет. Стало быть, надо хотябы выделить сильно связанные компоненты, определить их соотношения. А далее (ой мама, не горюй) глубокая рекурсия по матрице NxN. Это не единственная компонента ранжирования и кто знает, какие еще методы предложит пытливый ум

Что касается нейронных сетей, то мой отец очень долго и серьезно этим занимался в академгородке Пущино, по его мнению (при встрече уточню), на практике их преспективно применять в распознавании образов (в нашем случае, по-моему, это авто-классификация). Кстати, проработав 20 лет над моделированием мозга, отец "плюнул" и ушел в монахи. Возможно это не имеет отношения к работе, однако - факт 🚬

Zute:
В терминах Кнута, соортировка не меняющая порядка элементов с одинаковыми ключами называется устойчивой. Метод быстрой сортировки (qsort) по жизни не является устойчивым.

🙄

Я скажу больше, в GNU реализации qsort и в реализации от BSD существуют существенные отличия в скорости в пользу Беркли - проверено электроникой :)

eshum:
Ну, можно здорово ограничить количество подаваемых слов при обучении сети. Для этого нужно подавать на вход сети не все слова документа, а только "значимые". Значимость определять из частоты встречаемости слова (TF) во всей коллекции документов, т.е. грубо говоря отбрасывать слишком распространенные слова.

Все равно, мне кажется, что слишком многомерный вектор получится, и не понятно, как с координатами, как ориентировать и пр. Для этого, похоже, нужны мощности сильно превосходящие существующие. Хотя исключать этого нельзя. Простой пример из жизни: у меня сейчас в кармане лежит КПК, который превосходит по всем параметрам на порядок тот компьютер, на котором в 1996 году я сделал Rambler 🚬

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

Всего: 59