This commit is contained in:
Adrian 2022-06-14 12:57:51 +02:00
parent d5ec325b36
commit 9322052b18
9 changed files with 1129 additions and 906 deletions

View File

@ -0,0 +1,426 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": null,
"id": "explicit-slovak",
"metadata": {},
"outputs": [],
"source": [
"%%writefile ./grammar/hello.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar hello;\n",
"\n",
"public <hello> = <words_hello>;\n",
"\n",
"<words_hello> = czesc | hej | witaj | hey | hello | dzień dobry | siema | siemanko;"
]
},
{
"cell_type": "code",
"execution_count": 16,
"id": "upset-brunswick",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing ./grammar/bye.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/bye.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar bye;\n",
"\n",
"public <bye> = <words_bye>;\n",
"\n",
"<words_bye> = do usłyszenia | do widzenia | do zobaczenia | na razie | bye | zegnaj | nara | musze juz isc;\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"id": "amateur-format",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/repertuar.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/repertuar.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar repertuar;\n",
"\n",
"public <repertuar> = <prosba> [aktualny | obecny | aktualnie | obecnie | teraz] [repertuar];\n",
"\n",
"<prosba> = prosze podac | podaj | jaki jest | co [teraz] gracie | co leci | jakie sa filmy | jakie filmy gracie;\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "dressed-judge",
"metadata": {},
"outputs": [],
"source": [
"%%writefile ./grammar/cancel.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar cancel;\n",
"\n",
"public <odwolaj> = <prosba> <anulacja>;\n",
"\n",
"<prosba> = chce | chcialbym | chcialabym | prosze;\n",
"\n",
"<anulacja> = odwolac | zrezygnowac | anulowac ([bilety]|[bilet]|[z biletow]|[rezerwacje]|[z rezerwacji]);"
]
},
{
"cell_type": "code",
"execution_count": 25,
"id": "automated-friendship",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/book.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/book.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar book;\n",
"\n",
"public <rezerwuj> = <prosba> [<ilosc_biletow>] [<tytul_filmu>] [<dzien_rezerwacji>] [<godzina_rezerwacji>];\n",
"\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n",
"<ilosc_biletow> = <liczba> {ilosc} (bilety | biletow | bilet);\n",
"\n",
"<liczba> = jeden | dwa | trzy | cztery | piec | szesc | siedem | osiem | dziewiec | dziesiec |1|2|3|4|5|6|7|8|9|10;\n",
"\n",
"<tytul_filmu> = na [film] <tytul> {tytul};\n",
"\n",
"<tytul> = Batman | Batmana | Uncharted | Pitbull | Ambulans | Bunkier strachu | Corka | Corke | Inni ludzie | Śmierć na Nilu | Skarb Mikołajka;\n",
"\n",
"<dzien_rezerwacji> = na <dzien> {dzien};\n",
"\n",
"<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;\n",
"\n",
"<data> = (8|9|10|11|12|13|14|15) [czerwca]; \n",
"\n",
"<godzina_rezerwacji> = na [godzinę] <godzina_z_minutami> {godzina};\n",
"\n",
"<godzina_z_minutami> = <godzina> [<minuty>];\n",
"\n",
"<godzina> = 10|11|12|13|14|15|16|17|18|19|20|21|22|23 | dziesiata | jedenasta | dwunasta | trzynasta | czternasta | pietnasta | szesnasta | siedemnasta | osiemnasta | dziewietnasta | dwudziesta;\n",
"\n",
"<minuty> = pietnaście | trzydzieści | czterdziesci piec| 15 | 30 | 45;"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "attended-portugal",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/ilosc_bil.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/ilosc_bil.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar ilosc_bil;\n",
"\n",
"public <ilosc_bil> = [<prosba>] [<ilosc_biletow>];\n",
"\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n",
"<ilosc_biletow> = <liczba> {ilosc} [(bilety | biletow | bilet)];\n",
"\n",
"<liczba> = jeden | dwa | trzy | cztery | piec | szesc | siedem | osiem | dziewiec | dziesiec |1|2|3|4|5|6|7|8|9|10;\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"id": "floating-lender",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/tyt_filmu.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/tyt_filmu.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar tyt_filmu;\n",
"\n",
"public <tyt_filmu> = [<prosba>] [<tytul_filmu>];\n",
"\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n",
"<tytul_filmu> = [na] [film] <tytul> {tytul};\n",
"\n",
"<tytul> = Batman | Batmana | Uncharted | Pitbull | Ambulans | Bunkier strachu | Corka | Corke | Inni ludzie | Śmierć na Nilu | Skarb Mikołajka;"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "indirect-edward",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/dni.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/dni.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar dni;\n",
"\n",
"public <dni> = [<prosba>] [<dzien_rezerwacji>];\n",
"\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n",
"<dzien_rezerwacji> = na <dzien> {dzien};\n",
"\n",
"<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;\n",
"\n",
"<data> = (15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30) [czerwca]; \n"
]
},
{
"cell_type": "code",
"execution_count": 18,
"id": "continental-syria",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/godziny.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/godziny.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar godziny;\n",
"\n",
"public <godziny> = [<prosba>] <godzina_rezerwacji>;\n",
"\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n",
"<godzina_rezerwacji> = na [godzine] <godzina_z_minutami> {godzina};\n",
"\n",
"<godzina_z_minutami> = <godzina> [<minuty>];\n",
"\n",
"<godzina> = 10|11|12|13|14|15|16|17|18|19|20|21|22|23 | dziesiata | jedenasta | dwunasta | trzynasta | czternasta | pietnasta | szesnasta | siedemnasta | osiemnasta | dziewietnasta | dwudziesta;\n",
"\n",
"<minuty> = pietnaście | trzydzieści | czterdziesci piec| 15 | 30 | 45;"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "everyday-sullivan",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/miejsca.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/miejsca.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar miejsca;\n",
"\n",
"public <miejsca> = [z | na | w] <miejsce> {miejsce};\n",
"\n",
"<miejsce> = dole | gorze | srodku | tylu | blizej | przodu;\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"id": "unexpected-vietnamese",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/nr_tel.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/nr_tel.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar numer;\n",
"\n",
"public <numer> = <nr> {numer};\n",
"\n",
"<nr> = <cyfra>+;\n",
"\n",
"<cyfra> = 0|1|2|3|4|5|6|7|8|9\n"
]
},
{
"cell_type": "code",
"execution_count": 15,
"id": "annual-bridge",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/bye.jsgf\n"
]
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "warming-pharmaceutical",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "upset-inclusion",
"metadata": {},
"outputs": [],
"source": [
"!jupyter nbconvert --to script MST.ipynb"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "absolute-banana",
"metadata": {},
"outputs": [],
"source": [
"!jupyter nbconvert --to script AJN_final.ipynb"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "static-science",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "loose-championship",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "emerging-conviction",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "polished-identification",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "unexpected-quarter",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "minus-archive",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -3,7 +3,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "completed-luxury", "id": "explicit-slovak",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -17,10 +17,35 @@
"<words_hello> = czesc | hej | witaj | hey | hello | dzień dobry | siema | siemanko;" "<words_hello> = czesc | hej | witaj | hey | hello | dzień dobry | siema | siemanko;"
] ]
}, },
{
"cell_type": "code",
"execution_count": 16,
"id": "upset-brunswick",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Writing ./grammar/bye.jsgf\n"
]
}
],
"source": [
"%%writefile ./grammar/bye.jsgf\n",
"#JSGF V1.0 UTF-8 pl;\n",
"\n",
"grammar bye;\n",
"\n",
"public <bye> = <words_bye>;\n",
"\n",
"<words_bye> = do usłyszenia | do widzenia | do zobaczenia | na razie | bye | zegnaj | nara | musze juz isc;\n"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 26, "execution_count": 26,
"id": "stable-teacher", "id": "amateur-format",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -47,7 +72,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "broken-typing", "id": "dressed-judge",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -66,7 +91,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 25, "execution_count": 25,
"id": "moving-dictionary", "id": "automated-friendship",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -113,7 +138,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 15, "execution_count": 15,
"id": "democratic-vietnamese", "id": "attended-portugal",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -142,7 +167,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 24, "execution_count": 24,
"id": "valid-provincial", "id": "floating-lender",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -170,8 +195,8 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 23, "execution_count": 1,
"id": "declared-vessel", "id": "indirect-edward",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -196,13 +221,13 @@
"\n", "\n",
"<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;\n", "<dzien> = (dzisiaj | jutro | poniedziałek | wtorek | srode | czwartek | piatek | sobotę | niedziele) | <data>;\n",
"\n", "\n",
"<data> = (8|9|10|11|12|13|14|15) [czerwca]; \n" "<data> = (15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30) [czerwca]; \n"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 21, "execution_count": 18,
"id": "animated-guarantee", "id": "continental-syria",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -219,11 +244,11 @@
"\n", "\n",
"grammar godziny;\n", "grammar godziny;\n",
"\n", "\n",
"public <godziny> = [<prosba>] [<godzina_rezerwacji>];\n", "public <godziny> = [<prosba>] <godzina_rezerwacji>;\n",
"\n", "\n",
"<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n", "<prosba> = (chce | chcialbym | chcialabym | poprosze) [zarezerwowac];\n",
"\n", "\n",
"<godzina_rezerwacji> = na [godzinę] <godzina_z_minutami> {godzina};\n", "<godzina_rezerwacji> = na [godzine] <godzina_z_minutami> {godzina};\n",
"\n", "\n",
"<godzina_z_minutami> = <godzina> [<minuty>];\n", "<godzina_z_minutami> = <godzina> [<minuty>];\n",
"\n", "\n",
@ -235,7 +260,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 7, "execution_count": 7,
"id": "registered-product", "id": "everyday-sullivan",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -259,8 +284,8 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 12,
"id": "neutral-thumbnail", "id": "unexpected-vietnamese",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
@ -279,130 +304,39 @@
"\n", "\n",
"public <numer> = <nr> {numer};\n", "public <numer> = <nr> {numer};\n",
"\n", "\n",
"<nr> = 123456789 | 123123123 | 123456123;\n" "<nr> = <cyfra>+;\n",
"\n",
"<cyfra> = 0|1|2|3|4|5|6|7|8|9\n"
] ]
}, },
{
"cell_type": "code",
"execution_count": 15,
"id": "annual-bridge",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Overwriting ./grammar/bye.jsgf\n"
]
}
],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "confirmed-quantum", "id": "warming-pharmaceutical",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
}, },
{
"cell_type": "code",
"execution_count": 9,
"id": "looking-alias",
"metadata": {},
"outputs": [],
"source": [
"import jsgf\n",
"from os import listdir\n",
"from os.path import isfile, join\n",
"\n",
"mypath = \"./grammar/\"\n",
"onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]\n",
"\n",
"grammars = []\n",
"\n",
"for grammarFile in onlyfiles:\n",
" grammar = jsgf.parse_grammar_file(mypath + grammarFile)\n",
" grammars.append(grammar)\n",
" \n",
"\n",
"def get_dialog_act(rule):\n",
" slots = []\n",
" get_slots(rule.expansion, slots)\n",
" return {'act': rule.grammar.name, 'slots': slots}\n",
"\n",
"def get_slots(expansion, slots):\n",
" if expansion.tag != '':\n",
" slots.append((expansion.tag, expansion.current_match))\n",
" return\n",
"\n",
" for child in expansion.children:\n",
" get_slots(child, slots)\n",
"\n",
" if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):\n",
" get_slots(expansion.referenced_rule.expansion, slots)\n",
"\n",
"def nlu(utterance):\n",
" matched = None\n",
" for grammar in grammars:\n",
" matched = grammar.find_matching_rules(utterance)\n",
" if matched:\n",
" break\n",
"\n",
" if matched:\n",
" return get_dialog_act(matched[0])\n",
" else:\n",
" return {'act': 'null', 'slots': []}\n",
"\n",
" \n",
"def ajn(text):\n",
" frame = nlu(text)\n",
" return frame\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "statutory-falls",
"metadata": {},
"outputs": [],
"source": [
"ajn = Ajn()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "through-function",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<bound method Ajn.nlu of <__main__.Ajn object at 0x7f2ffa712630>>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ajn.nlu"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "fantastic-yemen",
"metadata": {},
"outputs": [
{
"ename": "TypeError",
"evalue": "nlu() takes 1 positional argument but 2 were given",
"output_type": "error",
"traceback": [
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
"\u001b[0;32m<ipython-input-7-8ae578ffe68d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0majn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlu\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Chcialabym zarezerwowac 10 biletow na film corke na 16 45'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mTypeError\u001b[0m: nlu() takes 1 positional argument but 2 were given"
]
}
],
"source": [
"result = ajn.nlu('Chcialabym zarezerwowac 10 biletow na film corke na 16 45')\n",
"result"
]
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "chemical-athens", "id": "upset-inclusion",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -412,7 +346,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "quantitative-proposition", "id": "absolute-banana",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
@ -422,235 +356,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "based-action", "id": "static-science",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 1,
"id": "cosmetic-beijing",
"metadata": {},
"outputs": [],
"source": [
"import jsgf\n",
"from os import listdir\n",
"from os.path import isfile, join\n",
"\n",
"mypath = \"./grammar/\"\n",
"onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))]\n",
"\n",
"grammars = []\n",
"\n",
"for grammarFile in onlyfiles:\n",
" grammar = jsgf.parse_grammar_file(mypath + grammarFile)\n",
" grammars.append(grammar)\n",
"\n",
" \n",
" \n",
"def get_dialog_act(rule):\n",
" slots = []\n",
" get_slots(rule.expansion, slots)\n",
" return {'act': rule.grammar.name, 'slots': slots}\n",
"\n",
"def get_slots(expansion, slots):\n",
" if expansion.tag != '':\n",
" slots.append((expansion.tag, expansion.current_match))\n",
" return\n",
"\n",
" for child in expansion.children:\n",
" get_slots(child, slots)\n",
"\n",
" if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):\n",
" get_slots(expansion.referenced_rule.expansion, slots)\n",
"\n",
"def nlu(utterance):\n",
" matched = None\n",
" for grammar in grammars:\n",
" matched = grammar.find_matching_rules(utterance)\n",
" if matched:\n",
" break\n",
"\n",
" if matched:\n",
" return get_dialog_act(matched[0])\n",
" else:\n",
" return {'act': 'null', 'slots': []}\n",
" \n",
"res = nlu('chcialbym zarezerwowac 2 bilety na corke na 16')"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "detected-crowd",
"metadata": {},
"outputs": [],
"source": [
"ajn = Ajn()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "technological-applicant",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"{'act': 'book',\n",
" 'slots': [('ilosc', '2'),\n",
" ('tytul', 'Corke'),\n",
" ('dzien', None),\n",
" ('godzina', '16')]}"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "acknowledged-measurement",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 3,
"id": "living-reservoir",
"metadata": {},
"outputs": [],
"source": [
"\n",
"class Dst:\n",
" \n",
" def __init__(self):\n",
" self.messages = []\n",
" self.checklist = {\n",
" \"ilosc\": None,\n",
" \"tytul\": None,\n",
" \"dzien\": None,\n",
" \"godzina\": None\n",
" }\n",
" self.history = []\n",
" \n",
" def store(self, message):\n",
" self.messages.append(message)\n",
"\n",
" def get_messages(self):\n",
" return self.messages\n",
"\n",
" def get_next_question(self):\n",
" for key, value in self.checklist.items():\n",
" if value == None:\n",
" return key\n",
"\n",
" def save_answer(self, slots):\n",
" for slot in slots:\n",
" self.checklist[slot[0]] = slot[1]\n",
"\n",
" self.messages.append(slots)\n",
" \n",
" def update(self, user_act=None):\n",
" for intent, domain, slot, value in user_act:\n",
" domain = domain.lower()\n",
" intent = intent.lower()\n",
" slot = slot.lower()\n",
" print(domain,intent,slot)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "organizational-overhead",
"metadata": {},
"outputs": [],
"source": [
"dst = Dst()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "flying-preliminary",
"metadata": {},
"outputs": [],
"source": [
"dst.save_answer(res['slots'])"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "effective-arbitration",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('ilosc', '2'), ('tytul', 'Corke'), ('dzien', None), ('godzina', '16')]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"res['slots']"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "warming-oracle",
"metadata": {},
"outputs": [],
"source": [
"next_question = dst.get_next_question()"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "immune-conducting",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'ilosc': '2', 'tytul': 'Corke', 'dzien': None, 'godzina': '16'}\n"
]
}
],
"source": [
"print(dst.checklist)"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "therapeutic-ending",
"metadata": {},
"outputs": [],
"source": [
"user_act"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "clinical-removal",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
@ -658,31 +364,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "elder-complexity", "id": "loose-championship",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"dzien\n"
]
}
],
"source": [
"next_question = dst.get_next_question()\n",
"while (next_question):\n",
" print(next_question)\n",
" response = input()\n",
" res = nlu(response)\n",
" dst.save_answer(res['slots'])\n",
" next_question = dst.get_next_question()"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "leading-gospel",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
@ -690,7 +372,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "cleared-malpractice", "id": "emerging-conviction",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
@ -698,7 +380,7 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "single-browser", "id": "polished-identification",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
@ -706,7 +388,15 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "sunrise-zoning", "id": "unexpected-quarter",
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": null,
"id": "minus-archive",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": []
@ -714,7 +404,7 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python 3 (ipykernel)",
"language": "python", "language": "python",
"name": "python3" "name": "python3"
}, },
@ -728,7 +418,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.7.3" "version": "3.9.7"
} }
}, },
"nbformat": 4, "nbformat": 4,

