Chatbot ELIZA po polsku

This commit is contained in:
Kornelia Girejko 2022-03-15 22:08:52 +01:00
parent ca0c96f3cf
commit 83ab22dbe3

View File

@ -1,437 +1,437 @@
from nltk.chat.util import Chat import nltk
import random import random
import re import re
reflections = { reflections = {
"ja jestem": "ty jesteś", "ja jestem": "ty jesteś",
"ja byłem": "ty byłeś", "ja byłem": "ty byłeś",
"ja": "ty", "ja": "ty",
"jestem": "jesteś", "jestem": "jesteś",
"chciałbym": "chciałbyś", "chciałbym": "chciałbyś",
"mam": "masz", "mam": "masz",
"będę": "będziesz", "będę": "będziesz",
"moje": "twoje", "moje": "twoje",
"jesteś": "jestem", "jesteś": "jestem",
"byłeś": "byłem", "byłeś": "byłem",
"ty byłeś": "ja byłem", "ty byłeś": "ja byłem",
"będziesz": "będę", "będziesz": "będę",
"nasze": "wasze", "nasze": "wasze",
"twoje": "moje", "twoje": "moje",
"ty" : "ja", "ty" : "ja",
"ja": "ty", "ja": "ty",
"my" : "wy", "my" : "wy",
"jesteśmy": "jesteście", "jesteśmy": "jesteście",
} }
class Chat: class Chat:
def __init__(self, pairs, reflections={}): def __init__(self, pairs, reflections={}):
self._pairs = [(re.compile(x, re.IGNORECASE), y) for (x, y) in pairs] self._pairs = [(re.compile(x, re.IGNORECASE), y) for (x, y) in pairs]
self._reflections = reflections self._reflections = reflections
self._regex = self._compile_reflections() self._regex = self._compile_reflections()
def _compile_reflections(self): def _compile_reflections(self):
sorted_refl = sorted(self._reflections, key=len, reverse=True) sorted_refl = sorted(self._reflections, key=len, reverse=True)
return re.compile( return re.compile(
r"\b({})\b".format("|".join(map(re.escape, sorted_refl))), re.IGNORECASE r"\b({})\b".format("|".join(map(re.escape, sorted_refl))), re.IGNORECASE
) )
def _substitute(self, str): def _substitute(self, str):
return self._regex.sub( return self._regex.sub(
lambda mo: self._reflections[mo.string[mo.start() : mo.end()]], str.lower() lambda mo: self._reflections[mo.string[mo.start() : mo.end()]], str.lower()
) )
def _wildcards(self, response, match): def _wildcards(self, response, match):
pos = response.find("%") pos = response.find("%")
while pos >= 0: while pos >= 0:
num = int(response[pos + 1 : pos + 2]) num = int(response[pos + 1 : pos + 2])
response = ( response = (
response[:pos] response[:pos]
+ self._substitute(match.group(num)) + self._substitute(match.group(num))
+ response[pos + 2 :] + response[pos + 2 :]
) )
pos = response.find("%") pos = response.find("%")
return response return response
def respond(self, str): def respond(self, str):
# check each pattern # check each pattern
for (pattern, response) in self._pairs: for (pattern, response) in self._pairs:
match = pattern.match(str) match = pattern.match(str)
# did the pattern match? # did the pattern match?
if match: if match:
resp = random.choice(response) # pick a random response resp = random.choice(response) # pick a random response
resp = self._wildcards(resp, match) # process wildcards resp = self._wildcards(resp, match) # process wildcards
# fix munged punctuation at the end # fix munged punctuation at the end
if resp[-2:] == "?.": if resp[-2:] == "?.":
resp = resp[:-2] + "." resp = resp[:-2] + "."
if resp[-2:] == "??": if resp[-2:] == "??":
resp = resp[:-2] + "?" resp = resp[:-2] + "?"
return resp return resp
# Hold a conversation with a chatbot # Hold a conversation with a chatbot
def converse(self, quit="Do widzenia"): def converse(self, quit="Do widzenia"):
user_input = "" user_input = ""
while user_input != quit: while user_input != quit:
user_input = quit user_input = quit
try: try:
user_input = input(">") user_input = input(">")
except EOFError: except EOFError:
print(user_input) print(user_input)
if user_input: if user_input:
while user_input[-1] in "!.": while user_input[-1] in "!.":
user_input = user_input[:-1] user_input = user_input[:-1]
print(self.respond(user_input)) print(self.respond(user_input))
pairs = ( pairs = (
( (
r"Potrzebuję (.*)", r"Potrzebuję (.*)",
( (
"Dlaczego potrzebujesz %1?", "Dlaczego potrzebujesz %1?",
"Czy jesteś pewny, że potrzebujesz %1?", "Czy jesteś pewny, że potrzebujesz %1?",
), ),
), ),
( (
r"Kto cię stworzył (.*)", r"Kto cię stworzył (.*)",
( (
"ELIZA została wynaleziona w 1966 roku przez Weizenbauma. Dlaczego %1?", "ELIZA została wynaleziona w 1966 roku przez Weizenbauma. Dlaczego %1?",
), ),
), ),
( (
r"Dlaczego ty (.*)", r"Dlaczego ty (.*)",
( (
"Czy naprawdę myślisz, że %1?", "Czy naprawdę myślisz, że %1?",
"Być może w końcu będę %1.", "Być może w końcu będę %1.",
"Czy naprawdę chcesz, żebym %1?", "Czy naprawdę chcesz, żebym %1?",
), ),
), ),
( (
r"Dlaczego ja (.*)", r"Dlaczego ja (.*)",
( (
"Czy uważasz, że powinieneś być w stanie %1?", "Czy uważasz, że powinieneś być w stanie %1?",
"Gdybyś mógł %1, co byś zrobił?", "Gdybyś mógł %1, co byś zrobił?",
"Nie wiem -- dlaczego nie możesz %1?", "Nie wiem -- dlaczego nie możesz %1?",
"Czy naprawdę próbowałeś?", "Czy naprawdę próbowałeś?",
), ),
), ),
( (
r"Nie mogę (.*)", r"Nie mogę (.*)",
( (
"Skąd wiesz, że nie możesz %1?", "Skąd wiesz, że nie możesz %1?",
"Być może mógłbyś, gdybyś spróbował.", "Być może mógłbyś, gdybyś spróbował.",
"Co byś musiał zrobić, żeby %1?", "Co byś musiał zrobić, żeby %1?",
), ),
), ),
( (
r"Jestem (.*)", r"Jestem (.*)",
( (
"Przyszedłeś do mnie, bo jesteś %1?", "Przyszedłeś do mnie, bo jesteś %1?",
"Jak długo jesteś %1?", "Jak długo jesteś %1?",
"Co myślisz o tym, że jesteś %1?", "Co myślisz o tym, że jesteś %1?",
), ),
), ),
( (
r"Jestem (.*)", r"Jestem (.*)",
( (
"Jak się czujesz z tym, że jesteś %1?", "Jak się czujesz z tym, że jesteś %1?",
"Czy lubisz być %1?", "Czy lubisz być %1?",
"Dlaczego mówisz mi, że jesteś %1?", "Dlaczego mówisz mi, że jesteś %1?",
"Dlaczego myślisz, że jesteś %1?", "Dlaczego myślisz, że jesteś %1?",
), ),
), ),
( (
r"Czy jesteś (.*)", r"Czy jesteś (.*)",
( (
"Dlaczego to ma znaczenie, czy jestem %1?", "Dlaczego to ma znaczenie, czy jestem %1?",
"Wolałbyś, gdybym nie była %1?", "Wolałbyś, gdybym nie była %1?",
"Być może wierzysz, że jestem %1.", "Być może wierzysz, że jestem %1.",
"Mogę być %1 - jak myślisz?", "Mogę być %1 - jak myślisz?",
), ),
), ),
( (
r"Co (.*)", r"Co (.*)",
( (
"Dlaczego pytasz?", "Dlaczego pytasz?",
"Jak pomogłaby ci odpowiedź na to?", "Jak pomogłaby ci odpowiedź na to?",
"Co myślisz?", "Co myślisz?",
), ),
), ),
( (
r"Jak (.*)", r"Jak (.*)",
( (
"Jak ty sądzisz?", "Jak ty sądzisz?",
"Perhaps you can answer your own question.", "Perhaps you can answer your own question.",
"What is it you're really asking?", "What is it you're really asking?",
), ),
), ),
( (
r"Ponieważ (.*)", r"Ponieważ (.*)",
( (
"Czy to prawdziwy powód?", "Czy to prawdziwy powód?",
"Jakie inne powody przychodzą Ci na myśl?”,", "Jakie inne powody przychodzą Ci na myśl?”,",
"Czy ten powód dotyczy czegokolwiek innego?", "Czy ten powód dotyczy czegokolwiek innego?",
"Jeśli %1, co jeszcze musi być prawdą?", "Jeśli %1, co jeszcze musi być prawdą?",
), ),
), ),
( (
r"(.*) przepraszam (.*)", r"(.*) przepraszam (.*)",
( (
"Wiele razy przeprosiny nie są potrzebne.", "Wiele razy przeprosiny nie są potrzebne.",
"Co czujesz kiedy przepraszasz?", "Co czujesz kiedy przepraszasz?",
), ),
), ),
( (
r"Cześć(.*)", r"Cześć(.*)",
( (
"Cześć... cieszę się, że mogłeś dzisiaj wpaść..", "Cześć... cieszę się, że mogłeś dzisiaj wpaść..",
"Cześć... jak się masz dzisiaj?", "Cześć... jak się masz dzisiaj?",
"Cześć, jak się dzisiaj czujesz?", "Cześć, jak się dzisiaj czujesz?",
), ),
), ),
( (
r"Myśle, że (.*)", r"Myśle, że (.*)",
( (
"Czy wątpisz w %1?", "Czy wątpisz w %1?",
"Naprawdę tak myślisz?", "Naprawdę tak myślisz?",
"Ale nie jesteś pewien, że %1?" "Ale nie jesteś pewien, że %1?"
), ),
), ),
( (
r"(.*) przyjaciel (.*)", r"(.*) przyjaciel (.*)",
( (
"Opowiedz mi więcej o swoich przyjaciołach.", "Opowiedz mi więcej o swoich przyjaciołach.",
"Kiedy myślisz o przyjacielu, co przychodzi ci na myśl?", "Kiedy myślisz o przyjacielu, co przychodzi ci na myśl?",
"Dlaczego miałbyś nie opowiedzieć o przyjacielu z dzieciństwa?", "Dlaczego miałbyś nie opowiedzieć o przyjacielu z dzieciństwa?",
), ),
), ),
( (
r"Tak", r"Tak",
( (
"Wydajesz się całkiem pewien.", "OK, ale czy możesz trochę rozwinąć?" "Wydajesz się całkiem pewien.", "OK, ale czy możesz trochę rozwinąć?"
) )
), ),
( (
r"(.*) komputer(.*)", r"(.*) komputer(.*)",
( (
"Naprawdę mówisz o mnie?", "Naprawdę mówisz o mnie?",
"Czy rozmowa z komputerem wydaje się dziwna?", "Czy rozmowa z komputerem wydaje się dziwna?",
"Jak się czujesz przy komputerach?", "Jak się czujesz przy komputerach?",
"Czy czujesz się zagrożony przez komputery?", "Czy czujesz się zagrożony przez komputery?",
), ),
), ),
( (
r"To jest (.*)", r"To jest (.*)",
( (
"Czy myślisz, że to %1?", "Czy myślisz, że to %1?",
"Może to %1 -- co myślisz?", "Może to %1 -- co myślisz?",
"Gdyby to był %1, co byś zrobił?", "Gdyby to był %1, co byś zrobił?",
"Może być tak, że %1.", "Może być tak, że %1.",
), ),
), ),
( (
r"Jest to (.*)", r"Jest to (.*)",
( (
"Wydajesz się bardzo pewny.", "Wydajesz się bardzo pewny.",
"Gdybym ci powiedziała, że prawdopodobnie nie jest to %1, co byś poczuł?", "Gdybym ci powiedziała, że prawdopodobnie nie jest to %1, co byś poczuł?",
), ),
), ),
( (
r"Czy możesz (.*)", r"Czy możesz (.*)",
( (
"Dlaczego myślisz, że nie mogę %1?", "Dlaczego myślisz, że nie mogę %1?",
"Gdybym mógł %1, to co?", "Gdybym mógł %1, to co?",
"Dlaczego pytasz, czy mogę %1?", "Dlaczego pytasz, czy mogę %1?",
), ),
), ),
( (
r"Czy mogę (.*)", r"Czy mogę (.*)",
( (
"Być może nie chcesz %1.", "Być może nie chcesz %1.",
"Czy chcesz mieć możliwość %1?", "Czy chcesz mieć możliwość %1?",
"Gdybyś mógł %1, czy byś?", "Gdybyś mógł %1, czy byś?",
), ),
), ),
( (
r"Czy mogę (.*)", r"Czy mogę (.*)",
( (
"Być może nie chcesz %1.", "Być może nie chcesz %1.",
"Czy chcesz mieć możliwość %1?", "Czy chcesz mieć możliwość %1?",
"Gdybyś mógł %1, czy byś?", "Gdybyś mógł %1, czy byś?",
), ),
), ),
( (
r"Ty jesteś (.*)", r"Ty jesteś (.*)",
( (
"Jak myślisz, dlaczego jestem %1?", "Jak myślisz, dlaczego jestem %1?",
"Czy cieszy cię myśl, że jestem %1?", "Czy cieszy cię myśl, że jestem %1?",
"Być może chciałbyś, żebym był %1.", "Być może chciałbyś, żebym był %1.",
"Może naprawdę mówisz o sobie?", "Może naprawdę mówisz o sobie?",
), ),
), ),
( (
r"Jesteś (.*)", r"Jesteś (.*)",
( (
"Dlaczego mówisz, że jestem %1?", "Dlaczego mówisz, że jestem %1?",
"Jak myślisz, dlaczego jestem %1?", "Jak myślisz, dlaczego jestem %1?",
"Mówimy o tobie, czy o mnie?", "Mówimy o tobie, czy o mnie?",
), ),
), ),
( (
r"Ja nie (.*)", r"Ja nie (.*)",
("Czy naprawdę nie %1?", "Dlaczego nie %1?", "Czy chcesz %1?"), ("Czy naprawdę nie %1?", "Dlaczego nie %1?", "Czy chcesz %1?"),
), ),
( (
r"Ja czuję (.*)", r"Ja czuję (.*)",
( (
"Dobrze, powiedz mi więcej o tych uczuciach.", "Dobrze, powiedz mi więcej o tych uczuciach.",
"Czy często czujesz %1?", "Czy często czujesz %1?",
"Kiedy zwykle czujesz %1?", "Kiedy zwykle czujesz %1?",
"Kiedy czujesz % 1, co robisz?", "Kiedy czujesz % 1, co robisz?",
), ),
), ),
( (
r"Mam (.*)", r"Mam (.*)",
( (
"Dlaczego mówisz mi, że masz %1?", "Dlaczego mówisz mi, że masz %1?",
"Czy naprawdę masz %1?", "Czy naprawdę masz %1?",
"Teraz, kiedy masz %1, co zrobisz dalej?", "Teraz, kiedy masz %1, co zrobisz dalej?",
), ),
), ),
( (
r"Ja chcę (.*)", r"Ja chcę (.*)",
( (
"Czy możesz wyjaśnić, dlaczego chcesz %1?", "Czy możesz wyjaśnić, dlaczego chcesz %1?",
"Dlaczego %1?", "Dlaczego %1?",
"Kto jeszcze wie, że chcesz %1?", "Kto jeszcze wie, że chcesz %1?",
), ),
), ),
( (
r"Jest (.*)", r"Jest (.*)",
( (
"Myślisz, że jest %1?", "Myślisz, że jest %1?",
"Prawdopodobnie istnieje %1.", "Prawdopodobnie istnieje %1.",
"Czy chciałbyś, aby był %1?", "Czy chciałbyś, aby był %1?",
), ),
), ),
( (
r"Mój (.*)", r"Mój (.*)",
( (
"Rozumiem, twój %1.", "Rozumiem, twój %1.",
"Dlaczego mówisz, że twój %1?", "Dlaczego mówisz, że twój %1?",
"Kiedy Twój %1, jak się czujesz?", "Kiedy Twój %1, jak się czujesz?",
), ),
), ),
( (
r"Ty (.*)", r"Ty (.*)",
( (
"Powinniśmy rozmawiać o Tobie, nie o mnie.", "Powinniśmy rozmawiać o Tobie, nie o mnie.",
"Dlaczego tak o mnie mówisz?", "Dlaczego tak o mnie mówisz?",
"Dlaczego obchodzi cię, czy ja %1?", "Dlaczego obchodzi cię, czy ja %1?",
), ),
), ),
( (
r"Dlaczego (.*)", r"Dlaczego (.*)",
( (
"Powiedz mi dlaczego %1?", "Powiedz mi dlaczego %1?",
"Wydaje ci się że, %1?") "Wydaje ci się że, %1?")
), ),
( (
r"Ja chcę (.*)", r"Ja chcę (.*)",
( (
"Co by dla ciebie znaczyło, gdybyś dostał %1?", "Co by dla ciebie znaczyło, gdybyś dostał %1?",
"Dlaczego chcesz %1?", "Dlaczego chcesz %1?",
"Co byś zrobił, gdybyś dostał %1?", "Co byś zrobił, gdybyś dostał %1?",
"Jeśli masz %1, co byś zrobił?", "Jeśli masz %1, co byś zrobił?",
), ),
), ),
( (
r"(.*) mama(.*)", r"(.*) mama(.*)",
( (
"Opowiedz mi więcej o twojej mamie.", "Opowiedz mi więcej o twojej mamie.",
"Jaka była twoja relacja z mamą?", "Jaka była twoja relacja z mamą?",
"Co myślisz o swojej mamie?", "Co myślisz o swojej mamie?",
"Jak to się ma do twoich dzisiejszych uczuć?", "Jak to się ma do twoich dzisiejszych uczuć?",
"Dobre relacje z rodziną są ważne.", "Dobre relacje z rodziną są ważne.",
), ),
), ),
( (
r"(.*) tata(.*)", r"(.*) tata(.*)",
( (
"Opowiedz mi więcej o twoim tacie.", "Opowiedz mi więcej o twoim tacie.",
"Jakie uczucia wzbudzał w tobie twój tata?", "Jakie uczucia wzbudzał w tobie twój tata?",
"Co myślisz o swoim tacie?", "Co myślisz o swoim tacie?",
"Czy twoja relacja z tatą ma wpływ na twoje dzisiejsze uczucia?", "Czy twoja relacja z tatą ma wpływ na twoje dzisiejsze uczucia?",
"Czy masz problemy z okazywaniem uczuć swojej rodzinie?", "Czy masz problemy z okazywaniem uczuć swojej rodzinie?",
), ),
), ),
( (
r"(.*) dziecko(.*)", r"(.*) dziecko(.*)",
( (
"Miałeś bliskich przyjaciół jako dziecko?", "Miałeś bliskich przyjaciół jako dziecko?",
"Jakie jest twoje ulubione wspomnienie z dzieciństwa?", "Jakie jest twoje ulubione wspomnienie z dzieciństwa?",
"Pamiętasz jakieś sny lub koszmary z dzieciństwa?", "Pamiętasz jakieś sny lub koszmary z dzieciństwa?",
"Czy inne dzieci czasem cię drażniły?", "Czy inne dzieci czasem cię drażniły?",
"Jak myślisz, czy doświadczenia z dzieciństwa wpłynęły na twoje dzisiejsze uczucia?", "Jak myślisz, czy doświadczenia z dzieciństwa wpłynęły na twoje dzisiejsze uczucia?",
), ),
), ),
( (
r"(.*)\?", r"(.*)\?",
( (
"Dlaczego o to pytasz?", "Dlaczego o to pytasz?",
"Rozważ proszę, czy byłbyś w stanie odpowiedzieć na swoje pytanie.", "Rozważ proszę, czy byłbyś w stanie odpowiedzieć na swoje pytanie.",
"Być może odpowiedź tkwi w tobie?", "Być może odpowiedź tkwi w tobie?",
"Dlaczego nie powiesz?", "Dlaczego nie powiesz?",
), ),
), ),
( (
r"Do widzenia", r"Do widzenia",
( (
"Dziękuję, że ze mną porozmawiałeś.", "Dziękuję, że ze mną porozmawiałeś.",
"Do widzenia.", "Do widzenia.",
"Dziękuję, miłego dnia!", "Dziękuję, miłego dnia!",
), ),
), ),
( (
r"(.*)", r"(.*)",
( (
"Opowiedz mi więcej.", "Opowiedz mi więcej.",
"Zmieńmy trochę temat... Opowiedz mi o swojej rodzinie", "Zmieńmy trochę temat... Opowiedz mi o swojej rodzinie",
"Czy możesz to rozwinąć?", "Czy możesz to rozwinąć?",
"Dlaczego mówisz, że %1?", "Dlaczego mówisz, że %1?",
"Rozumiem.", "Rozumiem.",
"Bardzo interesujące.", "Bardzo interesujące.",
"%1.", "%1.",
"Rozumiem, a co ci to mówi?", "Rozumiem, a co ci to mówi?",
"Jak się z tym czujesz?", "Jak się z tym czujesz?",
"Jak się czujesz, kiedy o tym mówisz?", "Jak się czujesz, kiedy o tym mówisz?",
), ),
), ),
) )
eliza_chatbot = Chat(pairs, reflections) eliza_chatbot = Chat(pairs, reflections)
def eliza_chat(): def eliza_chat():
print("Psycholog\n---------") print("Psycholog\n---------")
print("Porozmawiaj z programem, wpisując polskie słowa, używając") print("Porozmawiaj z programem, wpisując polskie słowa, używając")
print('dużych oraz małych liter i znaków interpunkcyjnych.') print('dużych oraz małych liter i znaków interpunkcyjnych.')
print('Po zakończeniu wpisz „Do widzenia”') print('Po zakończeniu wpisz „Do widzenia”')
print("=" * 75) print("=" * 75)
print("Dzień dobry. Nazywam się Eliza.\nJak się dzisiaj czujesz?") print("Dzień dobry. Nazywam się Eliza.\nJak się dzisiaj czujesz?")
eliza_chatbot.converse() eliza_chatbot.converse()
def demo(): def demo():
eliza_chat() eliza_chat()
if __name__ == "__main__": if __name__ == "__main__":
demo() demo()