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 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()