2022-03-15 22:53:16 +01:00
|
|
|
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__":
|
2022-03-15 21:57:50 +01:00
|
|
|
demo()
|