initial NLU grammar setup
This commit is contained in:
parent
2583177615
commit
9e83470bb3
@ -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)
|
||||
|
@ -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
27
book.jsgf
Normal 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;
|
2
main.py
2
main.py
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user