22. Нормализация слов
В русском языке каждое слово может иметь множество словоформ, которые могут быть в запросах, например, ГРУППА, ГРУППЫ, ГРУППЕ, ... - это словоформы одного и того же слова. Перед поиском ответа на запрос нужно приводить эти слова к одному виду ГР - как представлено в БЗ. Для этого требуются лингвистические знания (ЛЗ).
Вариант 1. Пусть в БЗ лингвистические знания (ЛЗ) имеют вид:
WORD(ГР,ГРУППА) WORD(ГР,ГРУППЫ) WORD(ГР,ГРУППЕ) ...
WORD(СТУД,СТУДЕНТ) WORD(СТУД,СТУДЕНТЫ) ...
Тогда нормализация может осуществляться простым способом:
START:IF THEN B:IN_WIN(" ","Введите запрос"," ")
T!:NORM() T1:ANSW() B:IN() B:HALT();
NORM():IF @@(X1/X11) WORD(X2,X1) THEN B:SET(X11,2,X2);
Продукция T!:NORM() фрагменты, сформированные B:IN_WIN(...) на базе запроса, переделает: @@(ГРУППЫ) -> @@(ГР) ... и затем будет вызвана продукция T1:ANSW() поиска ответа.
Вариант 2. Предыдущий вариант требует большого количества фрагментов, образующих ЛЗ. Для их уменьшения можно использовать фрагменты вида:
WORD(ГР,ГРУППА,ГРУППЫ,ГРУППЕ,...)
WORD(ОТЛ,ОТЛИЧНИК,ОТЛИЧНИКОМ,....)
...
WORD(ВОПРОС,КТО,КУДА,КАКОЙ,...) {= Вопросительные местоимения =}
PREP(ИЗ) PREP(В) PREP(ЗА) ... {= Лишние слова - предлоги ... =}
PREP("?")
Отметим, что в БЗ фрагменты могут иметь более пяти аргументных мест, однако в продукциях их должно быть не более пяти.
Тогда для нормализации могут быть использованы продукции:
NORM():IF D:@@(X1) PREP(X1) THEN; {= Удаляет лишние слова =}
NORM():IF @@(X1/X11) B:FR(X12,_,X1)
B:FR(X12,0,WORD) {= ищет фрагменты WORD со словом X1 =}
B:FR(X12,1,X2) {= берет слово X2 на 1-ом месте =}
THEN B:SET(X11,1,X2); {= подставляет X2 в @@(...) =}
Пример 22.1. "Кто отличник группы ПМ95 ?"
Программа поиска ответа:
START:IF THEN B:IN_WIN(" ","Введите запрос"," ")
T!:NORM() T!:ANSW() B:IN() B:HALT();
ANSW():IF@@(ВОПРОС)
@@(ГР){= характеризуют запрос =}
@@(X2) СТУД(X1,X2) {= X2 - ПМ95 или ПМ96 ... =}
@@(X3) X3(X1) {= X3 - ОТЛ или ХОР ... =}
THEN
B:BK() T1:SAY_FIO(X1);
SAY_FIO(X1):IF ФАМ(X4,X1) ИМЯ(X4,X1) THEN B:A(X4," ",X5);
< ... Вставить NORM(), см. выше ...>;
Тогда T!:NORM() удалит @@("?") и преобразует:
@@(КТО) -> @@(ВОПРОС)
@@(ГРУППЫ) -> @@(ГР)
@@(ОТЛИЧНИК) -> @@(ОТЛ),
Продукция T!:ANSW() проверит, что это запрос, расставит все по своим местам и даст ответ. При этом в запросе можно менять группы и спрашивать о других свойствах (не только ОТЛИЧНИК). Данная продукция обеспечит ответ. В реальных программах ответ может быть выдан в файл и редактор, см. пример 6.2.
Предыдущий раздел|Следующий раздел