288 lines
7.6 KiB
Plaintext
288 lines
7.6 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "1a9e48a0",
|
|
"metadata": {},
|
|
"source": [
|
|
"Generowanie odpowiedzi\n",
|
|
"======================\n",
|
|
"\n",
|
|
"W systemie dialogowym taktyka prowadzenia dialogu odpowiada za wyznaczanie aktów systemowych, czyli wskazanie tego **co ma zostać przez system wypowiedziane** i/lub wykonane.\n",
|
|
"Zadaniem modułu generowania odpowiedzi jest zamiana aktów dialogowych na wypowiedzi w języku\n",
|
|
"naturalnym, czyli wskazanie tego **w jaki sposób** ma zostać wypowiedziane to co ma zostać\n",
|
|
"wypowiedziane.\n",
|
|
"\n",
|
|
"Generowanie odpowiedzi przy użyciu szablonów\n",
|
|
"--------------------------------------------\n",
|
|
"Podstawowe narzędzie wykorzystywane w modułach generowania odpowiedzi stanowią szablony tekstowe\n",
|
|
"interpolujące zmienne. W Pythonie mechanizm ten jest dostępny za pośrednictwem\n",
|
|
"[f-stringów](https://docs.python.org/3/reference/lexical_analysis.html#f-strings), metody\n",
|
|
"[format](https://docs.python.org/3/library/string.html#formatstrings) oraz zewnętrznych bibliotek takich, jak [Jinja2](https://jinja.palletsprojects.com/).\n",
|
|
"\n",
|
|
"O ile podejście wykorzystujące wbudowane mechanizmy języka Python sprawdza się w prostych\n",
|
|
"przypadkach..."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "250a4248",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def nlg(system_act):\n",
|
|
" domain, intent, slot, value = system_act\n",
|
|
"\n",
|
|
" if intent == 'Inform' and slot == 'Phone':\n",
|
|
" return f'Numer telefonu to {value}'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "54e4076a",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Hotel', 'Inform', 'Phone', '1234567890'])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "38dfc0e6",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"source": [
|
|
"... to trzeba mieć świadomość, że w toku prac nad agentem dialogowym może być konieczne\n",
|
|
"uwzględnienie m.in.:\n",
|
|
"\n",
|
|
" 1. szablonów zależnych od wartości slotów"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "5f0930e1",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def nlg(system_act):\n",
|
|
" domain, intent, slot, value = system_act\n",
|
|
"\n",
|
|
" if domain == 'Restaurant' and intent == 'Inform' and slot == 'Count':\n",
|
|
" if value == 0:\n",
|
|
" return f'Nie znalazłem restauracji spełniających podane kryteria.'\n",
|
|
" elif value == 1:\n",
|
|
" return f'Znalazłem jedną restaurację spełniającą podane kryteria.'\n",
|
|
" elif value <= 4:\n",
|
|
" return f'Znalazłem {value} restauracje spełniające podane kryteria.'\n",
|
|
" elif value <= 9:\n",
|
|
" return f'Znalazłem {value} restauracji spełniających podane kryteria.'\n",
|
|
" else:\n",
|
|
" return f'Znalazłem wiele restauracji spełniających podane kryteria.'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "1245bde1",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Restaurant', 'Inform', 'Count', 0])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "7c09def2",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Restaurant', 'Inform', 'Count', 1])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "bcf67aa4",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Restaurant', 'Inform', 'Count', 2])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6390d6c5",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Restaurant', 'Inform', 'Count', 6])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "3b269a47",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg(['Restaurant', 'Inform', 'Count', 100])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "acec991b",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"source": [
|
|
" 2. wielu wariantów tej samej wypowiedzi"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "d35b82f9",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"import random\n",
|
|
"\n",
|
|
"def nlg(system_act):\n",
|
|
" domain, intent, slot, value = system_act\n",
|
|
"\n",
|
|
" if intent == 'Affirm':\n",
|
|
" r = random.randint(1, 3)\n",
|
|
"\n",
|
|
" if r == 1:\n",
|
|
" return 'Tak'\n",
|
|
" elif r == 2:\n",
|
|
" return 'Zgadza się'\n",
|
|
" else:\n",
|
|
" return 'Potwierdzam'\n",
|
|
"\n",
|
|
"nlg(['Hotel', 'Affirm', '', ''])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "8e0244f4",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"source": [
|
|
" 3. wielojęzycznego interfejsu użytkownika"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "bed51e01",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def nlg_en(system_act):\n",
|
|
" domain, intent, slot, value = system_act\n",
|
|
"\n",
|
|
" if domain == 'Hotel' and intent == 'Request' and slot == 'CreditCardNo':\n",
|
|
" return 'What is your credit card number?'"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "6762fc98",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"nlg_en(['Hotel', 'Request', 'CreditCardNo', '?'])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "23323149",
|
|
"metadata": {
|
|
"lines_to_next_cell": 0
|
|
},
|
|
"source": [
|
|
"Generowanie odpowiedzi z wykorzystaniem uczenia maszynowego\n",
|
|
"-----------------------------------------------------------\n",
|
|
"Obok mechanizmu szablonów do generowania odpowiedzi można również\n",
|
|
"stosować techniki uczenia maszynowego.\n",
|
|
"Zagadnienie to stanowiło\n",
|
|
"przedmiot konkursu [E2E NLG Challenge](http://www.macs.hw.ac.uk/InteractionLab/E2E/) (Novikova i in., 2017).\n",
|
|
"Przyjrzyjmy się danym, jakie udostępnili organizatorzy."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "0e616020",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"!mkdir -p l11\n",
|
|
"!curl -L -C - https://github.com/tuetschek/e2e-dataset/releases/download/v1.0.0/e2e-dataset.zip -o l11/e2e-dataset.zip\n",
|
|
"!unzip l11/e2e-dataset.zip -d l11"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": null,
|
|
"id": "d9a1032e",
|
|
"metadata": {},
|
|
"outputs": [],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"\n",
|
|
"trainset = pd.read_csv('l11/e2e-dataset/trainset.csv')\n",
|
|
"trainset"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"id": "d3d5e0d6",
|
|
"metadata": {},
|
|
"source": [
|
|
"Zadanie\n",
|
|
"-------\n",
|
|
"Zaimplementować moduł generowania odpowiedzi obejmujący akty systemowe występujące w zgromadzonym korpusie.\n",
|
|
"\n",
|
|
"Literatura\n",
|
|
"----------\n",
|
|
" 1. Jekaterina Novikova, Ondřej Dušek, Verena Rieser, The E2E Dataset: New Challenges For End-to-End Generation, Proceedings of the SIGDIAL 2017 Conference, pages 201-206, Saarbrücken, Germany https://arxiv.org/pdf/1706.09254.pdf"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"jupytext": {
|
|
"cell_metadata_filter": "-all",
|
|
"main_language": "python",
|
|
"notebook_metadata_filter": "-all"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 5
|
|
}
|