working jsgf

This commit is contained in:
Antoni Solarski 2024-05-08 17:56:59 +02:00
parent 5c18bc5b9a
commit 6090d5d923
2 changed files with 38 additions and 85 deletions

View File

@ -2,6 +2,17 @@
grammar book;
public <hello> = <hej_siema> <who_are_you> | witam system | dzien dobry | czesc | witam ;
public <welcomemsg> = czesc jestem agentem dialogowym przyjmujacym zamowienia w restauracji moge doradzic ci w wyborze odpowiedniej pozycji z menu w czym moge ci pomoc ;
public <ack> = potwierdzam | tak | tak potwierdzam | tak to wszystko | to poprosze | super to zatem wszystko | oki | to odbiore ;
<hej_siema> = hej | siema | czesc | witam ;
<who_are_you> = w czym mozesz mi pomoc | w czym mi mozesz pomoc | jakim botem jestes | czym sie zajmujesz ;
public <rezerwuj> = chcialbym zarezerwowac stolik <dzien_rezerwacji> <godzina_rezerwacji> <liczba_osob> ;
<dzien_rezerwacji> = (na | w) <dzien> {day};
@ -19,81 +30,3 @@ public <rezerwuj> = chcialbym zarezerwowac stolik <dzien_rezerwacji> <godzina_re
<liczba_osob> = (na | dla) <liczba> {size} osob;
<liczba> = dwie | dwoch | trzy | trzech | cztery | czterech | piec | pieciu | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10;
<menu> = <przystawki> | <zupy> | <dania_glowne> | <desery>;
<przystawki> = Tatar wolowy | Carpaccio z buraka | Salatka caprese;
<zupy> = Krem z dyni | Rosol z makaronem | Zupa grzybowa;
<dania_glowne> = Stek z poledwicy wolowej | Pieczona kaczka z jablkami | Lasagne | Ryba z grilla | Risotto z kurczakiem i grzybami | Pierogi ruskie | Placki ziemniaczane;
<desery> = Tiramisu | Szarlotka | Lody waniliowe;
<zamowienie> = <potrawa>* <potwierdzenie> [<oczekiwanie>];
<potrawa> = <menu> | <napoj>;
<napoj> = cola | woda | lemoniada | piwo;
<potwierdzenie> = (potwierdzam | ok | dobrze | zgoda);
<oczekiwanie> = (czekaj | prosze czekac | odbior za <minuty> minut);
<potrawa_dodatkowa> = z sosem smietanowym;
<potrawa_specjalna> = bez cebuli;
<potrawa_dieta_keto> = Tatar wolowy | Zupa grzybowa | Stek z poledwicy wolowej;
<godzina_zamowienia> = na <godzina>;
<dzien_zamowienia> = na <dzien>;
<liczba_porcji> = <liczba> porcje;
<informacja_dodatkowa> = Pamietajcie zeby bylo cieple;
<liczba_minut> = <liczba> minut;
<koniec_rozmowy> = Dziekuje | Dziekuje to wszystko | Okej to wszystko | To wszystko | Dziekuje za pomoc;
<komplement> = Pelen profesjonalizm | Swietnie;
<odmowa> = Za drogo | Jednak nie zjem | To nie to;
<oczekiwanie_35min> = z odbiorem osobistym | z dowozem | na wynos;
<oczekiwanie_pojutrze> = na pojutrze;
<zamowienie_gotowe> = Twoje zamowienie bedzie gotowe <liczba_minut> <oczekiwanie_35min>;
<zamowienie_na_pojutrze> = Wroc do nas pojutrze;
<dialog> = <pytanie_o_menu> | <zamowienie_pierwsze> | <pytanie_o_danie_specjalne> | <pytanie_o_cene> | <pytanie_o_pakowanie_na_wynos> | <pytanie_o_dowoz> | <pytanie_o_termin> | <pytanie_o_znizke> | <pytanie_o_pozostale_skladniki> | <potwierdzenie_zamowienia> | <negocjacja> | <pytanie_o_dowod> | <potwierdzenie_dowodu> | <podziekowanie> | <prosba_o_wiecej_informacji> | <koniec_rozmowy>;
<pytanie_o_menu> = <hello> | <help> | <informacja_o_menu>;
<zamowienie_pierwsze> = <informacja_o_menu> <prosba_o_zamowienie>;
<prosba_o_zamowienie> = <inform> <potrawa>+ <potwierdzenie>;
<pytanie_o_danie_specjalne> = <reqmore> <pytanie_o_specjalne>;
<pytanie_o_specjalne> = <potrawa> <potrawa_specjalna> <potwierdzenie>;
<pytanie_o_cene> = <reqmore> <pytanie_o_cene_zamowienia>;
<pytanie_o_cene_zamowienia> = <liczba_porcji> <potrawa> <potwierdzenie>;
<pytanie_o_pakowanie_na_wynos> = <reqmore> <pytanie_o_pakowanie>;
<pytanie_o_pakowanie> = <potrawa>+ <zamowienie_na_pojutrze> | <potrawa>+ <oczekiwanie_35min> <potwierdzenie>;
<pytanie_o_dowoz> = <reqmore> <pytanie_o_dowoz_zamowienia>;
<pytanie_o_dowoz_zamowienia> = <potrawa>+ <oczekiwanie_35min> <potwierdzenie>;
<pytanie_o_termin> = <reqmore> <pytanie_o_termin_zamowienia>;
<pytanie_o_termin_zamowienia> = <potrawa>+ <dzien_zamowienia> <godzina_zamowienia>;

