Generic_DialogSystem/eliza.py

456 lines
13 KiB
Python
Raw Permalink Normal View History

2023-03-16 15:59:40 +01:00
import random
import re
2023-03-17 12:57:44 +01:00
#test
2023-03-12 12:40:07 +01:00
2023-03-16 15:59:40 +01:00
reflections = {
"ja jestem": "ty jesteś",
2023-03-17 12:01:28 +01:00
"jestem" : "jesteś",
2023-03-16 15:59:40 +01:00
"ja byłem": "ty byłeś",
2023-03-17 12:01:28 +01:00
"byłem" : "byłeś",
2023-03-16 15:59:40 +01:00
"ja byłam": "ty byłaś",
2023-03-17 12:01:28 +01:00
"byłam" : "byłaś",
2023-03-16 15:59:40 +01:00
"ja": "ty",
"ja będę": "ty będziesz",
2023-03-17 12:01:28 +01:00
"będę" : "będziesz",
2023-03-16 15:59:40 +01:00
"mój": "twój",
"moja": "twoja",
"mi": "ci",
"mnie": "tobie",
2023-03-17 12:01:28 +01:00
"tobie" : "mnie",
2023-03-16 15:59:40 +01:00
"ty jesteś": "ja jestem",
2023-03-17 12:01:28 +01:00
"jesteś" : "jestem",
2023-03-16 15:59:40 +01:00
"ty byłeś": "ja byłem",
2023-03-17 12:01:28 +01:00
"byłeś" : "byłem",
2023-03-16 15:59:40 +01:00
"ty byłaś": "ja byłam",
2023-03-17 12:01:28 +01:00
"byłaś" : "byłam",
2023-03-16 15:59:40 +01:00
"ty": "ja",
"ty będziesz": "ja będę",
2023-03-17 12:01:28 +01:00
"będziesz" : "będę",
2023-03-16 15:59:40 +01:00
"twój": "mój",
"twoja": "moja"
}
2023-03-12 12:40:07 +01:00
pairs = (
(
2023-03-12 13:18:22 +01:00
r"Potrzebuję (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Dlaczego potrzebujesz %1?",
"Czy naprawdę pomoże Ci posiadanie %1?",
"Jesteś pewny, że potrzebujesz %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Dlaczego by nie (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Naprawdę uważasz, dlaczego by nie %1?",
"Możliwe, że w końcu %1.",
"Naprawdę chcesz abym %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Dlaczego nie mogę (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Czy uważasz, że powinieneś być w stanie %1?",
"Jeśli mógłbyś %1, co byś zrobił?",
"Nie wiem -- dlaczego nie możesz %1?",
"Czy naprawdę próbowałeś?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Nie mogę (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Skąd wiesz, że nie możesz %1?",
"Możliwe, że mógłbyś %1 jeśli byś spróbował.",
"Co by cię to kosztowało aby %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Jestem (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Czy przyszedłeś do mnie, bo jesteś %1?",
"Jak długo byłeś %1?",
"Jak się czujesz będąc %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Jest mi (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Jak bycie %1 wpływa na Ciebie?",
"CZy jesteś szczęśliwy bedąc %1?",
"Dlaczego mówisz mi o tym, że jesteś %1?",
"Dlaczego myślisz, że jesteś %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Czy jesteś (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Dlaczego to ma znaczenie, że jestem %1?",
"Wolałbyś abym nie był %1?",
"Możliwe, że wierzysz, że jestem %1.",
"Być może jestem %1 -- co o tym sądzisz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Co (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Dlaczego pytasz?",
"W jaki sposób odpowiedź na to pomoże?",
"Co o tym myślisz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Jak (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Jak myślisz?",
"Być może sam możesz odpowiedzieć sobie na to pytanie.",
"O co tak naprawdę pytasz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 13:18:22 +01:00
r"Ponieważ (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:18:22 +01:00
"Czy to jednyny powód?",
"Jakie inne przyczyny przychodzą Ci do głowy?",
"Czy ten powód odwołuje się jeszcze do czegoś innego?",
"Jeśli %1, to co innego musi być prawdą?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"(.*) przepraszam (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"W wielu przypadkach nie trzeba przepraszać",
"Co czujesz kiedy przepraszasz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"Cześć(.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Cześć... Miło że wpadłeś dzisiaj",
"Witaj... Jak się czujesz dzisiaj?",
"Cześć, jak dziś się czujesz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"Myślę, że (.*)",
("Czy wątpisz, że %1?", "Naprawdę tak myślisz?", "Ale nie jesteś pewien, że %1?"),
2023-03-12 12:40:07 +01:00
),
(
2023-03-16 20:24:53 +01:00
r"(.*) przyjaciel (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Powiedz mi o swoich przyjacielach.",
"Kiedy myślisz o przyjacielu, co Tobie przychodzi do głowy?",
"Chy chciałbyś/chciałabyś mi opowiedzieć o przyjacielu z dzieciństwa?",
2023-03-12 12:40:07 +01:00
),
),
2023-03-16 20:24:53 +01:00
(r"Tak", ("Zdaje się, że jesteś pewien tego o czym mówisz.", "Ok, mógłyś o tym opowiedzieć trochę więcej?")),
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
r"(.*) komputer(.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Czy rzeczywiście mówisz o mnie?",
"Czy rozmawianie z komputerem nie wygląda na coś dziwnego?",
"Jak się czujesz, kiedy myślisz o komputerach?",
"Czy czujesz się zagrożony przez komputery?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"To jest (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Myślisz, że to jest %1?",
"Możliwe, że to jest %1 -- co o tym myślisz?",
"Jeśliby to było %1, co byś zrobił/zrobiła?",
"Całkiem może być, że %1.",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"To jest (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Sprawiasz wrażenie, że wiesz o czym mówisz",
"Gdybym stwierdziła, że wcale tak nie jest %1, jakbyś się poczuł/poczuła?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"(Czy możesz|Mogłabyś) (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Dlaczego myślisz, że nie mogę %1?",
"Gdybym mogła %1, to co wtedy?",
"Dlaczego się pytasz, czy mogę %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"Muszę (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 20:24:53 +01:00
"Nic nie musisz, tylko chcesz",
),
),
(
r"Czy mogę (.*)",
(
"Być może nie chcesz %1.",
"Chciałbyś/chciałabyś być w stanie %1?",
"Jeślibyś %1, zrobiłbyś/zrobiłabyś to?",
2023-03-12 12:40:07 +01:00
),
2023-03-16 03:16:06 +01:00
),
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
r"Ty jesteś (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Dlaczego myślisz, że jestem %1?",
"Czy sprawia Ci przyjemność myślenie, że jestem %1?",
"Może chciałbyś, żebym był %1.",
"Być może tak naprawdę mówisz o sobie?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Jesteś (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Dlaczego mówisz, że jestem %1?",
"Jak myślisz, dlaczego jestem %1?",
"Mówimy o tobie, czy o mnie?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Ja nie (.*)",
("Czy naprawdę nie %1?", "Dlaczego nie %1?", "Czy chcesz %1?"),
2023-03-12 12:40:07 +01:00
),
(
2023-03-16 03:14:00 +01:00
r"Czuję (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Dobrze, opowiedz mi więcej o tych uczuciach.",
"Jak często czujesz %1?",
"Kiedy zwykle czujesz %1?",
"Kiedy czujesz %1, co robisz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Mam (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Dlaczego mi mówisz, że masz %1?",
"Czy naprawdę %1?",
"Teraz, gdy masz %1, co zamierzasz zrobić dalej?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Ja bym (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Czy mógłbyś wyjaśnić dlaczego miałbyś %1?",
"Dlaczego miałbyś %1?",
"Kto inny wie, że byś %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Istnieje (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Czy myślisz, że istnieje %1?",
"Jest to prawdopodobne, że istnieje %1.",
"Chciałbyś żeby w tym miejscu istniało %1?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Mój (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Widzę, twój %1.",
"Dlaczego twierdzisz, że twój %1?",
"Kiedy twój %1, jak się czujesz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 03:14:00 +01:00
r"Ty (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-16 03:14:00 +01:00
"Powinniśmy rozmawiać o tobie, nie o mnie.",
"Dlaczego tak o mnie mówisz?",
"Co Cię obchodzi, czy ja %1?",
2023-03-12 12:40:07 +01:00
),
),
2023-03-16 03:14:00 +01:00
(r"Dlaczego (.*)", ("Dlaczego nie podasz mi powodu, dla którego %1?", "Dlaczego myślisz że %1?")),
2023-03-12 13:55:46 +01:00
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:55:46 +01:00
r"Ja chcę (.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 13:55:46 +01:00
"Jak ważne dla Ciebie jest %1?",
"Dlaczego chcesz %1?",
2023-03-12 14:42:46 +01:00
"Co zrobiłbyś, gdybyś dostał %1?",
2023-03-12 13:55:46 +01:00
"Jeśli dostałbyś %1, co byś zrobił?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"(.*) (ma(m|tk)a|stara)(.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 14:42:46 +01:00
"Opowiedz mi więcej o Twojej matce.",
"Jaka jest Twoja relacja z matką?",
"Co czujesz, gdy myślisz o swojej matce?",
"Jak to się ma do tego, jak się dzisiaj czujesz?",
"Dobre relacje w rodzinie są ważne",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-16 20:24:53 +01:00
r"(.*) (tata|ojciec|stary)(.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 14:42:46 +01:00
"Opowiedz mi więcej o Twoim ojcu.",
"Jaka jest Twoja relacja z ojcem?",
"Co czujesz, gdy myślisz o swoim ojcu?",
"Jak to się ma do tego, jak się dzisiaj czujesz?",
"Czy masz problemy z okazywaniem czułości członkom Twojej rodziny?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 14:42:46 +01:00
r"(.*) dziecko(.*)",
2023-03-12 12:40:07 +01:00
(
2023-03-12 14:42:46 +01:00
"Czy jako dziecko miałeś bliskich przyjaciół?",
"Jakie jest Twoje najlepsze wspomnienie z dzieciństwa?",
"Pamiętasz jakieś nawracające sny lub koszmary z dzieciństwa?",
"Czy zdarzało się, aby inne dzieci Cię dręczyły?",
"Jak myślisz, jak twoje doświadczenia z dzieciństwa wpływają na to, jak się dzisiaj czujesz?",
2023-03-12 12:40:07 +01:00
),
),
(
r"(.*)\?",
(
2023-03-12 14:42:46 +01:00
"Dlaczego o to pytasz?",
"Zastanów się, czy sam odpowiesz na to pytanie.",
"Być może znasz już odpowiedź na to pytanie?",
"Dlaczego Ty mi o tym nie opowiesz?",
2023-03-12 12:40:07 +01:00
),
),
(
2023-03-12 14:42:46 +01:00
r"koniec",
2023-03-12 12:40:07 +01:00
(
2023-03-12 14:42:46 +01:00
"Dziękuję za rozmowę.",
"Do widzenia",
"To będzie 150zł. Miłego dnia!",
2023-03-12 12:40:07 +01:00
),
),
2023-03-16 20:24:53 +01:00
(
r"Wiesz co się liczy",
(
"Szacunek ludzi ulicy",
"SZACUNEK LUDZI ULICY",
),
),
(
r"Kamień i skała",
(
"Kamień i skała!",
"Kamień i skała nawieki!",
"Kamień i skała do zgonu!",
"Kamień i skała, nigdy nie jesteś samotny!",
"Skała i kamień... Oj...",
"Kamień i skała, jakby nie było jutra!"
),
),
2023-03-12 12:40:07 +01:00
(
r"(.*)",
(
2023-03-12 14:42:46 +01:00
"Opowiedz mi więcej.",
"Przejdźmy do czegoś innego... Opowiedz mi trochę o swojej rodzinie",
"Czy mógłbyś opowiedzieć mi więcej o tym?",
"Dlaczego mówisz, że %1?",
"Rozumiem.",
"Naprawdę ciekawe.",
2023-03-12 12:40:07 +01:00
"%1.",
2023-03-12 14:42:46 +01:00
"Rozumiem. I co Ci to mówi?",
"Jak to wpływa na Twoje samopoczucie?",
"Jak się czujesz, gdy o tym mówisz?",
),
),
(
r"Ja lubię (.*)",
(
"Jak ważne dla Ciebie jest %1?",
"Dlaczego lubisz %1?",
"Co czujesz, gdy myślisz o %1?",
),
),
(
r"(.*) smutek(.*)",
(
"Czym jest smutek dla Ciebie?",
"Jakie jest twoje najsmutniejsze wspomnienie?",
"Jak często jesteś smutny?",
),
),
(
r"(.*) radość(.*)",
(
"Czym jest radość dla Ciebie?",
"Jakie jest twoje najradośniejsze wspomnienie?",
"Jak często jesteś radosny?",
2023-03-12 12:40:07 +01:00
),
),
)
def eliza_chat():
2023-03-12 14:42:46 +01:00
print("Psychoterapueta\n---------")
print("Rozmawiaj z programem, używając języka polskiego, korzystaj z małych i wielkich liter, a także interpunkcji.\n Wpisz \"koniec\", aby zakończyć.")
2023-03-12 12:40:07 +01:00
print("=" * 72)
2023-03-12 14:42:46 +01:00
print("Dzień dobry. Jak się dzisiaj czujesz?")
2023-03-12 12:40:07 +01:00
eliza_chatbot.converse()
2023-03-16 15:59:40 +01:00
class Chat:
def __init__(self, pairs, reflections={}):
self._pairs = [(re.compile(x, re.IGNORECASE), y) for (x, y) in pairs]
self._reflections = reflections
self._regex = self._compile_reflections()
def _compile_reflections(self):
sorted_refl = sorted(self._reflections, key=len, reverse=True)
return re.compile(
r"\b({})\b".format("|".join(map(re.escape, sorted_refl))), re.IGNORECASE
)
def _substitute(self, str):
return self._regex.sub(
lambda mo: self._reflections[mo.string[mo.start(): mo.end()]], str.lower()
)
2023-03-12 12:40:07 +01:00
2023-03-16 15:59:40 +01:00
def _wildcards(self, response, match):
pos = response.find("%")
while pos >= 0:
num = int(response[pos + 1: pos + 2])
response = (
response[:pos]
+ self._substitute(match.group(num))
+ response[pos + 2:]
)
pos = response.find("%")
return response
2023-03-12 12:40:07 +01:00
2023-03-16 15:59:40 +01:00
def respond(self, str):
2023-03-12 12:40:07 +01:00
2023-03-16 15:59:40 +01:00
# check each pattern
for (pattern, response) in self._pairs:
match = pattern.match(str)
# did the pattern match?
if match:
resp = random.choice(response) # pick a random response
resp = self._wildcards(resp, match) # process wildcards
# fix munged punctuation at the end
if resp[-2:] == "?.":
resp = resp[:-2] + "."
if resp[-2:] == "??":
resp = resp[:-2] + "?"
return resp
# Hold a conversation with a chatbot
def converse(self, quit="koniec"):
user_input = ""
while user_input != "koniec":
user_input = "koniec"
try:
user_input = input(">")
except EOFError:
print(user_input)
if user_input:
while user_input[-1] in "!.":
user_input = user_input[:-1]
print(self.respond(user_input))
eliza_chatbot = Chat(pairs, reflections)
eliza_chat()