diff --git a/NaturalLanguageUnderstanding.py b/NaturalLanguageUnderstanding.py index f84992a..f79afaf 100644 --- a/NaturalLanguageUnderstanding.py +++ b/NaturalLanguageUnderstanding.py @@ -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) diff --git a/UserActType.py b/UserActType.py index d532331..e40a708 100644 --- a/UserActType.py +++ b/UserActType.py @@ -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 diff --git a/book.jsgf b/book.jsgf new file mode 100644 index 0000000..54d2dc7 --- /dev/null +++ b/book.jsgf @@ -0,0 +1,27 @@ +#JSGF V1.0 UTF-8 pl; + +grammar book; + +public = (zapisać | wpisać | dodać | utworzyć | umówić) nowe* spotkanie; + +public = (anulować | odwołać | usunąć) spotkanie; + +public = (przesunąć | zmienić | edytować) spotkanie; + +public = chciałbym zarezerwować stolik ; + + = na {day}; + + = dzisiaj | jutro | poniedziałek | wtorek | środę | czwartek | piątek | sobotę | niedzielę; + + = na [godzinę] {hour}; + + = []; + + = dziewiątą | dziesiątą | jedenastą | dwunastą; + + = pietnaście | trzydzieści; + + = (na | dla) {size} osób; + + = dwie | dwóch | trzy | trzech | cztery | czterech | pięć | pieciu; \ No newline at end of file diff --git a/main.py b/main.py index 9391992..82825e0 100644 --- a/main.py +++ b/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)