Лексический поиск по БД.

WP

^_^
Лексический поиск по БД.

СУБД MySQL, таблица с индексом FULLTEXT (`title`, `body`). Нужно организовать поиск так чтобы учитывались разные приставки и окончания запрошенных слов. Хотел бы узнать как это реализовали другие, но без использования словаря (это обязательное условие). Мои соображения:
Непосредственно поиск делается в boolean mode. По небольшой базе приставок и окончаний (они хранятся в виде массива) выделяем корень слова, и ищем *корень*, а потом фильтруем результаты регулярным выражением.
Поиском пользовался, нашел Стеммер Поттера, он поможет с выделением корня =)
Спасибо.

-~{}~ 05.06.06 00:23:

Еще поискал, нашел решения со словарем, а хотелось бы без него :(
 

Rammstein

PHPClub::News
У Котерова где-то было, вроде.
Вобщем, суть в том, что в словорях ispell есть специальный файл, в котором описаны все схемы словообразования. Вот по ним и можно корень извлекать.
 

Wicked

Новичок
Rammstein
Ага, аффиксный файл. Но по своему опыту знаю, что чтобы им нормально пользоваться, нужно знать флаги слова. В полностью автоматическом режиме на 100% корректно с ним работать не получится.
 

WP

^_^
Сначала
PHP:
  foreach ($m[0] as $w)
  {
   $sw = $stemmer->stem_word($w);
   if (preg_match('~\W~',$w) || $w == $sw) {$against .= $w;}
   else
   {
    if (strpos($w,$sw) === 0) {$against .= $sw.'*';}
    elseif (strlen($w) - strrpos($w,$sw) === strlen($w)-strlen($sw)) {$against .= '*'.$sw;}
    else {$against .= '*'.$sw.'*';}
   }
  }
А потом регулярками фильтрую результат. Не особенно красиво конечно, но без словаря за то. Компенсирую хорошими макросами :)
 

kruglov

Новичок
У меня словарь не корней, а окончаний (мегабайта на 2), изготовленный из того же ispell.

Это не окончания в грамматическом смысле, а, грубо говоря, "вторые половинки" слов.

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

Да, могут получиться "левые" формы и довольно много... Но для поиска это не слишком существенно (формы левые => все равно на сайте не найдутся)

Пример: http://www.managee.ru/search/
 

baev

‹°°¬•
Команда форума
Я извиняюсь — сам понимаю, что бред.
Но больно уж прикольно получилось:
http://www.managee.ru/search/?q=%F7%E5%F1%EA%E8%E9&strict=0

Вы искали "ческий"

Если бы поиск был как у обычных лузеров, без морфологии, мы бы искали именно ческий. Но мы, привлекши всю мощь нашего морфологического поиска, построили всевозможные формы слов, составляющих ваш запрос, получив ческа, ческая, чески, ческие, ческий, ческим, ческими, ческих, ческо, ческого, ческое, ческой, ческом, ческому, ческою, ческую, чесок, ческиев, ческием, ческии, ческию, ческия, ческиям, ческиями, ческиях, ческией, ческиею, что позволяет нам найти гораздо больше. Результат перед вами. Мы — сила! Ищите только у нас!

Найдено страниц: 0
 

kruglov

Новичок
baev
Ну, по-видимому, использовалось слово "веский" и еще какие-то, с более короткими окончаниями (для надежности).

upd: и еще слово "кий"
 

XOR_URAL2

Новичок
Стеммер Поттера ... Что это такое? в первый раз слышу тема очень актуальна. Не могли бы вы мне скинуть ссылочку ....
 
Сверху