172 lines
6.0 KiB
Python
172 lines
6.0 KiB
Python
from Modules import NLU
|
|
from typing import List, Tuple
|
|
import random
|
|
|
|
nlu = NLU()
|
|
|
|
|
|
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 act_inform(sentence: str) -> str:
|
|
if is_in_sentence(sentence, "dostępna"):
|
|
return random.choice(
|
|
[
|
|
"Wskazana przez Ciebie pozycja niestety nie jest dostępna",
|
|
"Ksiązką, o którą pytasz jest aktualnie dostępna",
|
|
]
|
|
)
|
|
elif is_in_sentence(sentence, "wydawcy", "wydawca", "wydawnictwo", "wydawnictwa"):
|
|
return random.choice(
|
|
[
|
|
"Książka tego wydawcy jest dostępna",
|
|
"Książka tego wydawcy nie jest dostępna",
|
|
"Nie znaleziono wydawcy o tej nazwie",
|
|
]
|
|
)
|
|
elif is_in_sentence(sentence, "autor", "autora", "autorstwa"):
|
|
return random.choice(
|
|
[
|
|
"Książka tego autora nie jest dostępna",
|
|
"Książki tego autora są dostępne w bibliotece",
|
|
"Nie znaleziono autora o tym imieniu i nazwisku"
|
|
]
|
|
)
|
|
elif is_in_sentence(sentence, "godziny", "otwarta", "czynna", "otwarcie"):
|
|
return "Biblioteka jest otwarta w dni robocze w godzinach 8-16"
|
|
elif is_in_sentence(sentence, "lokalizacja", "lokalicazji", "adres", "ulica", "placówka"):
|
|
return "Biblioteka znajduje się na ul. Targowej 10 w Poznaniu"
|
|
elif is_in_sentence(
|
|
sentence,
|
|
"dni", "dzień",
|
|
"niedziela", "niedziele", "niedzielę",
|
|
"święta", "święto"
|
|
):
|
|
return "Biblioteka otwarta jest jedynie w dni robocze. Godziny otwarcia: 8-16"
|
|
elif is_in_sentence(sentence, "numer telefonu", "kontakt", "numer kontaltowy", "telefon"):
|
|
return "Numer kontaktowy: 123 456 789"
|
|
elif is_in_sentence(
|
|
sentence,
|
|
"wydarzenie", "wydarzenia",
|
|
"atrakcja", "atrakcje",
|
|
"spotkanie", "spotkania"
|
|
):
|
|
return random.choice(
|
|
[
|
|
"W najbliższy poniedziałek odbędzie się Dzień młodego czytelnika",
|
|
"Dzień fantastyki trwać będzie przez cały najbliższy weekend",
|
|
"Dzień promowania czytelnictwa to najbliższe wydarzenie (najbliższa sobota)",
|
|
"Obecnie nie ma żadnych zaplanowanych wydarzeń",
|
|
]
|
|
)
|
|
return "Niestety nie zrozumiałem? Jakich informacji szukasz?"
|
|
|
|
|
|
def act_affirm() -> str:
|
|
return random.choice(
|
|
[
|
|
"Zgadza się",
|
|
"Tak",
|
|
"Tak zgadza się",
|
|
]
|
|
)
|
|
|
|
|
|
|
|
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()
|
|
elif act == "inform":
|
|
return act_inform(sentence)
|
|
elif act == "affirm":
|
|
return act_affirm(sentence, slots)
|
|
return "Nie rozumiem pytania lub nie posiadamy takiej książki"
|
|
|
|
|
|
while True:
|
|
sentence = input("Wiadomość użytkownika: ")
|
|
print(answer(sentence))
|