diff --git a/example_nlu.py b/example_nlu.py new file mode 100644 index 0000000..62b4b3b --- /dev/null +++ b/example_nlu.py @@ -0,0 +1,40 @@ +import jsgf + +book_grammar = jsgf.parse_grammar_file('grammar1.jsgf') +book_grammar + + +def get_dialog_act(rule): + slots = [] + get_slots(rule.expansion, slots) + return {'act': rule.grammar.name, 'slots': slots} + +def get_slots(expansion, slots): + if expansion.tag != '': + slots.append((expansion.tag, expansion.current_match)) + return + + for child in expansion.children: + get_slots(child, slots) + + if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef): + get_slots(expansion.referenced_rule.expansion, slots) + +def nlu(utterance): + matched = book_grammar.find_matching_rules(utterance) + + if matched: + return get_dialog_act(matched[0]) + else: + return {'act': 'null', 'slots': []} + + + + +utterance = 'chciałbym zarezerwować stolik na jutro na godzinę dwunastą trzydzieści na pięć osób' +matched = book_grammar.find_matching_rules(utterance) +matched + +nlu('chciałbym zarezerwować stolik na jutro na godzinę dziesiątą dla trzech osób') + +get_dialog_act(matched[0]) \ No newline at end of file diff --git a/grammar1.jsgf b/grammar1.jsgf new file mode 100644 index 0000000..75409a0 --- /dev/null +++ b/grammar1.jsgf @@ -0,0 +1,107 @@ +#JSGF V1.0; + +/ + * Polecenia użytkownika + */ +public = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | zakończ); + +/ + * Lista produktów + */ +public = (jajka | chleb | mleko | ser | woda | cukier | sól | mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe | bułka_tarta | kajzerka); + +/ + * Wszystkie produkty w sklepie + */ +public = (); + +/ + * Wszystkie typy mięsa mielonego + */ +public = (mięso_wołowe | mięso_kurczak | mięso_indyk | mięso_wieprzowe); + +/ + * Wszystkie jednostki miary + */ +public = (kg | dag | g | sztuki); + +/ + * Komendy dotyczące koszyka + */ +public = (dodaj | usuń | zaktualizuj | przeczytaj | kontynuuj | przejdź_do | sprawdź | pusty_koszyk); + +/ + * Pytania użytkownika + */ +public = (jaka_jest_cena | kiedy_mogę_odebrać | jakie_są_dostępne_produkty | jakie_jest_cena | jaki_jest_stan_magazynowy | czy_chcę_zapłacić_online | jakie_są_opłaty | jakie_są_promocje | jakie_są_godziny_otwarcia); + +/ + * Witamy użytkownika w systemie + */ +public = (Witaj użytkowniku w systemie zakupów sieci sklepów spożywczych "Galaktyczny Skład".); + +/ + * Powitanie użytkownika w sklepie + */ +public = (Dzień dobry | Cześć | Witaj); + +/ + * Wszystkie pytania użytkownika + */ +public = ()+; + +/ + * Wszystkie komendy dotyczące koszyka + */ +public = ()+; + +/ + * Dialog + / +public = ( | | | koszyk | żadne | | )+; + + +public = dla jakiego rodzaju sklepów działa system | + chcę kupić | + zamówienie | + potrzebuję zakupów | + jakie sklepy oferuje system ; + + +public = w naszej ofercie znajdują się produkty spożywcze | + dodano {} do koszyka | + karta lojalnościowa założona pomyślnie | + na numer telefonu zostanie wysłany sms z informacją gdy zakupy będą gotowe do odbioru | + dziękujemy za skorzystanie ze sklepu {} ; + + +public = nie | + nie ten | + zmień | + nie chcę | + nie teraz | + nie tak | + cofnij | + usuń z listy; + + +public = dodaj do listy zakupów ; + +public = ale może coś innego | + czy jest jakaś inna opcja ; + +public = tak | + zgoda | + oczywiście | + dokładnie | + pewnie | + jasne | + dobrze | + właśnie tak | + ok | + rozumiem ; + +public = do widzenia | + dziękuję | + miłego dnia | + do zobaczenia ; \ No newline at end of file