Generic_DialogSystem/eliza.py
2023-03-17 12:01:28 +01:00

455 lines
13 KiB
Python

import random
import re
reflections = {
"ja jestem": "ty jesteś",
"jestem" : "jesteś",
"ja byłem": "ty byłeś",
"byłem" : "byłeś",
"ja byłam": "ty byłaś",
"byłam" : "byłaś",
"ja": "ty",
"ja będę": "ty będziesz",
"będę" : "będziesz",
"mój": "twój",
"moja": "twoja",
"mi": "ci",
"mnie": "tobie",
"tobie" : "mnie",
"ty jesteś": "ja jestem",
"jesteś" : "jestem",
"ty byłeś": "ja byłem",
"byłeś" : "byłem",
"ty byłaś": "ja byłam",
"byłaś" : "byłam",
"ty": "ja",
"ty będziesz": "ja będę",
"będziesz" : "będę",
"twój": "mój",
"twoja": "moja"
}
pairs = (
(
r"Potrzebuję (.*)",
(
"Dlaczego potrzebujesz %1?",
"Czy naprawdę pomoże Ci posiadanie %1?",
"Jesteś pewny, że potrzebujesz %1?",
),
),
(
r"Dlaczego by nie (.*)",
(
"Naprawdę uważasz, dlaczego by nie %1?",
"Możliwe, że w końcu %1.",
"Naprawdę chcesz abym %1?",
),
),
(
r"Dlaczego nie mogę (.*)",
(
"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ś?",
),
),
(
r"Nie mogę (.*)",
(
"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?",
),
),
(
r"Jestem (.*)",
(
"Czy przyszedłeś do mnie, bo jesteś %1?",
"Jak długo byłeś %1?",
"Jak się czujesz będąc %1?",
),
),
(
r"Jest mi (.*)",
(
"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?",
),
),
(
r"Czy jesteś (.*)",
(
"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?",
),
),
(
r"Co (.*)",
(
"Dlaczego pytasz?",
"W jaki sposób odpowiedź na to pomoże?",
"Co o tym myślisz?",
),
),
(
r"Jak (.*)",
(
"Jak myślisz?",
"Być może sam możesz odpowiedzieć sobie na to pytanie.",
"O co tak naprawdę pytasz?",
),
),
(
r"Ponieważ (.*)",
(
"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ą?",
),
),
(
r"(.*) przepraszam (.*)",
(
"W wielu przypadkach nie trzeba przepraszać",
"Co czujesz kiedy przepraszasz?",
),
),
(
r"Cześć(.*)",
(
"Cześć... Miło że wpadłeś dzisiaj",
"Witaj... Jak się czujesz dzisiaj?",
"Cześć, jak dziś się czujesz?",
),
),
(
r"Myślę, że (.*)",
("Czy wątpisz, że %1?", "Naprawdę tak myślisz?", "Ale nie jesteś pewien, że %1?"),
),
(
r"(.*) przyjaciel (.*)",
(
"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?",
),
),
(r"Tak", ("Zdaje się, że jesteś pewien tego o czym mówisz.", "Ok, mógłyś o tym opowiedzieć trochę więcej?")),
(
r"(.*) komputer(.*)",
(
"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?",
),
),
(
r"To jest (.*)",
(
"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.",
),
),
(
r"To jest (.*)",
(
"Sprawiasz wrażenie, że wiesz o czym mówisz",
"Gdybym stwierdziła, że wcale tak nie jest %1, jakbyś się poczuł/poczuła?",
),
),
(
r"(Czy możesz|Mogłabyś) (.*)",
(
"Dlaczego myślisz, że nie mogę %1?",
"Gdybym mogła %1, to co wtedy?",
"Dlaczego się pytasz, czy mogę %1?",
),
),
(
r"Muszę (.*)",
(
"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?",
),
),
(
r"Ty jesteś (.*)",
(
"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?",
),
),
(
r"Jesteś (.*)",
(
"Dlaczego mówisz, że jestem %1?",
"Jak myślisz, dlaczego jestem %1?",
"Mówimy o tobie, czy o mnie?",
),
),
(
r"Ja nie (.*)",
("Czy naprawdę nie %1?", "Dlaczego nie %1?", "Czy chcesz %1?"),
),
(
r"Czuję (.*)",
(
"Dobrze, opowiedz mi więcej o tych uczuciach.",
"Jak często czujesz %1?",
"Kiedy zwykle czujesz %1?",
"Kiedy czujesz %1, co robisz?",
),
),
(
r"Mam (.*)",
(
"Dlaczego mi mówisz, że masz %1?",
"Czy naprawdę %1?",
"Teraz, gdy masz %1, co zamierzasz zrobić dalej?",
),
),
(
r"Ja bym (.*)",
(
"Czy mógłbyś wyjaśnić dlaczego miałbyś %1?",
"Dlaczego miałbyś %1?",
"Kto inny wie, że byś %1?",
),
),
(
r"Istnieje (.*)",
(
"Czy myślisz, że istnieje %1?",
"Jest to prawdopodobne, że istnieje %1.",
"Chciałbyś żeby w tym miejscu istniało %1?",
),
),
(
r"Mój (.*)",
(
"Widzę, twój %1.",
"Dlaczego twierdzisz, że twój %1?",
"Kiedy twój %1, jak się czujesz?",
),
),
(
r"Ty (.*)",
(
"Powinniśmy rozmawiać o tobie, nie o mnie.",
"Dlaczego tak o mnie mówisz?",
"Co Cię obchodzi, czy ja %1?",
),
),
(r"Dlaczego (.*)", ("Dlaczego nie podasz mi powodu, dla którego %1?", "Dlaczego myślisz że %1?")),
(
r"Ja chcę (.*)",
(
"Jak ważne dla Ciebie jest %1?",
"Dlaczego chcesz %1?",
"Co zrobiłbyś, gdybyś dostał %1?",
"Jeśli dostałbyś %1, co byś zrobił?",
),
),
(
r"(.*) (ma(m|tk)a|stara)(.*)",
(
"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",
),
),
(
r"(.*) (tata|ojciec|stary)(.*)",
(
"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?",
),
),
(
r"(.*) dziecko(.*)",
(
"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?",
),
),
(
r"(.*)\?",
(
"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?",
),
),
(
r"koniec",
(
"Dziękuję za rozmowę.",
"Do widzenia",
"To będzie 150zł. Miłego dnia!",
),
),
(
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!"
),
),
(
r"(.*)",
(
"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.",
"%1.",
"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?",
),
),
)
def eliza_chat():
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ć.")
print("=" * 72)
print("Dzień dobry. Jak się dzisiaj czujesz?")
eliza_chatbot.converse()
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()
)
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
def respond(self, str):
# 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()