import random import re #test 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()