diff --git a/JSGFs/confirm.jsgf b/JSGFs/confirm.jsgf index d26d114..01ccdae 100644 --- a/JSGFs/confirm.jsgf +++ b/JSGFs/confirm.jsgf @@ -1,10 +1,10 @@ #JSGF V1.0 UTF-8 pl; grammar confirm; -public = Czy ta książka to ; +public = Czy ta książka to {books}; public = Czy ta książka to ; -public = Ksiażka została wypożyczona; -public = Książka została zarezerwowana; +public = Ksiażka {books} została wypożyczona; +public = Książka {books} została zarezerwowana; = {books}; = {authors}; diff --git a/main.py b/main.py index 4fe80dc..75487a7 100644 --- a/main.py +++ b/main.py @@ -1,55 +1,102 @@ from Modules import NLU +from typing import List, Tuple import random nlu = NLU() -def answer(sentence): - nlu_match = nlu.match(sentence) - act, slots = nlu_match['act'], nlu_match['slots'] - if act == 'hello': - return random.choice(['Dzień dobry, witam w interaktywnej bibliotece', 'Witam w interaktywnej biblitece', - 'Dzień dobry, w czym mogę pomóc?', 'Witam w interaktywnej bibliotece książnicy płockiej, jak mogę pomóc?']) - if act == 'bye': - return random.choice(['Do zobaczenia', 'Dziękuję i życzę miłej lektury', 'Do widzenia']) - if act == 'request': - if 'wypożyczyć' in sentence or 'interesuje' in sentence or 'wypożyczenie' in sentence: - for slot in slots: - return f'Książka {slot[1]} została dla Ciebie zapisana i czeka na odbiór' - return 'Niestety nie mamy tej książki' - elif 'oddać' in sentence or 'zwrócić' in sentence: - return f'Proszę przynieść książkę/i do naszej biblioteki' - elif 'rezerwacja' in sentence or 'zarezerwować' in sentence or 'rezerwacji' in sentence: - s = 'Książka ' - for slot in slots: - s += slot[1] + ' ' - if slots: - s+= 'została zarezerwowana' - return s - return 'Nie mamy tej książki, więc nie da się jej zarezerwować' - elif 'biblioteka' in sentence or 'otwarta' in sentence: - return 'Biblioteka jest otwarta od poniedziałku do soboty w godzinach 8-20, bez świąt' - elif 'karta' in sentence or 'biblioteczna' in sentence or 'założyć' in sentence: - return """Założyć kartę biblioteczną można przez naszą stronę www.biblioteka.pl, - karta przyjdzie pocztą a opłata to 5 zł. - Również można ją odebrać w naszej bibliotece od poniedziałku do soboty w godzinach 8-20""" - elif 'zgubiłem' in sentece or 'zgubiłam' in sentence or 'zniszczyłam' in sentence or 'zniszczyłem': - return 'W razie zgubienia lub zniszczenia karty należy przyjść do biblioteki w celu jej zablokowania.' - if act == 'thankyou': - return random.choice(['Proszę!', 'Nie ma za co', 'Po to tutaj jestem!']) - if act == 'negate': - return 'Akcja została cofnięta' - if act == 'confirm': - if slots: - if 'wypożyczona' in sentence: - return f'Książka {slots[0][1]} została wypożyczona' - elif 'zarezerwowana' in sentence: - return f'Książka {slots[0][1]} została zarezerwowana' - if act == 'ack': - return random.choice(['W czymś jeszcze mogę pomóc?', 'Co mogę jeszcze zrobić']) - return 'Nie rozumiem pytania lub nie posiadamy takiej książki' +def is_in_sentence(*args: str) -> bool: + sentence, *words = args + return any(word for word in words if word in sentence) + + +def act_hello() -> str: + return random.choice( + [ + "Dzień dobry, witam w interaktywnej bibliotece", + "Witam w interaktywnej biblitece", + "Dzień dobry, w czym mogę pomóc?", + "Witam w interaktywnej bibliotece książnicy płockiej, jak mogę pomóc?", + ] + ) + + +def act_bye() -> str: + return random.choice( + ["Do zobaczenia", "Dziękuję i życzę miłej lektury", "Do widzenia"] + ) + + +def act_request(sentence: str, slots: List[Tuple[str, str]]) -> str: + if is_in_sentence(sentence, "wypożyczyć", "interesuje", "wypożyczenie"): + book = " ".join(slot[1] for slot in slots) + return f"Książka {book} została dla Ciebie zapisana i czeka na odbiór" + elif is_in_sentence(sentence, "oddać", "zwrócić"): + return "Proszę przynieść książkę/i do naszej biblioteki" + elif is_in_sentence(sentence, "rezerwacja", "zarezerwować", "rezerwacji"): + if slots: + book = " ".join(slot[1] for slot in slots) + return f"Książka {book} została zarezerwowana" + return "Niestety nie mamy tej książki" + elif is_in_sentence(sentence, "biblioteka", "otwarta"): + return "Biblioteka jest otwarta od poniedziałku do soboty w godzinach 8-20, bez świąt" + elif is_in_sentence(sentence, "założyć kartę", "założyć konto", "założyć"): + return """Założyć kartę biblioteczną można przez naszą stronę www.biblioteka.pl, + karta przyjdzie pocztą a opłata to 5 zł.""" + elif is_in_sentence( + sentence, + "zgubiona", + "zgubiłem kartę", + "zgubiłam kartę", + "zniszczyłem kartę", + "zniszczyłam kartę", + ): + return "W razie zgubienia lub zniszczenia karty należy przyjść do biblioteki w celu jej zablokowania." + return "Nie rozumiem pytania lub nie posiadamy takiej książki" + + +def act_thankyou() -> str: + return random.choice(["Proszę!", "Nie ma za co", "Po to tutaj jestem!"]) + + +def act_negate() -> str: + return "Akcja została cofnięta" + + +def act_confirm(sentence: str, slots: List[Tuple[str, str]]) -> str: + if slots: + book = " ".join(slot[1] for slot in slots) + if is_in_sentence(sentence, "wypożyczona"): + return f"Książka {book} została wypożyczona" + elif is_in_sentence(sentence, "zarezerwowana"): + return f"Książka {book} została zarezerwowana" + return "Nie rozumiem pytania lub nie posiadamy takiej książki" + + +def act_ack() -> str: + return random.choice(["W czymś jeszcze mogę pomóc?", "Co mogę jeszcze zrobić"]) + + +def answer(sentence: str) -> str: + nlu_match = nlu.match(sentence) + act, slots = nlu_match["act"], nlu_match["slots"] + if act == "hello": + return act_hello() + elif act == "bye": + return act_bye() + elif act == "request": + return act_request(sentence, slots) + elif act == "thankyou": + return act_thankyou() + elif act == "negate": + return act_negate() + elif act == "confirm": + return act_confirm(sentence, slots) + elif act == "ack": + return act_ack() + return "Nie rozumiem pytania lub nie posiadamy takiej książki" while True: - sentence = input('Wiadomość użytkowniak: ') - print(answer(sentence)) \ No newline at end of file + sentence = input("Wiadomość użytkowniak: ") + print(answer(sentence))