Xpoint
   [напомнить пароль]

Организация поиска

Метки: [без меток]
2005-06-09 18:59:49 [обр] Эмиль Бекиров aka superbizon(0/19)[досье]

Здравствуйте

Есть кусок текста, по нему производиться поиск. Поисковые слова записываются в массив.
Нужно найти в тексте эти слова и текст определенной длины между этими словами.

Например

$text=<<"EOF";
Существует разница между двумя типами пространства.
Пространство оседлых народов расчерчено стенами, границами и дорогами.
Кочевники населяют гладкое пространство, метки которого сдвигаются вместе с трассой.
хотя маршрут кочевника может проходить по обычным дорогам, это не та дорога,
 которую знают оседлые народы. Та дорога делит замкнутое пространство,
предоставляя каждому определенную часть этого пространства и обеспечивая связь частей.
Маршрут кочевника - полная противоположность дороги:
он делит людей (или животных) в открытом пространстве - неочерченном и несвязном.
Кочевник не то же самое, что мигрант:
Мигрант - это беглец, покидающий местность, когда она исчерпала свои ресурсы.
Кочевник никуда не бежит, не хочет бежать: он срастается с этим гладким пространством.
Так с неописуемым звуком сдвигаются в пустыне песчаные плиты.
EOF
$keywords="замкнутое неописуемым"; #Поисковый запрос
@query=$keywords=~/\S+/g;

Результат:
...которую знают оседлые народы. Та дорога делит <b>замкнутое</b> пространство,
предоставляя каждому определенную часть...
...срастается с этим гладким пространством. Так с <b>неописуемым</b> звуком сдвигаются
 в пустыне песчаные плиты...

спустя 55 минут [обр] DJ G.E.D(0/101)[досье]
use locale; use POSIX qw(locale_h); setlocale(LC_CTYPE,"ru_RU.CP1251");
спустя 1 час 42 минуты [обр] Владимир Палант(98/4445)[досье]
DJ G.E.D[досье]
А по теме у вас комментариев нет? ;)
спустя 1 час 15 минут [обр] Эмиль Бекиров aka superbizon(0/19)[досье]
Ну хотя бы алгоритм как это можно сделать?
Ведь так по моему большинство поисковиков работает
спустя 24 минуты [обр] Алексей В. Иванов(17/2861)[досье]
Почему-то мне кажется, что по теме ни у кого не будет комментариев с решением :)
Вы понимаете, что задача нетривиальная и единственно правильного решения не существует?
Хорошее решение данной задачи должно не только выделять фрагменты плюс/минус 50 символов от найденного слова, но и правильно обрезать слова, объединять подмножества предложений при пересечении, учитывать релевантность и пр.
То, что Вы привели в исходных данных это, конечно, шедевр :) Судя по всему Вы предлагаете написать кому-то весь алгоритм за Вас.
Предлагаю сразу начать искать в гугле.
спустя 11 минут [обр] Эмиль Бекиров aka superbizon(0/19)[досье]

Алексей В. Иванов[досье]

Да я не думал что всё так сложно, думал пару регеспов и делов.
А по каким фразам посоветуете гуглить?

спустя 28 минут [обр] Алексей В. Иванов(17/2861)[досье]
Знал бы — дал ссылку :) Но, думаю, в разрыве от поискового скрипта найти нереально. Вряд ли кто-то будет выделять этот алгоритм в отдельные функции/пакеты.
Кстати, если Вы хотите, чтобы поиск шел с учетом морфологии, то Вам надо сразу искать нормальный поиск с поддержкой aspell
спустя 43 минуты [обр] Владимир Палант(98/4445)[досье]
М Перенесено из форума "Программирование::Perl::Основы"
спустя 12 часов [обр] Serge(0/27)[досье]

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

Думаю когда-нибудь дополнить алгоритм следующим:

  1. Нужно учитывать какие слова попали в результирующую подстроку и если какое-то слово из запроса не попало, для него искать другую подстроку.
  1. Если возможно найти одну подстроку, где будет подсвечено 4 слова (но они будут повторяться) и подстроку, где будет подсвечено 3 слова, но зато в ней будут присутсвовать все слова из запроса, то предпочтение нужно отдать второй подстроке.
  1. Если в запросе была фраза в кавычках, то предпочтение нужно отдавать подстроке, где будет именно искомая фраза, а не подстроке, где будет подсвечено больше слов из запроса, но без точной фразы.

4, 5, ... Дополнить по желанию.

спустя 3 часа 17 минут [обр] Алексей В. Иванов(17/2861)[досье]
P.S. Если в исходном документе содержатся HTML-тэги, то к задаче прибавляется еще несколько интересных моментов :) Самый простое решение — это, конечно, вычистить тэги, но можно и учитывать их вес при поиске :)
спустя 1 день 1 час [обр] Эмиль Бекиров aka superbizon(0/19)[досье]
Всем спасибо, буду разбираться
Powered by POEM™ Engine Copyright © 2002-2005