From fbd85d9e341f7ad8090b3a5e6a91b72c050c8d11 Mon Sep 17 00:00:00 2001 From: s495724 Date: Mon, 3 Jun 2024 19:50:59 +0200 Subject: [PATCH] hope it works --- src/service/natural_language_generation.py | 30 ++-- src/service/template_selector.py | 35 +++++ src/service/templates.py | 157 +++++++++++++++++++++ 3 files changed, 214 insertions(+), 8 deletions(-) create mode 100644 src/service/template_selector.py create mode 100644 src/service/templates.py diff --git a/src/service/natural_language_generation.py b/src/service/natural_language_generation.py index 361bd25..3beec00 100644 --- a/src/service/natural_language_generation.py +++ b/src/service/natural_language_generation.py @@ -1,10 +1,24 @@ +import re +from service.template_selector import select_template +import random +# from service.templates import templates + +def parse_frame(frame): + if not hasattr(frame, 'act') or not hasattr(frame, 'slots'): + raise TypeError("Expected a Frame object with 'act' and 'slots' attributes.") + + act = frame.act + slots = [{"name": slot.name, "value": slot.value} for slot in frame.slots] + + return act, slots + class NaturalLanguageGeneration: - def __init__(self): - self.name = ["Michał"] - - def respond_to_name_query(self, question): - if "jak masz na imię?" in question.lower(): - return f"Nazywam się {self.name}." - else: - return "Nie rozumiem." + def __init__(self, templates): + self.templates = templates + def generate(self, act, slots): + template = select_template(act, slots) + if template == "default/template": + template = random.choice(self.templates["default/template"]) + slot_dict = {slot['name']: slot['value'] for slot in slots} + return template.format(**slot_dict) \ No newline at end of file diff --git a/src/service/template_selector.py b/src/service/template_selector.py new file mode 100644 index 0000000..65b749f --- /dev/null +++ b/src/service/template_selector.py @@ -0,0 +1,35 @@ +import random +from service.templates import templates + +def select_template(act, slots): + slot_names = {slot['name'] for slot in slots} + + if act == "welcomemsg": + return random.choice(templates["welcomemsg"]) + if act == "request/menu": + return random.choice(templates["request/menu"]) + if act == "inform/address": + return random.choice(templates["inform/address"]) + if act == "inform/delivery": + return random.choice(templates["inform/delivery"]) + if act == "inform/payment": + return random.choice(templates["inform/payment"]) + if act == "affirm": + return random.choice(templates["affirm"]) + if act == "request/drinks": + return random.choice(templates["request/drinks"]) + if act == "bye": + return random.choice(templates["bye"]) + if act == "inform/order": + if "quantity" in slot_names and "food" in slot_names and "pizza" in slot_names: + return templates["inform/order"][1] + elif "quantity" in slot_names and "pizza" in slot_names: + return templates["inform/order"][4] + elif "food" in slot_names and "pizza" in slot_names: + return templates["inform/order"][2] + elif "quantity" in slot_names: + return templates["inform/order"][3] + else: + return templates["inform/order"][4] + + return "default/template" \ No newline at end of file diff --git a/src/service/templates.py b/src/service/templates.py new file mode 100644 index 0000000..b31dc38 --- /dev/null +++ b/src/service/templates.py @@ -0,0 +1,157 @@ +templates = { + "inform/order": [ + "Zamówiłeś {quantity} x {food}.", + "Twoje zamówienie to {quantity} x {food} {pizza}.", + "Mmmm... {food} {pizza} to rewelacyjny wybór. Czy chcesz coś do picia?", + "Dziękujemy za zamówienie {quantity} x {food}.", + "Na jaką pizzę masz ochotę?" + ], + "request/menu": [ + "Oto nasze menu: {menu}.", + "Nasze menu obejmuje: {menu}.", + "Proszę, oto lista dostępnych dań: {menu}.", + "Dostępne dania to: {menu}.", + "W naszym menu znajdziesz: {menu}." + ], + "inform/address": [ + "Twój adres to: {address}.", + "Adres, który podałeś, to: {address}.", + "Dostawa na adres: {address}.", + "Dostarczymy na adres: {address}.", + "Twój podany adres to: {address}." + ], + "request/price": [ + "Cena za {food} wynosi {price} zł.", + "Koszt {food} to {price} zł.", + "Cena {pizza} o rozmiarze {size} wynosi {price} zł.", + "Za {quantity} x {pizza} zapłacisz {price} zł.", + "Koszt {food} to {price} zł." + ], + "request/ingredients": [ + "Nasza {food} {pizza} składa się z ciasta, sosu pomidorowego, sera i innych dodatków.", + "W {pizza} znajdziesz: {ingredients}.", + "{pizza} zawiera: {ingredients}.", + "W skład {pizza} wchodzi: {ingredients}.", + "Na {pizza} składają się: {ingredients}." + ], + "request/sauce": [ + "Jakie sosy chciałbyś do {food}?", + "Proszę wybrać sosy do {food}.", + "Jakie sosy zamawiasz do {food}?", + "Które sosy mają być do {food}?", + "Wybierz sosy do {food}." + ], + "inform/phone": [ + "Twój numer telefonu to: {phone}.", + "Podany numer telefonu: {phone}.", + "Numer telefonu, który podałeś, to: {phone}.", + "Twoje dane kontaktowe: {phone}.", + "Telefon kontaktowy: {phone}." + ], + "inform/order-complete": [ + "Twoje zamówienie zostało zrealizowane. Dziękujemy!", + "Zamówienie zakończone. Dziękujemy za zakupy!", + "Zamówienie zrealizowane. Czekaj na dostawę!", + "Twoje zamówienie jest gotowe. Dziękujemy!", + "Realizacja zamówienia zakończona. Dziękujemy!" + ], + "request/time": [ + "Oczekiwany czas dostawy to {time} minut.", + "Dostawa zajmie około {time} minut.", + "Czas dostawy to około {time} minut.", + "Przewidywany czas dostawy to {time} minut.", + "Twoje zamówienie dotrze w {time} minut." + ], + "request/size": [ + "Jaką wielkość {pizza} preferujesz? Mamy {sizes}.", + "Dostępne rozmiary {pizza} to {sizes}.", + "Jaką wielkość {pizza} chciałbyś zamówić? {sizes}.", + "Proszę wybrać rozmiar {pizza}: {sizes}.", + "Mamy następujące rozmiary {pizza}: {sizes}." + ], + "affirm": [ + "Świetnie! Napisz co Ci chodzi po głowie.", + "Dobrze! Co dalej?", + "OK! Co chciałbyś zamówić?", + "Super! Co dalej?", + "Dobrze! Jakie dalsze zamówienia?" + ], + "inform/delivery": [ + "Twoje zamówienie zostanie dostarczone na {address}.", + "Dostarczymy zamówienie na adres: {address}.", + "Dostawa na adres: {address}.", + "Twoje zamówienie jedzie na {address}.", + "Adres dostawy: {address}." + ], + "inform/address": [ + "Twoje zamówienie zostanie dostarczone na adres: {address}.", + "Dostawa będzie na adres: {address}.", + "Adres dostawy: {address}." + ], + "inform/payment": [ + "Metoda płatności to: {payment-method}.", + "Płatność realizujesz przez: {payment-method}.", + "Wybrałeś metodę płatności: {payment-method}.", + "Płatność: {payment-method}.", + "Możesz zapłacić kartą, gotówką lub blikiem" + ], + "request/delivery-price": [ + "Koszt dostawy wynosi {delivery-price} zł.", + "Cena dostawy to {delivery-price} zł.", + "Za dostawę zapłacisz {delivery-price} zł.", + "Dostawa kosztuje {delivery-price} zł.", + "Koszt dostawy: {delivery-price} zł." + ], + "inform/time": [ + "Aktualny czas to {time}.", + "Jest teraz {time}.", + "Czas: {time}.", + "Godzina: {time}.", + "Obecny czas: {time}." + ], + "request/drinks": [ + "Jakie napoje chciałbyś zamówić?", + "Proszę wybrać napoje do zamówienia.", + "Jakie napoje dołączamy do zamówienia?", + "Co chciałbyś pić?", + "Proszę podać napoje do zamówienia." + ], + "inform/name": [ + "Twoje imię to {name}.", + "Podane imię: {name}.", + "Twoje imię: {name}.", + "Masz na imię {name}.", + "Imię: {name}." + ], + "welcomemsg": [ + "Witaj w naszej wspaniałej pizzerii. W czym mogę pomóc?", + "Halo, halo, tu najlepsza pizza w mieście. Masz głoda?", + "Dzieńdoberek, gdyby wszyscy jedli nasze pizze, na świecie nie byłoby wojen. Jaką pizzę sobie dziś gruchniesz?", + ], + "request/menu": [ + "W naszym menu znajdują się pizze, spaghetti, gnocci oraz aranchini. Polecam potrawkę śląską po grecku.", + "Smażymy, gotujemy, prażymy, ale najlepiej nam wychodzi pizza. Na co masz ochotę?", + ], + "request/drink": [ + "Oferujemy napoje zimne, ciepłe i letnie. Cola, fanta, woda mineralna, kawa, herbata lub frappe.", + "Może z alkoholem? Mamy świeżo warzone piwo", + ], + "bye": [ + "Dziękujemy i do zobaczenia wkrótce.", + "Polecamy się na przyszłość. Do zobaczenia!", + "Do widzenia.", + ], + "negate": [ + "Przepraszam, nie mamy {ingredient/neg} w ofercie.", + "Niestety, {ingredient/neg} jest niedostępne.", + "Nie posiadamy {ingredient/neg} w menu.", + "Brak {ingredient/neg} w naszej ofercie.", + "Niestety, nie mamy {ingredient/neg}." + ], + "default/template": [ + "Przepraszamy, ale nie rozumiemy Twojego zapytania.", + "Proszę spróbować ponownie później.", + "Nie rozpoznajemy Twojej prośby, spróbuj ponownie.", + "Strasznie szybko to napisałeś, nie zrozumiałem...." + ] +}