View File

@ -1,5 +1,7 @@
from typing import Any
import jsgf
from unidecode import unidecode
import string
import argparse
@ -31,7 +33,7 @@ class NLU():
def get_dialog_act(self, rule):
slots = []
self.get_slots(rule.expansion, slots)
return {'act': rule.grammar.name, 'slots': slots}
return {'act': rule.name, 'slots': slots}
def get_slots(self, expansion, slots):
if expansion.tag != '':
@ -45,7 +47,14 @@ class NLU():
self.get_slots(expansion.referenced_rule.expansion, slots)
def __call__(self, prompt) -> Any:
matched = self.book_grammar.find_matching_rules(prompt)
book_grammar = jsgf.parse_grammar_file('book.jsgf')
prompt = unidecode(prompt)
translator = str.maketrans('', '', string.punctuation)
prompt = prompt.translate(translator)
matched = book_grammar.find_matching_rules(prompt)
if matched:
return self.get_dialog_act(matched[0])
else:
@ -85,9 +94,20 @@ class NLG():
if __name__ == "__main__":
model = Model()
parser = argparse.ArgumentParser()
parser.add_argument("--msg")
args = parser.parse_args()
# parser = argparse.ArgumentParser()
# parser.add_argument("--msg")
# args = parser.parse_args()
ans = model(prompt=args.msg)
print(ans)
print(model(prompt="chcialbym zarezerwowac stolik na jutro na dziesiata dla trzech osob"))
print(model(prompt="Cześć"))
print(model(prompt="Hej, jakim botem jesteś?"))
print(model(prompt="Hej, w czym mi możesz pomóc?"))
print(model(prompt="Siema, w czym możesz mi pomóc?"))
print(model(prompt="Witam"))
print(model(prompt="Witam system"))
print(model(prompt="Hej, czym się zajmujesz?"))
print(model(prompt="Czesc, jestem agentem dialogowym przyjmujacym zamowienia w restauracji. Moge doradzic ci w wyborze odpowiedniej pozycji z menu. W czym moge ci pomoc?"))
print(model(prompt="oki"))
print(model(prompt="Potwierdzam!"))
print(model(prompt="Tak!"))
print(model(prompt="Tak to wszystko!"))