restore nltk.chat.util

This commit is contained in:
s444417 2022-03-13 13:36:07 +01:00
commit 099a3b3a1b
6 changed files with 475 additions and 125 deletions

213
.gitignore vendored Normal file
View File

@ -0,0 +1,213 @@
### Python template
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

View File

@ -1,123 +0,0 @@
from nltk.chat.util import Chat
# "cheddar" chatbot
reflections = {
"jestem": "jestes",
"bylem": "byles",
"bylam": "bylas",
"ja": "ty",
"chcialbym": "chcialbys",
"chcialabym": "chcialabys",
"mam": "masz",
"bede": "bedziesz",
"moj": "twoj",
"twoja": "moja",
"moim": "twoim",
"mojego": "twojego",
"jestes": "jestem",
"byles": "bylem",
"masz": "mam",
"bedziesz": "bede",
"twoj": "moj",
"twoim": "moim",
"twojego": "mojego",
"ty": "ja",
"nasz": "wasz",
"moge": "mozesz"
}
pairs = (
(
r"Potrzebuje (.*)",
(
"Dlaczego potrzebujesz %1?",
"Czy naprawdę pomogloby Ci zdobycie %1?",
"Czy jestes pewien, ze potrzebujesz %1?",
),
),
(
r"Dlaczego nie moge (.*)",
(
"Czy uwazasz, ze powinienes moc %1?",
"Gdybys mogl %1, co bys zrobil?",
"Nie wiem, dlaczego nie mozesz %1?",
"Czy naprawde probowales?",
),
),
(
r"Nie moge (.*)",
(
"Skad wiesz, ze nie mozesz %1?",
"Byc moze moglbys %1, gdybys sprobowal.",
"Co musialbys zrobic zeby %1?",
),
),
(
r"Jestem (.*)",
(
"Czy rozmawiasz ze mna poniewaz jestes %1?",
"Od jak dawna jestes %1?",
"Jak sie czujesz z tym, ze jestes %1?",
"Jak sie czujesz bedac %1?",
"Dlaczego mowisz mi, ze jestes %1?",
"Dlaczego uwazasz, ze jestes %1?",
),
),
(
r"Czy jestes (.*)",
(
"Dlaczego ma to znaczenie czy jestem %1?",
"Czy wolabys gdybym nie byl %1?",
"Byc moze uwazasz, ze jestem %1.",
"Byc moze jestem %1, co o tym sadzisz?",
),
),
(
r"Co (.*)",
(
"Dlaczego pytasz?",
"W jaki sposob pomoglaby ci odpowiedz na to pytanie?",
"Co o tym myslisz?",
),
),
(
r"Jak (.*)",
(
"Jak sadzisz?",
"Byc moze potrafisz odpowiedziec na swoje wlasne pytanie.",
"O co tak naprawde pytasz?",
),
),
(
r"Poniewaz (.*)",
(
"Czy to jest prawdziwy powod?",
"Jakie inne powody przychodza Ci na mysl?",
"Czy ten powod odnosi sie do czegos innego?",
"Jesli %1, to co jeszcze musi byc prawda?",
),
),
(
r"quit", (
"Do uslyszenia",
"Czesc"
),
),
(
r"(.*)",
(
"Zmienmy na chwile temat, powiedz mi o swojej rodzinie",
"%1?",
"Dlaczego tak mowisz?",
),
),
)
cheddar = Chat(pairs, reflections)
print("\nNapisz 'quit' aby zakonczyc.")
print("-" * 70)
print("Witaj. Jak sie dzisiaj czujesz?")
cheddar.converse()

View File

@ -1,2 +0,0 @@
from nltk.chat import eliza
eliza.demo()

View File