View File

@ -2,101 +2,143 @@
"cells": [ "cells": [
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 2, "execution_count": 1,
"id": "encouraging-december", "id": "surgical-trainer",
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{
"name": "stdin",
"output_type": "stream",
"text": [
">>> chce 2 bilety\n"
]
},
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"tytul\n", "Jeśli chcesz zresetować rozmowę wpisz \"reset\"\n"
"{'ilosc': '2', 'tytul': None, 'dzien': None, 'godzina': None}\n",
"Na jaki film ma zostać dokonana rezerwacja?\n"
] ]
}, },
{ {
"name": "stdin", "name": "stdin",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
">>> chce na film batman\n" ">>> chce 2 bilety na batmana na jutro\n"
] ]
}, },
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"ilosc\n", "godzina\n",
"{'ilosc': None, 'tytul': 'Batman', 'dzien': None, 'godzina': None}\n", "{'ilosc': '2', 'tytul': 'Batmana', 'dzien': 'jutro', 'godzina': None, 'miejsce': None, 'numer': None}\n",
"Ile biletów ma zostać zarezerwowanych?\n" "[('ilosc', '2'), ('tytul', 'Batmana'), ('dzien', 'jutro'), ('godzina', None)]\n",
"book\n",
"Na którą godzinę ma być dokonana rezerwacja?\n"
] ]
}, },
{ {
"name": "stdin", "name": "stdin",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
">>> chce 2 bilety\n" ">>> na 17\n"
] ]
}, },
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"tytul\n", "godzina\n",
"{'ilosc': '2', 'tytul': None, 'dzien': None, 'godzina': None}\n", "{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': None, 'miejsce': None, 'numer': None}\n",
"Na jaki film ma zostać dokonana rezerwacja?\n" "[('dzien', '17')]\n",
"dni\n",
"Na którą godzinę ma być dokonana rezerwacja?\n"
] ]
}, },
{ {
"name": "stdin", "name": "stdin",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
">>> chce 2 bilety na film batman\n" ">>> na godzine 17\n"
] ]
}, },
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"dzien\n", "miejsce\n",
"{'ilosc': '2', 'tytul': 'Batman', 'dzien': None, 'godzina': None}\n", "{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': '17', 'miejsce': None, 'numer': None}\n",
"Na który dzień ma być dokonana rezerwacja?\n" "[('godzina', '17')]\n",
"godziny\n",
"Czy miejsca mają być z przodu, z tyłu czy na środku?\n"
] ]
}, },
{ {
"name": "stdin", "name": "stdin",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
">>> chce na jutro\n" ">>> na środku\n"
] ]
}, },
{ {
"name": "stdout", "name": "stdout",
"output_type": "stream", "output_type": "stream",
"text": [ "text": [
"ilosc\n", "numer\n",
"{'ilosc': None, 'tytul': None, 'dzien': 'jutro', 'godzina': None}\n", "{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': '17', 'miejsce': 'srodku', 'numer': None}\n",
"Ile biletów ma zostać zarezerwowanych?\n" "[('miejsce', 'srodku')]\n",
"miejsca\n",
"Na jaki numer telefonu ma zostać dokonana rezerwacja?\n"
] ]
}, },
{ {
"ename": "KeyboardInterrupt", "name": "stdin",
"evalue": "Interrupted by user", "output_type": "stream",
"output_type": "error", "text": [
"traceback": [ ">>> 1\n"
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", ]
"\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", },
"\u001b[0;32m<ipython-input-2-0b584a7b5a30>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 12\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 14\u001b[0;31m \u001b[0mtext\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'>>>'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 15\u001b[0m \u001b[0mframe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0majn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtext\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 16\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", {
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 849\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 850\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 851\u001b[0;31m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 852\u001b[0m )\n\u001b[1;32m 853\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "name": "stdout",
"\u001b[0;32m/usr/local/lib/python3.7/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 890\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 891\u001b[0m \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 892\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Interrupted by user\"\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 893\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 894\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarning\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Invalid Message:\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexc_info\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "output_type": "stream",
"\u001b[0;31mKeyboardInterrupt\u001b[0m: Interrupted by user" "text": [
"numer\n",
"{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': '17', 'miejsce': 'srodku', 'numer': None}\n",
"[('numer', '1')]\n",
"numer\n",
"Proszę podać poprawny numer telefonu.\n",
"Na jaki numer telefonu ma zostać dokonana rezerwacja?\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
">>> 1212\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"numer\n",
"{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': '17', 'miejsce': 'srodku', 'numer': None}\n",
"[('numer', '1 2 1 2')]\n",
"numer\n",
"Proszę podać poprawny numer telefonu.\n",
"Na jaki numer telefonu ma zostać dokonana rezerwacja?\n"
]
},
{
"name": "stdin",
"output_type": "stream",
"text": [
">>> 123123123\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"None\n",
"{'ilosc': '2', 'tytul': 'Batmana', 'dzien': '17', 'godzina': '17', 'miejsce': 'srodku', 'numer': '123123123'}\n",
"[('numer', '1 2 3 1 2 3 1 2 3')]\n",
"numer\n",
"Rezerwacja została dokonana. Potwierdzenie rezerwacji zostanie niebawem przesłane wiadomością SMS. Proszę o przybycie 15 minut przed rozpoczęciem seansu w celu zakupu biletu, w innym przypadku rezerwacja przepada.\n"
] ]
} }
], ],
@ -111,19 +153,31 @@
" \n", " \n",
" dst = Dst()\n", " dst = Dst()\n",
" next_question = dst.get_next_question()\n", " next_question = dst.get_next_question()\n",
" print('Jeśli chcesz zresetować rozmowę wpisz \\\"reset\\\"')\n",
" \n",
" while (next_question):\n", " while (next_question):\n",
" \n", " \n",
" \n", " \n",
" text = input('>>>')\n", " text = input('>>>')\n",
" \n",
" \n",
" frame = ajn(text)\n", " frame = ajn(text)\n",
" \n", " \n",
" dst.reset_if_needed(text)\n",
" \n",
" \n",
" \n",
" dst.save_answer(frame['slots'])\n", " dst.save_answer(frame['slots'])\n",
" \n", " \n",
" next_question = dst.get_next_question()\n", " next_question = dst.get_next_question()\n",
" print(next_question)\n", " print(next_question)\n",
" print(dst.checklist)\n", " print(dst.checklist)\n",
"# print(frame['act'])\n", " print(frame['slots'])\n",
" nlg(next_question)\n", " print(frame['act'])\n",
" nlg(next_question,frame,text)\n",
" \n",
" if text == \"exit\" or frame['act'] == \"bye\":\n",
" break;\n",
"\n", "\n",
" \n", " \n",
" \n", " \n",
@ -133,10 +187,12 @@
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
"id": "yellow-acquisition", "id": "armed-classroom",
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [] "source": [
"chce 2 bilety na batmana na jutro na 17 15"
]
} }
], ],
"metadata": { "metadata": {

View File

@ -1,437 +1,437 @@
import nltk 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()

View File

@ -10,41 +10,53 @@ grammars = []
for grammarFile in onlyfiles: for grammarFile in onlyfiles:
grammar = jsgf.parse_grammar_file(mypath + grammarFile) grammar = jsgf.parse_grammar_file(mypath + grammarFile)
grammars.append(grammar) grammars.append(grammar)
class Ajn:
def __init__(self, grammars = None):
self.grammars = grammars
def get_dialog_act(rule): def get_dialog_act(rule):
slots = [] slots = []
get_slots(rule.expansion, slots) get_slots(rule.expansion, slots)
return {'act': rule.grammar.name, 'slots': slots} return {'act': rule.grammar.name, 'slots': slots}
def get_slots(expansion, slots): def get_slots(expansion, slots):
if expansion.tag != '': if expansion.tag != '':
slots.append((expansion.tag, expansion.current_match)) slots.append((expansion.tag, expansion.current_match))
return return
for child in expansion.children: for child in expansion.children:
get_slots(child, slots) get_slots(child, slots)
if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef): if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef):
get_slots(expansion.referenced_rule.expansion, slots) get_slots(expansion.referenced_rule.expansion, slots)
def nlu(utterance):
matched = None
for grammar in grammars:
matched = grammar.find_matching_rules(utterance)
if matched:
break
def nlu(utterance):
matched = None
for grammar in grammars:
matched = grammar.find_matching_rules(utterance)
if matched: if matched:
return get_dialog_act(matched[0]) break
else:
return {'act': 'null', 'slots': []}
if matched:
return get_dialog_act(matched[0])
else:
return {'act': 'null', 'slots': []}
def preprocess(text):
text = text.lower()
text = text.replace("ą","a")
text = text.replace("ę","e")
text = text.replace("ó","o")
text = text.replace("ł","l")
text = text.replace("ć","c")
text = text.replace("ń","n")
text = text.replace("ś","s")
text = text.replace("ą","a")
text = text.replace("ż","z")
text = text.replace("ź","z")
text = text.replace("ą","a")
return text
ajn = Ajn()
def ajn(text):
frame = nlu(preprocess(text))
return frame

