systemy_dialogowe/notebooks/11-generowanie-odpowiedzi.ipynb

288 lines
7.6 KiB
Plaintext
Raw Normal View History

2023-04-21 17:42:07 +02:00
{
"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
}