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.

Предыдущий раздел|Следующий раздел

- Главная страница -