diff --git a/trailminator/nlu.py b/trailminator/nlu.py index 400b5b9..afd2610 100644 --- a/trailminator/nlu.py +++ b/trailminator/nlu.py @@ -1,7 +1,9 @@ import re +import jsgf class Nlu: def __init__(self): + self.rules_grammar = jsgf.parse_grammar_file('rules.jsgf') self.acts = { "request": { 'triggers': ['jak', 'kiedy'], @@ -10,10 +12,32 @@ class Nlu: } + 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 get_dialog_act(self, rule): + slots = [] + self.get_slots(rule.expansion, slots) + return {'act': rule.grammar.name, 'slots': slots} + + def tokenize(self, string): clean_string = self.get_str_cleaned(string) - return clean_string.split() + matched = self.rules_grammar.find_matching_rules(clean_string) + + if matched: + return self.get_dialog_act(matched[0]) + else: + return {'act': 'null', 'slots': []} def get_str_cleaned(self, str_dirty): @@ -44,3 +68,5 @@ class Nlu: return (act, param) +nlu = Nlu() +print(nlu.parse('chciałbym kupić bilet do Krakow')) \ No newline at end of file diff --git a/trailminator/rules.jsgf b/trailminator/rules.jsgf new file mode 100644 index 0000000..ec5cc2c --- /dev/null +++ b/trailminator/rules.jsgf @@ -0,0 +1,30 @@ +#JSGF V1.0 UTF-8 pl; + +grammar rules; + + +public = chciałbym kupić bilet [na pociąg] [z ] [(do )]; + = {stacion}; + = {stacion}; + = Poznan | Warszawa | Wroclaw | Krakow | Gdansk; + + +public = [w] [najbliższy | najbliższą] {okres} {day}; + = dzisiaj | jutro | poniedziałek | wtorek | środę | czwartek | piątek | sobotę | niedzielę; + + +public = (0|1|2|3|4|5|6|7|8|9); +public = (+){number}; + + +public = [] bilet[y] z ulgą {discount_type}; + = studencką | seniorską | uczniowską; + + +public = [poproszę] {seat_window} | {seat_middle}; + = [miejsce] pod oknem; + = [miejsce] w środku | [miejsce] w przejściu; + + +public = [klasy | klasa] {wagonType}; + = pierwsza | druga | 1 | 2 | I | II; \ No newline at end of file