import nltk import random import re reflections = { "ja jestem": "ty jesteś", "ja byłem": "ty byłeś", "ja": "ty", "jestem": "jesteś", "chciałbym": "chciałbyś", "mam": "masz", "będę": "będziesz", "moje": "twoje", "mój": "twój", "moja": "twoja", "jesteś": "jestem", "byłeś": "byłem", "ty byłeś": "ja byłem", "będziesz": "będę", "nasze": "wasze", "twoje": "moje", "ty" : "ja", "ja": "ty", "my" : "wy", "jesteśmy": "jesteście", } 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="Do widzenia"): user_input = "" while user_input != quit: user_input = quit 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)) pairs = ( ( r"Potrzebuję (.*)", ( "Dlaczego potrzebujesz %1?", "Czy jesteś pewny, że potrzebujesz %1?", ), ), ( r"Kto cię stworzył (.*)", ( "ELIZA została wynaleziona w 1966 roku przez Weizenbauma. Dlaczego %1?", ), ), ( r"Dlaczego ty (.*)", ( "Czy naprawdę myślisz, że %1?", "Być może w końcu będę %1.", "Czy naprawdę chcesz, żebym %1?", ), ), ( r"Dlaczego ja (.*)", ( "Czy uważasz, że powinieneś być w stanie %1?", "Gdybyś mógł %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?", "Być może mógłbyś, gdybyś spróbował.", "Co byś musiał zrobić, żeby %1?", ), ), ( r"Jestem (.*)", ( "Przyszedłeś do mnie, bo jesteś %1?", "Jak długo jesteś %1?", "Co myślisz o tym, że jesteś %1?", ), ), ( r"Jestem (.*)", ( "Jak się czujesz z tym, że jesteś %1?", "Czy lubisz być %1?", "Dlaczego mówisz mi, że jesteś %1?", "Dlaczego myślisz, że jesteś %1?", ), ), ( r"Czy jesteś (.*)", ( "Dlaczego to ma znaczenie, czy jestem %1?", "Wolałbyś, gdybym nie była %1?", "Być może wierzysz, że jestem %1.", "Mogę być %1 - jak myślisz?", ), ), ( r"Co (.*)", ( "Dlaczego pytasz?", "Jak pomogłaby ci odpowiedź na to?", "Co myślisz?", ), ), ( r"Jak (.*)", ( "Jak ty sądzisz?", "Perhaps you can answer your own question.", "What is it you're really asking?", ), ), ( r"Ponieważ (.*)", ( "Czy to prawdziwy powód?", "Jakie inne powody przychodzą Ci na myśl?”,", "Czy ten powód dotyczy czegokolwiek innego?", "Jeśli %1, co jeszcze musi być prawdą?", ), ), ( r"(.*) przepraszam (.*)", ( "Wiele razy przeprosiny nie są potrzebne.", "Co czujesz kiedy przepraszasz?", ), ), ( r"Cześć(.*)", ( "Cześć... cieszę się, że mogłeś dzisiaj wpaść..", "Cześć... jak się masz dzisiaj?", "Cześć, jak się dzisiaj czujesz?", ), ), ( r"Myśle, że (.*)", ( "Czy wątpisz w %1?", "Naprawdę tak myślisz?", "Ale nie jesteś pewien, że %1?" ), ), ( r"(.*) przyjaciel (.*)", ( "Opowiedz mi więcej o swoich przyjaciołach.", "Kiedy myślisz o przyjacielu, co przychodzi ci na myśl?", "Dlaczego miałbyś nie opowiedzieć o przyjacielu z dzieciństwa?", ), ), ( r"Tak", ( "Wydajesz się całkiem pewien.", "OK, ale czy możesz trochę rozwinąć?" ) ), ( r"(.*) komputer(.*)", ( "Naprawdę mówisz o mnie?", "Czy rozmowa z komputerem wydaje się dziwna?", "Jak się czujesz przy komputerach?", "Czy czujesz się zagrożony przez komputery?", ), ), ( r"To jest (.*)", ( "Czy myślisz, że to %1?", "Może to %1 -- co myślisz?", "Gdyby to był %1, co byś zrobił?", "Może być tak, że %1.", ), ), ( r"Jest to (.*)", ( "Wydajesz się bardzo pewny.", "Gdybym ci powiedziała, że prawdopodobnie nie jest to %1, co byś poczuł?", ), ), ( r"Czy możesz (.*)", ( "Dlaczego myślisz, że nie mogę %1?", "Gdybym mógł %1, to co?", "Dlaczego pytasz, czy mogę %1?", ), ), ( r"Czy mogę (.*)", ( "Być może nie chcesz %1.", "Czy chcesz mieć możliwość %1?", "Gdybyś mógł %1, czy byś?", ), ), ( r"Czy mogę (.*)", ( "Być może nie chcesz %1.", "Czy chcesz mieć możliwość %1?", "Gdybyś mógł %1, czy byś?", ), ), ( r"Ty jesteś (.*)", ( "Jak myślisz, dlaczego jestem %1?", "Czy cieszy cię myśl, że jestem %1?", "Być może chciałbyś, żebym był %1.", "Może 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"Ja czuję (.*)", ( "Dobrze, powiedz mi więcej o tych uczuciach.", "Czy często czujesz %1?", "Kiedy zwykle czujesz %1?", "Kiedy czujesz % 1, co robisz?", ), ), ( r"Mam (.*)", ( "Dlaczego mówisz mi, że masz %1?", "Czy naprawdę masz %1?", "Teraz, kiedy masz %1, co zrobisz dalej?", ), ), ( r"Ja chcę (.*)", ( "Czy możesz wyjaśnić, dlaczego chcesz %1?", "Dlaczego %1?", "Kto jeszcze wie, że chcesz %1?", ), ), ( r"Jest (.*)", ( "Myślisz, że jest %1?", "Prawdopodobnie istnieje %1.", "Czy chciałbyś, aby był %1?", ), ), ( r"Mój (.*)", ( "Rozumiem, twój %1.", "Dlaczego mówisz, ż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?", "Dlaczego obchodzi cię, czy ja %1?", ), ), ( r"Dlaczego (.*)", ( "Powiedz mi dlaczego %1?", "Wydaje ci się że, %1?") ), ( r"Ja chcę (.*)", ( "Co by dla ciebie znaczyło, gdybyś dostał %1?", "Dlaczego chcesz %1?", "Co byś zrobił, gdybyś dostał %1?", "Jeśli masz %1, co byś zrobił?", ), ), ( r"(.*) mama(.*)", ( "Opowiedz mi więcej o twojej mamie.", "Jaka była twoja relacja z mamą?", "Co myślisz o swojej mamie?", "Jak to się ma do twoich dzisiejszych uczuć?", "Dobre relacje z rodziną są ważne.", ), ), ( r"(.*) tata(.*)", ( "Opowiedz mi więcej o twoim tacie.", "Jakie uczucia wzbudzał w tobie twój tata?", "Co myślisz o swoim tacie?", "Czy twoja relacja z tatą ma wpływ na twoje dzisiejsze uczucia?", "Czy masz problemy z okazywaniem uczuć swojej rodzinie?", ), ), ( r"(.*) dziecko(.*)", ( "Miałeś bliskich przyjaciół jako dziecko?", "Jakie jest twoje ulubione wspomnienie z dzieciństwa?", "Pamiętasz jakieś sny lub koszmary z dzieciństwa?", "Czy inne dzieci czasem cię drażniły?", "Jak myślisz, czy doświadczenia z dzieciństwa wpłynęły na twoje dzisiejsze uczucia?", ), ), ( r"(.*)\?", ( "Dlaczego o to pytasz?", "Rozważ proszę, czy byłbyś w stanie odpowiedzieć na swoje pytanie.", "Być może odpowiedź tkwi w tobie?", "Dlaczego nie powiesz?", ), ), ( r"Do widzenia", ( "Dziękuję, że ze mną porozmawiałeś.", "Do widzenia.", "Dziękuję, miłego dnia!", ), ), ( r"(.*)", ( "Opowiedz mi więcej.", "Zmieńmy trochę temat... Opowiedz mi o swojej rodzinie", "Czy możesz to rozwinąć?", "Dlaczego mówisz, że %1?", "Rozumiem.", "Bardzo interesujące.", "%1.Hmm, powiedz coś więcej", "Rozumiem, a co przez to rozumiesz?", "Jak się z tym czujesz?", "Jak się czujesz, kiedy o tym mówisz?", ), ), ) eliza_chatbot = Chat(pairs, reflections) def eliza_chat(): print("Psycholog\n---------") print("Porozmawiaj z programem, wpisując polskie słowa, używając") print('dużych oraz małych liter i znaków interpunkcyjnych.') print('Po zakończeniu wpisz „Do widzenia”') print("=" * 75) print("Dzień dobry. Nazywam się Eliza.\nJak się dzisiaj czujesz?") eliza_chatbot.converse() def demo(): eliza_chat() if __name__ == "__main__": demo()