вопрос по поиску со словоформами

spiner

Новичок
вопрос по поиску со словоформами

У меня вопрос скорее всего не по программированию по PHP, а по теории алгоритма. Есть словарь словоформ. Причем этот словарь знает еще и про части речи (существительное, прилагательное и т.д.).
Искать буду с помощью FULLTEXT. Так вот. Если пользователь вводит одно поисковое слово, поиск производится по этому слову и его словоформам. Тут все просто.
А вот если пользователь вводит два слова и более, то это довольно-таки накладно (да и не нужно) - в смысле использовать все словоформы каждого слова в словосочетании.
Хочу сделать так:
Если ввели "синяя краска", то ищем сначала непосредственно синюю краску, потом определяем есть ли прилагательное и отбрасываем его => ищем только краску.
Т.е. бОльший вес даем существительному.
Как такая идея? В общем поставлю корректней вопрос: насколько максимально эффективно использовать базу словоформ данным алгоритмом?

И второй вопрос:
Что делать со словами, длина которых 3 и меньше. Просто их отбрасывать?

P.S. Я понимаю, что поиск нужен пользователям, и они должны сами думать как им составлять запрос, но я рассчитываю не на таких пользователей, а на совсем ленивых.
 

440hz

php.ru
spiner
поправь меня, но как я понял ты хочешь искать второе слово в уже найденных записях первого?

я бы не делал FULLTEXT, а попробовал бы сделать свои таблицы и искать уже в них своими алгоритмами.
 

spiner

Новичок
440hz
нет
если фраза состоит из нескольких слов, то я сначала ищу fulltext'ом всю фразу, а потом выделяю внутри фразы существительное, беру его словоформы и ищу уже их.
 

Popoff

popoff.donetsk.ua
Сделай отдельную таблицу. Храни в ней тексты, в которых все слова преобразованы в начальную форму. При поиске поисковую фразу тоже преобразуй к начальной форме. И будет тебе счастье :)

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

spiner

Новичок
Сделай отдельную таблицу. Храни в ней тексты, в которых все слова преобразованы в начальную форму.
Очень накладно

А что вы не используете словоформы?
 

kostya.sys

Новичок
spiner
Popoff дельный совет дал.
1. Приведи все слова в твоем тексте к начальной форме, при этом желательно сохранить оригинальный порядок слов.
2. Результат преобразования закинь в отдельную таблицу.
3. При самом поиске приводи поисковые слова к начальной форме.
4. По приведенной к начальной форме фразе или слову делай полнотекстовой поиск.

Правда слова меньше 4 букв выкидываю совсем.
 

kruglov

Новичок
А как в случае этого дельного совета показывать отрывок с найденными словами для подсветки?
 

kruglov

Новичок
Лично я делаю список всех словоформ каждого из слов, которые и ищу. Я бы не сказал, что получается слишком тормозно.
 

Wicked

Новичок
kruglov
используя FULLTEXT ? А как в этом случае решается та же проблема, на которую ты указал?
 

Aknichy

Новичок
как делаю я.
1. есть таблица со слоформами (каждое поле содержит все словоформы для слова.через.точку) - это дает уменьшение количества записей в разы.
2. пользователь вводит "слово" - из таблицы_слов возвращается запись "слово.слова.слов"
3. прочесывается текст по всем словам на совпадения сословоформами (тут удобство записи.через.точку - для составления рег-выражения)

если пользователь вводит словосочетание
проверка по словам - сначала первое слово. (аналогично п1-2.)
3. после его вхождения беру 6 слов текста после этого слова- проверяю на соотвествие со вторым словом из словосочетания пользователя. и т.д.

коротких слов не выкидываю, но у меня есть таблица в бд для стоп-слов -перед проверкой текст "чищу" от предлогов и стоп-слов

в среднем для 10 словосочетаний на текст 400-500 слов скрипт работает 0-5 сек.
 

kruglov

Новичок
Я сгенерил словарь окончаний на основе ispell, ищу в нем подходящие окончания для слова (10 букв, 9, 8, 7, 6 - и т.д. - пока не найду - через find_in_set, естественно). Потом выбираю остальные окончания, подклеиваю в определившейся основе слова - и получаю список.

Да, есть "левые" варианты типа Круглов - Круглы - Круглами, но это не особо страшно, т.к. на сайте они все равно не найдутся.

А несуществующие в словаре слова "парадигмятся" прекрасно, обязательно найдется похожее слово.
 
Сверху