View File

@ -23,13 +23,19 @@ class Dst:
if value == None: if value == None:
return key return key
def reset(self): def reset_if_needed(self,text):
for key, value in self.checklist.items(): if text == "reset":
value = None; for key in self.checklist.keys():
self.checklist[key] = None
def save_answer(self, slots): def save_answer(self, slots):
for slot in slots: for slot in slots:
#print(slot[0],slot[1]) if slot[0] == "numer":
self.checklist[slot[0]] = slot[1] if (len(slot[1].replace(" ",""))) == 9:
self.checklist[slot[0]] = slot[1].replace(" ","")
else:
self.checklist[slot[0]] = slot[1]
self.messages.append(slots) self.messages.append(slots)

View File

@ -1,13 +1,46 @@
def nlg(query,frame): import random
unknown = ['Nie rozumiem. Proszę o powtórzenie.',
'Czy możesz powiedzieć to innymi słowami?',
"Nie wiem co masz na myśli",
"Czy możesz powiedzieć to w inny sposób, proszę?"]
bye = ["Trzymaj się!",
"Na razie!",
"Do zobaczenia później!",
"Do zobaczenia",
"Pogadamy później!"
]
def nlg(query,frame,text):
if frame['act'] == "hello": if frame['act'] == "hello":
print("Witamy w systemie rezerwacji biletów kinowych. W czym mogę pomóc?") print("Witamy w systemie rezerwacji biletów kinowych. W czym mogę pomóc?")
if frame['act'] == "repertuar": if frame['act'] == "repertuar":
print("Aktualnie repertuar zawiera takie filmy jak: \"Batman\" \"Ambulans\" \"Bunkier strachu\" \"Córka\" \"Uncharted\" \"Inni ludzie\" \"Śmierć na Nilu\" \"Skarb Mikołajka\"") print("Aktualnie repertuar zawiera takie filmy jak: \"Batman\" \"Ambulans\" \"Bunkier strachu\" \"Córka\" \"Uncharted\" \"Inni ludzie\" \"Śmierć na Nilu\" \"Skarb Mikołajka\"")
if frame['act'] == 'null':
print('Nie rozumiem. Proszę o powtórzenie')
if frame['act'] == 'null':
if text == 'reset':
print("Resetowanie dialogu.")
if text == "exit":
print('Dziękujemy za skorzystanie z naszych usług!')
elif text != "reset":
print(random.choice(unknown))
if frame['act'] == "numer":
if len(text) != 9:
print("Proszę podać poprawny numer telefonu.")
elif query == None:
print("Rezerwacja została dokonana. Potwierdzenie rezerwacji zostanie niebawem przesłane wiadomością SMS. Proszę o przybycie 15 minut przed rozpoczęciem seansu w celu zakupu biletu, w innym przypadku rezerwacja przepada.")
if frame['act'] == "bye" :
print(random.choice(bye))
else: # if frame['act'] != "hello" and frame['act'] != "null" and :
if frame['act'] not in ['hello','bye','null']:
if query == "miejsce": if query == "miejsce":
print("Czy miejsca mają być z przodu, z tyłu czy na środku?") print("Czy miejsca mają być z przodu, z tyłu czy na środku?")
if query == "numer": if query == "numer":
@ -20,7 +53,7 @@ def nlg(query,frame):
print("Ile biletów ma zostać zarezerwowanych?") print("Ile biletów ma zostać zarezerwowanych?")
if query == 'tytul': if query == 'tytul':
print("Na jaki film ma zostać dokonana rezerwacja?") print("Na jaki film ma zostać dokonana rezerwacja?")
if query == None:
print("Rezerwacja została dokonana. Potwierdzenie rezerwacji zostanie niebawem przesłane wiadomością SMS. Proszę o przybycie 15 minut przed rozpoczęciem seansu w celu zakupu biletu, w innym przypadku rezerwacja przepada.")