@ -0,0 +1,137 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"![Logo 1](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech1.jpg)\n",
"<div class=\"alert alert-block alert-info\">\n",
"<h1> Systemy Dialogowe </h1>\n",
"<h2> 1. <i>Rodzaje system\u00f3w dialogowych</i> [laboratoria]</h2> \n",
"<h3> Marek Kubis (2021)</h3>\n",
"</div>\n",
"\n",
"![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Rodzaje system\u00f3w dialogowych\n",
"============================\n",
"\n",
"Wprowadzenie\n",
"------------\n",
"\n",
"Systemy dialogowe mo\u017cna zgrubnie podzieli\u0107 na dwie kategorie <cite>(Jurafsky and Martin, 2020)</cite>:\n",
"\n",
" 1. chatboty,\n",
"\n",
" 2. systemy ukierunkowane na wykonywanie zada\u0144 (ang. task-oriented dialogue agents).\n",
"\n",
"### Chatboty\n",
"Przeznaczeniem chatbota\n",
"jest prowadzenie swobodnej dyskusji z u\u017cytkownikiem na dowolny (nienarzucony z g\u00f3ry) temat.\n",
"Konwersacja z chatbotem nie s\u0142u\u017cy wype\u0142nieniu \u017cadnego z g\u00f3ry okre\u015blonego zadania.\n",
"\n",
"Klasycznym przyk\u0142adem chatbota jest [ELIZA](https://en.wikipedia.org/wiki/ELIZA) <cite>(Weizenbaum, 1966)</cite>.\n",
"Program ten,\n",
"udaj\u0105c psychoanalityka, mia\u0142 zademonstrowa\u0107 potencja\u0142 tkwi\u0105cy w komunikacji cz\u0142owieka z komputerem w\n",
"j\u0119zyku naturalnym. Jego pythonow\u0105 implementacj\u0119 znajdziemy w pakiecie [nltk](www.nltk.org)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from nltk.chat import eliza\n",
"eliza.demo()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"ELIZA sk\u0142ada si\u0119 ze zbioru wzorc\u00f3w, kt\u00f3re s\u0105 dopasowywane do wypowiedzi u\u017cytkownika.\n",
"Z ka\u017cdym wzorcem jest powi\u0105zany zestaw szablon\u00f3w, kt\u00f3re s\u0105 wykorzystywane do przygotowania\n",
"odpowiedzi dla u\u017cytkownika."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"eliza.pairs[:3]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Systemy dialogowe ukierunkowane na wykonywanie zada\u0144\n",
"Systemy ukierunkowane na wykonywanie zada\u0144 b\u0119d\u0105 stanowi\u0107 g\u0142\u00f3wny temat tego przedmiotu.\n",
"Dla uproszenia b\u0119dziemy je nazywa\u0107 *agentami dialogowymi*.\n",
"\n",
"Pierwotnie agenty dialogowe by\u0142y ukierunkowywane na jedno, \u015bci\u015ble okre\u015blone zadanie.\n",
"Systemem tego typu by\u0142 GUS <cite>(Bobrow, 1977)</cite> umo\u017cliwiaj\u0105cy planowanie podr\u00f3\u017cy.\n",
"\n",
"Obecnie zar\u00f3wno w praktyce badawczej jak i w zastosowaniach przemys\u0142owych rozwijane s\u0105 systemy\n",
"ukierunkowane na wykonywanie wielu zada\u0144 r\u00f3wnocze\u015bnie.\n",
"*Inteligentne asystenty osobiste* (ang. *IPA*, *Intelligent Personal Assistant*) takie, jak:\n",
"\n",
" - [Alexa](https://developer.amazon.com/en-US/alexa),\n",
" - [Bixby](http://bixby.samsung.com/),\n",
" - [Google Assistant](https://assistant.google.com/),\n",
" - [Siri](https://www.apple.com/siri/)\n",
"\n",
"realizuj\u0105 wiele cel\u00f3w u\u017cytkownika, do kt\u00f3rych nale\u017c\u0105 m.in.:\n",
"\n",
" - wyszukiwanie kontakt\u00f3w w ksi\u0105\u017cce adresowej,\n",
" - zarz\u0105dzanie kalendarzem,\n",
" - zmiana ustawie\u0144 telefonu.\n",
"\n",
"Zadanie\n",
"-------\n",
"Zaimplementowa\u0107 program typu ELIZA prowadz\u0105cy konwersacj\u0119 w j\u0119zyku polskim.\n",
"Kod \u017ar\u00f3d\u0142owy umie\u015bci\u0107 w ga\u0142\u0119zi `chatbot` repozytorium projektowego.\n",
"\n",
"Literatura\n",
"----------\n",
" 1. Dan Jurafsky and James H. Martin, *Speech and Language Processing*, 3rd ed. draft,\n",
"\tch. 24, Chatbots and Dialogue Systems,\n",
" https://web.stanford.edu/~jurafsky/slp3/24.pdf\n",
" data dost\u0119pu: 14 marca 2021.\n",
"\n",
" 2. J. Weizenbaum, ELIZA - A Computer Program For the Study of Natural Language Communication\n",
" Between Man And Machine Communications of the ACM, Vol 9, No 1, January 1966,\n",
" https://cse.buffalo.edu/~rapaport/572/S02/weizenbaum.eliza.1966.pdf\n",
" data dost\u0119pu: 14 marca 2021.\n",
"\n",
" 3. Bobrow, D. G., Kaplan, R. M., Kay, M., Norman, D. A., Thompson, H., and Winograd, T. (1977).\n",
" GUS, A frame driven dialog system. Artificial Intelligence 8, 155\u2013173."
]
}
],
"metadata": {
"jupytext": {
"cell_metadata_filter": "-all",
"main_language": "python",
"notebook_metadata_filter": "-all"
},
"author": "Marek Kubis",
"email": "mkubis@amu.edu.pl",
"lang": "pl",
"subtitle": "1.Rodzaje system\u00f3w dialogowych[laboratoria]",
"title": "Systemy Dialogowe",
"year": "2021"
},
"nbformat": 4,
"nbformat_minor": 4
}

8
tasks/zad1/cheddar.py Normal file
View File

@ -0,0 +1,8 @@
from nltk.chat.util import Chat
import consts as consts
cheddy = Chat(consts.questions, reflections=consts.reflections)
print("\nNapisz 'quit' aby zakonczyc.")
print("-" * 70)
print("Witaj. Co chcesz mi powiedzieć?")
cheddy.converse()

