DST and DP
This commit is contained in:
parent
da419d6659
commit
4a699901df
21
book.jsgf
21
book.jsgf
@ -2,23 +2,27 @@
|
||||
|
||||
grammar book;
|
||||
|
||||
public <request> = interesuja mnie dania kuchni woskiej oraz meksykanskiej | jaka jest gramatura waszego burrito i czy mozna wybrac do niego mieso | przyjmujecie patnosc karta | a od ktorej do ktorej jest otwarta | super w takim razie czy mogbym dokonac rezerwacji na godzine 21 | przy oknie poprosze | jakie alergeny zawiera stek z grillowanymi warzywami i jakie piwa importowane macie dokadnie | czy akceptujecie bitcoina | a w jakiej cenie jest ta pizza | karta | koreanskie bibimbap z woowina brzmi dobrze ile kosztuje | nie nie chce nic zmieniac prosze o przekazanie dania do realizacji | zaplace gotowka przy odbiorze | lasagne brzmi super moge do tego wypic cole i zamowic jakis deser | wszystko jest okej dziekuje | chciabym dostac 2 rozne warianty mozesz mi zaproponowac alternatywe dla drugiej osoby zamiast ryby i rosou | podaj menu bez potraw na zimno | a piwo 0 | a czy mozna blikiem | jakie dania oferujecie | czy oferujecie rozne poziomy wysmazenia wolowiny | ile kosztuje to danie gowne | tak zoz zamowienie na adres xyz | a cos innego nie lubie kurczaka | oki | czy macie moze w ofercie zrazy woowe | jaka macie karte napojow | czy oferujecie dowoz | jaki jest koszt steka z poledwicy woowej caprese i wody gazowanej | poprosze o dostawe na adres rubiez 12j na godzine 16 | dziekuje czy moge zamowic posiki na godzine 15 | a co oferujecie z dan miesnych | czy do tego serwowane sa jeszcze ziemniaki | dziekuje bardzo w takim razie chciabym to zamowic | jaka sa ceny deserow | jak duza jest porcja pierogow ruskich | to poprosze do tego sok owocowy soki z jakich owocow sa dostepne czy sa one swiezo wyciskane | to poprosze dodac to do zamowienia oraz podsumowac cae zamowienie | na wynos | 00120 watykan | a czy macie jakies dania azjatyckie | w takim razie dodaj ja do zamowienia czy mogbys zaproponowac cos na przystawke i na deser | poprosze wode i cole | potwierdzam | nie dziekuje do widzzenia | chciabym zjesc tatara zupe grzybowa stek i tiramisu czy moge zjesc tatara bez cebuli | za drogo jednak nie zjem tatara z dowozem na adres biedronkowa 4 | w takim razie na przystawke bedzie tatar a co do zupy mam pytanie z jakich grzybow ona sie skada | w takim razie cae moje zamowienie to bedzie tatar krem z dyni stek z poledwicy woowej i obedzie sie bez deseru pytanie jeszcze czy mozna pacic karta | w takim razie chetnie zostane i na ten moment bedzie dla mnie wszystko | tak ale jeszcze to nie koniec;
|
||||
public <request> = interesuja mnie dania kuchni wloskiej oraz meksykanskiej | jaka jest gramatura waszego burrito i czy mozna wybrac do niego mieso | przyjmujecie patnosc karta | a od ktorej do ktorej jest otwarta | super w takim razie czy mogbym dokonac rezerwacji na godzine 21 | przy oknie poprosze | jakie alergeny zawiera stek z grillowanymi warzywami i jakie piwa importowane macie dokadnie | czy akceptujecie bitcoina | a w jakiej cenie jest ta pizza | koreanskie bibimbap z woowina brzmi dobrze ile kosztuje | nie nie chce nic zmieniac prosze o przekazanie dania do realizacji | zaplace gotowka przy odbiorze | lasagne brzmi super moge do tego wypic cole i zamowic jakis deser | wszystko jest okej dziekuje | chciabym dostac 2 rozne warianty mozesz mi zaproponowac alternatywe dla drugiej osoby zamiast ryby i rosou | podaj menu bez potraw na zimno | a piwo 0 | a czy mozna blikiem | jakie dania oferujecie | czy oferujecie rozne poziomy wysmazenia wolowiny | ile kosztuje to danie gowne | tak zoz zamowienie na adres xyz | a cos innego nie lubie kurczaka | czy macie moze w ofercie zrazy woowe | jaka macie karte napojow | czy oferujecie dowoz | jaki jest koszt steka z poledwicy woowej caprese i wody gazowanej | poprosze o dostawe na adres rubiez 12j na godzine 16 | dziekuje czy moge zamowic posiki na godzine 15 | a co oferujecie z dan miesnych | czy do tego serwowane sa jeszcze ziemniaki | dziekuje bardzo w takim razie chciabym to zamowic | jaka sa ceny deserow | jak duza jest porcja pierogow ruskich | to poprosze do tego sok owocowy soki z jakich owocow sa dostepne czy sa one swiezo wyciskane | to poprosze dodac to do zamowienia oraz podsumowac cae zamowienie | na wynos | 00120 watykan | a czy macie jakies dania azjatyckie | w takim razie dodaj ja do zamowienia czy mogbys zaproponowac cos na przystawke i na deser | poprosze wode i cole | nie dziekuje do widzzenia | chciabym zjesc tatara zupe grzybowa stek i tiramisu czy moge zjesc tatara bez cebuli | za drogo jednak nie zjem tatara z dowozem na adres biedronkowa 4 | w takim razie na przystawke bedzie tatar a co do zupy mam pytanie z jakich grzybow ona sie skada | w takim razie cae moje zamowienie to bedzie tatar krem z dyni stek z poledwicy woowej i obedzie sie bez deseru pytanie jeszcze czy mozna pacic karta | w takim razie chetnie zostane i na ten moment bedzie dla mnie wszystko | tak ale jeszcze to nie koniec;
|
||||
|
||||
public <select> = potwierdzam | poprosze <liczba> {portion_size} porcje | no dobrze | <address> {address} | to bedzie moje cale zamowienie | poprosze <potrawa> {dish} | czy moglibyscie przygotowac <liczba> porcji na okreslona godzine na wynos;
|
||||
public <select> = poprosze <liczba> {portion_size} porcje | [<zamawianie>] <potrawa> {dish} | no dobrze | [<proszenie>] <address> {address} | czy moglibyscie przygotowac <liczba> porcji na okreslona godzine na wynos;
|
||||
|
||||
<address> = uniwersytetu poznanskiego <liczba> 61614 poznan | poziomkowa <liczba> poznan;
|
||||
<proszenie> = poprosze na | poprosze do | poprosze | do | na ;
|
||||
|
||||
public <negate> = dziekuje to wszystko | jakie aperitify sa u was dostepne | poprosze w takim razie carpaccio z buraka tiramisu i jakies dwa napoje | dobrze nie moge sie juz doczekac | troche drogo nie ma znizki dla studentow;
|
||||
<zamawianie> = chcialbym zjesc | poprosze | chcialbym | chcialabym | chcialabym zjesc | chce | chce zjesc | dla mnie bedzie | wezme ;
|
||||
|
||||
<address> = uniwersytetu poznanskiego <liczba> 61614 poznan | poziomkowa <liczba> poznan | poznan | uam poznan | wydzial matematyki | poznanska <liczba> ;
|
||||
|
||||
public <negate> = dziekuje to wszystko | jakie aperitify sa u was dostepne | poprosze w takim razie carpaccio z buraka tiramisu i jakies dwa napoje | troche drogo nie ma znizki dla studentow;
|
||||
|
||||
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 | wszystko jest ok dziekuje;
|
||||
public <ack> = potwierdzam | tak | tak potwierdzam | tak to wszystko | to poprosze | super to zatem wszystko | oki | to odbiore | wszystko jest ok dziekuje | dobrze nie moge sie juz doczekac;
|
||||
|
||||
public <reqalts> = chetnie wezme ziemniaki pieczone | to prosze dodac to do moje zamowienia czy macie jakies napoje | patnosc moze byc karta ale w 3 porcjach | super to zatem wszystko | pasuje czy mozesz powiedziec jakie skadniki sa w saatce moge miec uczulenia na niektore skadniki | a mozliwosc jest z szarlotki z lodami | dostawy i patnosci | a na miejscu moge zapacic | wezme cole ile wynosi cakowity koszt zamowienia | okej w takim razie dziekuje za pomoc pojde do innej restauracji;
|
||||
|
||||
public <reqmore> = w takim razie niech zostanie poczatkowa opcja mozemy przejsc do kwestii dostawy | platnosc gotowka ulica sezamkowa <liczba> pacanowo | okej to wziabym | okej to wziabym to a co do <potrawa> {dish} proponujesz | okej to wezme do tego cole zero ile wynosi koszt caego zamowienia | chciabym bez saatki jednak a w miejscu tego kiszonke czy maci kiszonki w restauracji | tak | dobrze a czy po takich potrawach nie bedzie mi smierdziao z buzi na randce | czemu nie podaes tego wczesniej piwo to tez napoj | kuflowe mocne | a czy mozecie zapakowac dania na wynoc | dobrze to poprosze jednak 4pak kuflowego i prosze zapakowac na wynos | to poprosze | dobrze w takim razie zaproponuj cos innego;
|
||||
public <reqmore> = w takim razie niech zostanie poczatkowa opcja mozemy przejsc do kwestii dostawy | platnosc gotowka ulica sezamkowa <liczba> pacanowo | okej to wziabym | [okej to wziabym] [to] a co do <potrawa> {dish} proponujesz | okej to wezme do tego cole zero ile wynosi koszt caego zamowienia | chciabym bez saatki jednak a w miejscu tego kiszonke czy maci kiszonki w restauracji | tak | dobrze a czy po takich potrawach nie bedzie mi smierdziao z buzi na randce | czemu nie podaes tego wczesniej piwo to tez napoj | kuflowe mocne | a czy mozecie zapakowac dania na wynoc | dobrze to poprosze jednak 4pak kuflowego i prosze zapakowac na wynos | to poprosze | dobrze w takim razie zaproponuj cos innego;
|
||||
|
||||
<hej_siema> = hej | siema | czesc | witam ;
|
||||
|
||||
@ -54,11 +58,10 @@ public <bye> = (dobrze nie moge sie juz doczekac | do widzenia | dziekuje milego
|
||||
|
||||
public <help> = [pokaz] <help_with> {help_with};
|
||||
|
||||
<help_with> = menu | (jakie posilki moge zjesc z tego menu) | (A jaka to <potrawa>) | (Chciabym zjesc <potrawa>);
|
||||
<help_with> = menu | (jakie posilki moge zjesc z tego menu) | (A jaka to <potrawa>) ;
|
||||
|
||||
<potrawa> = tatara | tatar | poledwica | poledwice | pizza | makaron | picia | zupa | danie_glowne | deser | napoj | ryba | rybe;
|
||||
<potrawa> = tatara | tatar | poledwica | poledwice | pizza | pizze | tiramisu | zrazy [wolowe] | pyzy | placki | makaron | picia | zupa | danie_glowne | deser | napoj | ryba | rybe;
|
||||
|
||||
public <confirm> = Dziekuje | tak;
|
||||
|
||||
public <affirm> = poprosze w takim razie ta pizze razy <liczba> oraz <liczba> litra coli | chciabym zamowic na adres <address> | wybornie czy z kuchni woskiej znajdzie sie lasagne oraz czy w winach znajda sie ciekawsze pozycje takie jak amarena | jestem wysoce niepocieszony z powodu braku trunkow siarczystych ale jakos przebrne przez to czy na deser jest mozliwosc tiramisu | dziekuje | na 15 dzisiaj mozna zarezerowac stoli z podanym obiadem | na <godzina> na pojutrze | no dobrze przekonales mnie zoze u was zamowienie czy przyjmujecie patnosc karta | pamietajcie zeby byo cieple ;
|
||||
|
||||
|
214
dialog_model.py
214
dialog_model.py
@ -1,29 +1,50 @@
|
||||
import string
|
||||
from typing import Any
|
||||
|
||||
import jsgf
|
||||
from unidecode import unidecode
|
||||
import string
|
||||
import argparse
|
||||
|
||||
from convlab.dst import dst
|
||||
|
||||
|
||||
class Model():
|
||||
def default_state():
|
||||
return dict(
|
||||
user_action=[],
|
||||
system_action=[],
|
||||
belief_state={
|
||||
'address': '',
|
||||
'payment_method': '',
|
||||
'dish': [],
|
||||
'time': ''
|
||||
},
|
||||
booked={},
|
||||
request_state=[],
|
||||
terminated=False,
|
||||
history=[]
|
||||
)
|
||||
|
||||
|
||||
class Model:
|
||||
def __init__(self):
|
||||
pass
|
||||
self.state = default_state()
|
||||
self.nlu = NLU()
|
||||
self.dst = DST(self.state)
|
||||
self.dp = DP(self.state)
|
||||
self.nlg = NLG(self.state)
|
||||
|
||||
def __call__(self, prompt) -> Any:
|
||||
nlu = NLU()
|
||||
dst = DST()
|
||||
dp = DP()
|
||||
nlg = NLG()
|
||||
|
||||
print(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)
|
||||
r = self.nlu(msg)
|
||||
print(r)
|
||||
r = self.dst(r)
|
||||
print(r)
|
||||
r = self.dp()
|
||||
print(r)
|
||||
# r = self.nlg(r)
|
||||
|
||||
return text
|
||||
return r
|
||||
|
||||
|
||||
class NLU():
|
||||
@ -61,29 +82,85 @@ class NLU():
|
||||
return {'act': 'null', 'slots': []}
|
||||
|
||||
|
||||
class DST():
|
||||
def __init__(self):
|
||||
self.msgs = []
|
||||
class DST(dst.DST):
|
||||
|
||||
def __call__(self, msg) -> Any:
|
||||
self.msgs.append(msg)
|
||||
return msg
|
||||
def __init__(self, state):
|
||||
dst.DST.__init__(self)
|
||||
self.state = state
|
||||
|
||||
def __call__(self, user_act) -> Any:
|
||||
if len(user_act['slots']) == 0:
|
||||
user_act = [(user_act['act'], None, None)]
|
||||
else:
|
||||
user_act = [(user_act['act'], k, v) for k, v in user_act['slots'] if v is not None]
|
||||
|
||||
self.state['request_state'] = {}
|
||||
for act, slot, value in user_act:
|
||||
self.state['user_action'].append(act)
|
||||
|
||||
if act == "platnosc":
|
||||
self.state['belief_state']['payment_method'] = value
|
||||
self.state['request_state'] = ['payment_method']
|
||||
|
||||
elif act == "offer":
|
||||
self.state['request_state'] = ['menu']
|
||||
|
||||
elif act == 'select':
|
||||
if slot == 'dish':
|
||||
self.state['belief_state']['dish'].append(value)
|
||||
else:
|
||||
self.state['belief_state'][slot] = value
|
||||
self.state['request_state'] = [slot]
|
||||
|
||||
elif act == 'inform':
|
||||
pass
|
||||
|
||||
elif act == 'request':
|
||||
pass
|
||||
|
||||
return self.state
|
||||
|
||||
|
||||
class DP():
|
||||
def __init__(self):
|
||||
pass
|
||||
def __init__(self, state):
|
||||
self.state = state
|
||||
|
||||
def __call__(self) -> Any:
|
||||
system_action = None
|
||||
|
||||
if self.state['user_action'][-1] == 'hello':
|
||||
system_action = 'welcomemsg'
|
||||
# przywitaj uzytkownika (i pokaz menu)
|
||||
|
||||
elif self.state['user_action'][-1] == 'select':
|
||||
system_action = 'inform'
|
||||
# poinformuj o wybranych slotach z "request_state"
|
||||
|
||||
elif (self.state['user_action'][-1] == 'help'
|
||||
or self.state['user_action'][-1] == 'offer'
|
||||
or self.state['user_action'][-1] == 'reqmore'
|
||||
or (self.state['user_action'][-1] == 'request' and len(self.state['request_state']) == 0)
|
||||
):
|
||||
system_action = 'offer'
|
||||
# zaoferuj cale menu
|
||||
|
||||
elif self.state['user_action'][-1] == 'ack':
|
||||
system_action = 'bye'
|
||||
self.state['terminated'] = True
|
||||
# potwierdz i zakoncz, podsumuj zamowienie
|
||||
|
||||
def __call__(self, msg) -> Any:
|
||||
if "imie" in msg:
|
||||
return "imieMSG"
|
||||
else:
|
||||
return None
|
||||
system_action = 'inform'
|
||||
# poinformuj o wybranych slotach z "request_state"
|
||||
# lub o wszystkich jezeli nic nie ma w request state
|
||||
|
||||
self.state['system_action'].append(system_action)
|
||||
return system_action
|
||||
|
||||
|
||||
class NLG():
|
||||
def __init__(self):
|
||||
pass
|
||||
def __init__(self, state):
|
||||
self.state = state
|
||||
|
||||
def __call__(self, msg) -> Any:
|
||||
if msg == "imieMSG":
|
||||
@ -94,32 +171,55 @@ class NLG():
|
||||
|
||||
if __name__ == "__main__":
|
||||
model = Model()
|
||||
# parser = argparse.ArgumentParser()
|
||||
# parser.add_argument("--msg")
|
||||
# args = parser.parse_args()
|
||||
|
||||
# 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!"))
|
||||
print(model(prompt="Interesuja mnie dania kuchni woskiej oraz meksykanskiej"))
|
||||
print(model(prompt="okej to wziabym to a co do picia proponujesz"))
|
||||
print(model(prompt="Poproszę ryba"))
|
||||
print(model(prompt="Poproszę tatara"))
|
||||
print(model(prompt="Poproszę 2 porcje"))
|
||||
print(model(prompt="Zaplacę kartą przy odbiorze"))
|
||||
print(model(prompt="Dobrze, nie mogę sie już doczekać"))
|
||||
print(model(prompt="uniwersytetu poznanskiego 4 61-614 poznan"))
|
||||
print(model(prompt="dziekuje to wszystko"))
|
||||
print(model(prompt="pokaz menu"))
|
||||
print(model(prompt="poprosze blikiem z gory"))
|
||||
print(model(prompt="menu"))
|
||||
# jezeli sie przywita to przywitaj uzytkownika (i pokaz menu)
|
||||
# response = model("Cześć")
|
||||
# response = model("Witam")
|
||||
# response = model("Witam system")
|
||||
# response = model("Hej, jakim botem jesteś?")
|
||||
# response = model("Hej, czym się zajmujesz?")
|
||||
# response = model("Hej, w czym mi możesz pomóc?")
|
||||
response = model("Siema, w czym możesz mi pomóc?")
|
||||
assert response == "welcomemsg"
|
||||
|
||||
print()
|
||||
|
||||
# jezeli prosi o pomoc lub po prostu o menu to zaoferuj cale menu
|
||||
# response = model("Pokaz menu")
|
||||
# response = model("A co do picia proponujesz?")
|
||||
# response = model("Jakie inne desery oferujesz?")
|
||||
response = model("Interesują mnie dania kuchni włoskiej oraz meksykanskiej.")
|
||||
assert response == "offer"
|
||||
|
||||
print()
|
||||
|
||||
# jezeli wybierze danie to zapisz wybor i poinformuj o nim
|
||||
# response = model("Wezmę rybe")
|
||||
# response = model("Poproszę tatara")
|
||||
response = model("Chciałbym zjesc tatara")
|
||||
assert response == "inform"
|
||||
|
||||
print()
|
||||
|
||||
# jezeli poda adres to zapisze wybor i poinformuj o nim
|
||||
# response = model('Poproszę na poznańską 2')
|
||||
response = model("uniwersytetu poznanskiego 4 61-614 poznan")
|
||||
assert response == "inform"
|
||||
|
||||
# jezeli wybierze rodzaj platnosci to zapisz wybor i poinformuj o nim
|
||||
# response = model("karta")
|
||||
# response = model("Poproszę blikiem z góry")
|
||||
response = model("Zapłacę kartą przy odbiorze")
|
||||
assert response == "inform"
|
||||
|
||||
print()
|
||||
|
||||
# jezeli potwiedzi zamowienie to zakoncz zamawianie sukcesem i wypisz calosc
|
||||
# response = model("Potwierdzam!")
|
||||
# response = model("Tak!")
|
||||
# response = model("Tak to wszystko!")
|
||||
# response = model("Super, to zatem wszystko!")
|
||||
response = model("Dobrze, nie mogę się już doczekać.")
|
||||
assert response == "bye"
|
||||
|
||||
print()
|
||||
|
Loading…
Reference in New Issue
Block a user