diff --git a/eliza_po_polsku.py b/eliza_po_polsku.py index 33115c3..7ecd2ab 100644 --- a/eliza_po_polsku.py +++ b/eliza_po_polsku.py @@ -1,437 +1,437 @@ -from nltk.chat.util import Chat -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", - "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.", - "Rozumiem, a co ci to mówi?", - "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__": +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", + "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.", + "Rozumiem, a co ci to mówi?", + "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() \ No newline at end of file