{ "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 }