initial NLU grammar setup
This commit is contained in:
parent
2583177615
commit
9e83470bb3
@ -1,38 +1,31 @@
|
|||||||
from UserActType import UserActType
|
from UserActType import UserActType
|
||||||
from UserAct import UserAct
|
from UserAct import UserAct
|
||||||
import re
|
import jsgf
|
||||||
|
|
||||||
|
|
||||||
class NLU:
|
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):
|
def __init__(self):
|
||||||
self.__actParsePatternList = [
|
self.book_grammar = jsgf.parse_grammar_file('book.jsgf')
|
||||||
(
|
|
||||||
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,
|
|
||||||
[]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
def parseUserInput(self, text: str) -> UserAct:
|
def get_dialog_act(self, rule):
|
||||||
for pattern, actType, actParams in self.__actParsePatternList:
|
slots = []
|
||||||
regex = re.compile(pattern, re.IGNORECASE)
|
self.get_slots(rule.expansion, slots)
|
||||||
match = regex.match(text)
|
print(rule.grammar.name)
|
||||||
if match:
|
return UserAct(UserActType.valueOf(rule.grammar.name.upper()), slots)
|
||||||
return UserAct(actType, actParams)
|
|
||||||
|
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)
|
return UserAct(UserActType.INVALID)
|
||||||
|
@ -4,6 +4,8 @@ from enum import Enum, unique
|
|||||||
@unique
|
@unique
|
||||||
class UserActType(Enum):
|
class UserActType(Enum):
|
||||||
WELCOME_MSG = 0
|
WELCOME_MSG = 0
|
||||||
REQUEST = 1
|
BYE = 1
|
||||||
BYE = 2
|
CREATE_MEETING = 2
|
||||||
|
CANCEL_MEETING = 3
|
||||||
|
CHANGE_MEETING = 4
|
||||||
INVALID = -1
|
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):
|
while(1):
|
||||||
user_input = input("Wpisz tekst: ")
|
user_input = input("Wpisz tekst: ")
|
||||||
|
|
||||||
user_frame = nlu.parseUserInput(user_input)
|
user_frame = nlu.parse_user_input(user_input)
|
||||||
dst.addFrame(user_frame)
|
dst.addFrame(user_frame)
|
||||||
system_act = dp.chooseTactic(dst.getFrames())
|
system_act = dp.chooseTactic(dst.getFrames())
|
||||||
text = nlg.toText(system_act)
|
text = nlg.toText(system_act)
|
||||||
|
Loading…
Reference in New Issue
Block a user