initial NLU grammar setup

This commit is contained in:
Łukasz Jędyk 2021-05-16 16:56:37 +02:00
parent 2583177615
commit 9e83470bb3
4 changed files with 55 additions and 33 deletions

View File

@ -1,38 +1,31 @@
from UserActType import UserActType
from UserAct import UserAct
import re
import jsgf
class NLU:
"""
Moduł odpowiedzialny za analizę tekstu. W wyniku jego działania tekstowa reprezentacja wypowiedzi użytkownika zostaje zamieniona na jej reprezentację semantyczną, najczęściej w postaci ramy.
Wejście: Tekst
Wyjście: Akt użytkownika (rama)
"""
def __init__(self):
self.__actParsePatternList = [
(
r"(.*)(cze(ś|s)(ć|c)|witaj|dzie(ń|n) dobry)(.*)",
UserActType.WELCOME_MSG,
[]
),
(
r"(.*)(Jak (masz na imi(ę|e))|(si(ę|e) nazywasz))(.*)",
UserActType.REQUEST,
["name"]
),
(
r"(.*)((ż|z)egnaj)|(do widzenia)|(na razie)(.*)",
UserActType.BYE,
[]
)
]
self.book_grammar = jsgf.parse_grammar_file('book.jsgf')
def parseUserInput(self, text: str) -> UserAct:
for pattern, actType, actParams in self.__actParsePatternList:
regex = re.compile(pattern, re.IGNORECASE)
match = regex.match(text)
if match:
return UserAct(actType, actParams)
def get_dialog_act(self, rule):
slots = []
self.get_slots(rule.expansion, slots)
print(rule.grammar.name)
return UserAct(UserActType.valueOf(rule.grammar.name.upper()), slots)
def get_slots(self, expansion, slots):
if expansion.tag != '':
slots.append((expansion.tag, expansion.current_match))
return
for child in expansion.children:
self.get_slots(child, slots)
if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):
self.get_slots(expansion.referenced_rule.expansion, slots)
def parse_user_input(self, text: str) -> UserAct:
matched_rules = self.book_grammar.find_matching_rules(text)
if matched_rules:
return self.get_dialog_act(matched_rules[0])
return UserAct(UserActType.INVALID)

View File

@ -4,6 +4,8 @@ from enum import Enum, unique
@unique
class UserActType(Enum):
WELCOME_MSG = 0
REQUEST = 1
BYE = 2
BYE = 1
CREATE_MEETING = 2
CANCEL_MEETING = 3
CHANGE_MEETING = 4
INVALID = -1

27
book.jsgf Normal file
View File

@ -0,0 +1,27 @@
#JSGF V1.0 UTF-8 pl;
grammar book;
public <create_meeting> = (zapisać | wpisać | dodać | utworzyć | umówić) nowe* spotkanie;
public <cancel_meeting> = (anulować | odwołać | usunąć) spotkanie;
public <change_meeting> = (przesunąć | zmienić | edytować) spotkanie;
public <rezerwuj> = chciałbym zarezerwować stolik <dzien_rezerwacji> <godzina_rezerwacji> <liczba_osob> ;
<dzien_rezerwacji> = na <dzien> {day};
<dzien> = dzisiaj | jutro | poniedziałek | wtorek | środę | czwartek | piątek | sobotę | niedzielę;
<godzina_rezerwacji> = na [godzinę] <godzina_z_minutami> {hour};
<godzina_z_minutami> = <godzina> [<minuty>];
<godzina> = dziewiątą | dziesiątą | jedenastą | dwunastą;
<minuty> = pietnaście | trzydzieści;
<liczba_osob> = (na | dla) <liczba> {size} osób;
<liczba> = dwie | dwóch | trzy | trzech | cztery | czterech | pięć | pieciu;

View File

@ -13,7 +13,7 @@ if __name__ == "__main__":
while(1):
user_input = input("Wpisz tekst: ")
user_frame = nlu.parseUserInput(user_input)
user_frame = nlu.parse_user_input(user_input)
dst.addFrame(user_frame)
system_act = dp.chooseTactic(dst.getFrames())
text = nlg.toText(system_act)