455 lines
13 KiB
Python
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() |