This commit is contained in:
Cyganik 2024-04-23 15:28:20 +02:00
parent a509445ce6
commit 9dffcd9369
3 changed files with 131 additions and 5 deletions

99
book.jsgf Normal file
View File

@ -0,0 +1,99 @@
#JSGF V1.0 UTF-8 pl;
grammar book;
public <rezerwuj> = chcialbym zarezerwowac stolik <dzien_rezerwacji> <godzina_rezerwacji> <liczba_osob> ;
<dzien_rezerwacji> = (na | w) <dzien> {day};
<dzien> = dzisiaj | jutro | poniedzialek | wtorek | srode | czwartek | piatek | sobote | niedziele;
<godzina_rezerwacji> = (na | o) [godzine] <godzina_z_minutami> {hour};
<godzina_z_minutami> = <godzina> [<minuty>];
<godzina> = dziewiata | dziesiata | jedenasta | dwunasta;
<minuty> = pietnas | trzydziesci;
<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,4 +1,6 @@
from typing import Any
import jsgf
import argparse
class Model():
@ -11,9 +13,10 @@ class Model():
dp = DP()
nlg = NLG()
msg = prompt
msg = prompt.lower()
rama_nlu = nlu(msg)
print(rama_nlu)
rama_dst = dst(rama_nlu)
rama_dp = dp(rama_dst)
text = nlg(rama_dp)
@ -25,10 +28,31 @@ class NLU():
def __init__(self):
pass
def get_dialog_act(self, rule):
slots = []
self.get_slots(rule.expansion, slots)
return {'act': rule.grammar.name, 'slots': 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 __call__(self, prompt) -> Any:
msg = prompt
if "imie" in msg:
return "jakie imie"
book_grammar = jsgf.parse_grammar_file('book.jsgf')
matched = book_grammar.find_matching_rules(prompt)
if matched:
return self.get_dialog_act(matched[0])
else:
return {'act': 'null', 'slots': []}
class DST():
@ -64,6 +88,9 @@ class NLG():
if __name__ == "__main__":
model = Model()
parser = argparse.ArgumentParser()
parser.add_argument("--msg")
args = parser.parse_args()
ans = model(prompt="Jak masz na imie")
ans = model(prompt=args.msg)
print(ans)

0
evaluate.py Normal file
View File