117
tasks/zad1/consts.py Normal file
View File

@ -0,0 +1,117 @@
# questions and reflections for cheddar chatbot
questions = [(r"Potrzebuję (.*)",
('Czemu potrzebujesz %1?',
'Czy aby na pewno potrzebujesz %1?')),
(r'Jestem (.*)',
('Czy przyszedłeś dziś do mnie, ponieważ jesteś %1?',
'Jak długo jesteś %1?',
'Jak czujesz się z byciem %1?')),
(r'Jesteś (.*)',
('Czemu to ważne, że jestem %1?',
'Chciałbyś, abym nie był %1?',
'Możę to ty uważasz, że jestem %1.',
'Mogę być %1, co o tym sądzisz?',
"Czy rozmawiasz że mną, ponieważ jesteś %1?",
"Od jak dawna jesteś %1?",
"Dlaczego mówisz mi, że jesteś %1?",
"Dlaczego uważasz, że jesteś %1?"
)),
(r'Co (.*)',
('Czemu pytasz?',
'W jaki sposób odpowiedź na to pytania by ci pomogła?',
'A co ty myślisz?')),
(r'Jak (.*)',
('A jak myślisz?',
'Może sam odpowiedz sobie na to pytanie',
"Jakie jest twoje PRAWDZIWE pytanie")),
(r'Ponieważ (.*)',
('Czy to na pewno prawdziwy powód?',
'Jakie inne powody przychodzą ci na myśl?',
'Skoro %1, to jakie inne powody są prawdziwe?')),
(r'(.*) przepraszam (.*)',
('Nie masz za co przepraszać',
'Jakie uczucia masz w sobie, gdy przepraszasz?')),
(r'Myślę, że (.*)',
('Jesteś niepewny co do tego?', 'Naprawdę tak myślisz?', "Ale nie jesteś pewien?")),
(r'Dlaczego (.*)',
("Czemu to ty nie powiesz mi dlaczego %1?", 'Czemu myślisz, że %1?')),
(r'Chcę (.*)',
('Co to by dla ciebie oznaczało, gdybyś to dostał?',
'Czemu chcesz %1?',
'Co byś zrobił, gdybyś dostał %1?',
'Gdybyś dostał %1, to co byś zrobił?')),
(r'(.*)matka(.*)',
('Powiedz mi więcej o swojej matce.',
'Jak wyglądałą relacja z twoją matką?',
'Jakie są twoje uczucia dziś?')),
(r'(.*) ojciec(.*)',
('Powiedz mi więcej o swoim ojcu.',
'Jak twój ojciec sprawia, że się czujesz?')),
(r"Nie mogę (.*)",
("Skąd wiesz, że nie możesz %1?",
"Byc może mogłbyś %1, gdybyś spróbował.",
"Co musialbyś zrobić żeby %1?")),
(r"Czy jesteś (.*)",
("Dlaczego ma to znaczenie czy jestem %1?",
"Czy wolabys gdybym nie był %1?",
"Byc moze uważasz, że jestem %1.",
"Byc moze jestem %1, co o tym sadzisz?",)),
(r"Co (.*)",
("Dlaczego pytasz?",
"W jaki sposob pomogłaby ci odpowiedz na to pytanie?",
"Co o tym myślisz?",)),
(r"Jak (.*)",
("Jak sadzisz?",
"Byc moze potrafisz odpowiedziec na swoje wlasne pytanie.",
"O co tak naprawde pytasz?",)),
(r"Poniewaz (.*)",
("Czy to jest prawdziwy powod?",
"Jakie inne powody przychodzą Ci na myśl?",
"Czy ten powod odnosibędącdo czegoś innego?",
"Jesli %1, to co jeszcze musi byc prawda?",
)),
(r'quit',
('Do usłyszenia!',
'Miłego dnia!',)),
(r'(.*)\?',
('Być może odpowiedź jest w tobie?',
'Czemu to TY nie powiesz MI?',
"Czemu o to pytasz?")),
(r'(.*)',
('Proszę, powiedz mi więcej',
"Zmieńmy temat... opowiedz mi o swojej rodzinie.",
'Możesz rozwinąć?',
'Możesz powiedzieć mi więcej o %1?',
'Rozumiem.',
'To bardzo interesujące',
'Rozumiem.. i co Ci to mówi?',
'Jakie uczucia to w tobie wywołuje?',
'Jak się czujesz, mówiąc to?')),
]
reflections = {
"jestem": "jesteś",
"byłem": "byłeś",
"byłam": "byłaś",
"ja": "ty",
"chciałbym": "chciałbyś",
"chciałabym": "chciałabyś",
"mam": "masz",
"będę": "będziesz",
"mój": "twój",
"twoja": "moja",
"moim": "twoim",
"mojego": "twojego",
"jesteś": "jestem",
"byleś": "byłem",
"masz": "mam",
"będziesz": "będę",
"twój": "mój",
"twoim": "moim",
"twojego": "mojego",
"ty": "ja",
"nasz": "wasz",
"mogę": "możesz",
"mnie": "cię"
}