Вам потребуется написать анализатор для разбора таких строк запроса.
Регулярные выражения будут полезны для поиска «глаголов» и «существительных» в строках запроса, но вам, вероятно, также понадобится неконтекстная грамматика, описывающая язык ваших запросов, например что-то вроде этого:
<QUERY> := <TARGET_SPEC>
<TARGET_SPEC> := <OBJECT> 'that can' <ABILITY>
<TARGET_SPEC> := <OBJECT>
<OBJECT> := <COLOR> <WHAT>
<OBJECT> := <WHAT>
<COLOR> := 'blue' | 'red' | 'purple' | 'green'
<WHAT> := <ITEM> | <HERO>
<ITEM> := <ADJECTIVE> <ITEM>
<ADJECTIVE> := 'brigade' | 'hero' | 'magic' | 'enhanced' | 'rustproof'
<ITEM> := 'enhancements' | 'sword' | 'potion'
<HERO> := <HERO> 'of' <COUNTRY>
<HERO> := 'kings' | 'knights' | 'thiefs'
<COUNTRY> := 'israel' | 'palestine' | 'jordan' | 'egypt'
<ABILITY> := <ABILITY> 'and' <ABILITY>
<ABILITY> := 'swim' | 'dance' | discard <DISCARDABLE> | 'kill' <HERO> | 'use' <ITEM>
<DISCARDABLE> := 'ec's' | 'et's' | 'etc'
Парсер, построенный на основе такой грамматики, сможет определить, какая часть вашего запроса является объектом, который является способностью, цветом, страной и т. Д. Например, для заданной входной строки «красные рыцари Иордана, которые могутswim ', парсер выберет правильные правила и применит их:
<QUERY> := 'red knights of jordan that can swim'
<TARGET_SPEC> := 'red knights of jordan that can swim'
<TARGET_SPEC> := 'red knights of jordan' 'that can' 'swim'
<OBJECT> := 'red knights of jordan'
<ABILITY> := 'swim'
<COLOR> := 'red'
<WHAT> := 'knights of jordan'
<HERO> := 'knights' 'of' 'jordan'
<HERO> := 'knights'
<COUNTRY> := 'jordan'
На основе извлеченной информации вы сможете создавать критерии поиска.
Использование грамматики имеет дополнительное преимущество, заключающееся в устранении некоторых двусмысленностей, которые было бы трудно разрешить любым другим способом - например, если пользователь запрашивает «красных королей, которые могут убить белых рыцарей», простые алгоритмы, которые просто ищутсопоставить каждое слово со списком доступных цветов не удастся.
Рекомендую прочитать книгу о дизайне компилятора - Книга Дракона - классический выбор (вам не нужно читать всеэто просто часть о лексерах и парсерах).
Если вы не хотите кодировать весь синтаксический анализатор самостоятельно (поскольку это может быть довольно трудоемким и подверженным ошибкам), вам потребуется генератор синтаксического анализатора (то есть программа, которая создает исходный код синтаксического анализатора).код для данной грамматики); здесь - это вопрос с некоторыми предложениями по PHP.
Вы также должны рассмотреть вопрос о технике обработки естественного языка.Здесь есть онлайн-курс от Стэнфордского университета здесь , я сейчас его посещаю и могу искренне рекомендовать его.