{
    "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> 5. <i>Struktura dialogu</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": [
                "Struktura dialogu\n",
                "=================\n",
                "\n",
                "Dialog można podzielić na *tury* będące naprzemiennymi wypowiedziami\n",
                "poszczególnych uczestników konwersacji.\n",
                "\n",
                "<!-- TODO rysunek drawio (chmurki) -->\n",
                "\n",
                "### Akty mowy\n",
                "Akcje podejmowane przez mówców za pomocą wypowiedzi nazywamy *aktami mowy*.\n",
                "\n",
                "#### Aspekty aktów mowy według Austina (za Zdunkiewicz 1993)\n",
                "| Aspekt       | Opis                                                                                                                         |\n",
                "|-------------:|:-----------------------------------------------------------------------------------------------------------------------------|\n",
                "| lokucyjny    | dotyczy samego procesu tworzenia określonego wyrażenia (bez uwzględnienia kontekstu)                                         |\n",
                "| illokucyjny  | dotyczy tego co mówca chce osiągnąć za pośrednictwem danej wypowiedzi (np. prośba, ostrzeżenie, obietnica, żądanie)          |\n",
                "| perlokucyjny | dotyczy ubocznych celów i rezeltatów osiągniętych za pośrednictwem danej wypowiedzi (np. zlekceważenie, obraza, rozbawienie) |\n",
                "\n",
                "#### Klasyfikacja aktów mowy według Searla (za Zdunkiewicz 1993)\n",
                "\n",
                "| Typ                       | Cel                                                         | Przykłady               |\n",
                "|--------------------------:|:------------------------------------------------------------|:------------------------|\n",
                "| asercja (assertive)       | przedstawienie sądu o stanie rzeczy                         | wątpienie               |\n",
                "| dyrektywa (directive)     | wywieranie nacisku na odbiorcę                              | rozkaz, prośba          |\n",
                "| komisywa (commisive)      | podjecie zobowiązania                                       | obietnica, zobowiązanie |\n",
                "| ekspresywa (expressive)   | wyrażenie stanu emocjonalnego                               | gratulacje, kondolencje |\n",
                "| deklaratywa (declarative) | wywołanie określonego stanu rzeczy w stosunkach społecznych | mianowanie              |"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "### Akty dialogowe\n",
                "\n",
                "Budując system dialogowy zwykle przyjmuje się węższa i jednocześnie bardziej\n",
                "szczegółową klasyfikację.\n",
                "Tzw. *akty dialogowe* stanowią reprezentację znaczenia wypowiedzi użytkownika i/lub systemu.\n",
                "\n",
                "Przyjrzyjmy się teraz klasyfikacji aktów dialogowych, które Henderson i in. (2013), wzorując się na Youngu i in. (2010), przyjęli na potrzeby ewaluacji systemów rekomendujących restauracje."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "metadata": {},
            "outputs": [],
            "source": [
                "!mkdir -p l04\n",
                "%cd l04\n",
                "!wget -c https://github.com/matthen/dstc/releases/download/v1/dstc2_test.tar.gz\n",
                "!tar xzvf dstc2_test.tar.gz\n",
                "%cd .."
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "#### Akty użytkownika\n",
                "\n",
                "| Typ      | Opis                               |\n",
                "|---------:|:-----------------------------------|\n",
                "| ack      | potwierdzenie                      |\n",
                "| affirm   | zatwierdzenie                      |\n",
                "| bye      | zakończenie rozmowy                |\n",
                "| hello    | przywitanie                        |\n",
                "| help     | prośba o pomoc (bez szczegółów)    |\n",
                "| negate   | zaprzeczenie                       |\n",
                "| null     | akt niezrozumiały dla systemu      |\n",
                "| repeat   | prośba o powtórzenie               |\n",
                "| reqalts  | prośba o alternatywną rekomendację |\n",
                "| reqmore  | prośba o uszczegółowienie          |\n",
                "| restart  | żądanie restartu                   |\n",
                "| silence  | cisza                              |\n",
                "| thankyou | podziękowanie                      |\n",
                "| confirm  | potwierdzenie wartości slotu       |\n",
                "| deny     | odrzucenie wartości slotu          |\n",
                "| inform   | przekazanie wartości slotu         |\n",
                "| request  | prośba o podanie wartości slotu    |"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Zilustrujmy powyższe zestawienie przykładami bezpośrednio ze zbioru testowego konkursu *Dialog State Tracking Challenge 2*."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": 1,
            "metadata": {},
            "outputs": [
                {
                    "ename": "ModuleNotFoundError",
                    "evalue": "No module named 'tabulate'",
                    "output_type": "error",
                    "traceback": [
                        "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
                        "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
                        "\u001b[1;32mc:\\Develop\\wmi\\AITECH\\sem1\\Systemy dialogowe\\lab\\05-struktura-dialogu.ipynb Cell 7'\u001b[0m in \u001b[0;36m<cell line: 3>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=0'>1</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mglob\u001b[39;00m\n\u001b[0;32m      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=1'>2</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mjson\u001b[39;00m\n\u001b[1;32m----> <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=2'>3</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mtabulate\u001b[39;00m\n\u001b[0;32m      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=3'>4</a>\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mitertools\u001b[39;00m\n\u001b[0;32m      <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/05-struktura-dialogu.ipynb#ch0000006?line=5'>6</a>\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39macts2desc\u001b[39m(acts):\n",
                        "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'tabulate'"
                    ]
                }
            ],
            "source": [
                "import glob\n",
                "import json\n",
                "import tabulate\n",
                "import itertools\n",
                "\n",
                "def acts2desc(acts):\n",
                "    descs = []\n",
                "\n",
                "    for intent, iacts in itertools.groupby(sorted(acts, key=lambda x: x['act']), key=lambda x: x['act']):\n",
                "        slots = ','.join(f'{slot[0]}={slot[1]}' if slot[0] != 'slot' else slot[1] for act in iacts for slot in act['slots'])\n",
                "        descs.append(f'{intent}({slots})')\n",
                "\n",
                "    return '&'.join(descs) if descs else 'null()'\n",
                "\n",
                "examples = set()\n",
                "\n",
                "for path in sorted(glob.glob('l04/data/**/label.json', recursive=True)):\n",
                "    if len(examples) > 30:\n",
                "        break\n",
                "\n",
                "    with open(path) as f:\n",
                "        for turn in json.load(f)['turns']:\n",
                "            examples.add((acts2desc(turn['semantics']['json']), turn['transcription']))\n",
                "            # examples.add(((turn['semantics']['cam']), turn['transcription']))\n",
                "\n",
                "tabulate.tabulate(examples, tablefmt='html', headers=['act', 'utterance'])"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Powyższe przykłady pokazują, że tury nie zawsze są pełnymi zdaniami.  Komunikacja przy użyciu mowy\n",
                "ma spontaniczny charakter, stąd w toku konwersacji mogą pojawić się poprawki, wtręty czy żądania\n",
                "restartu.\n",
                "\n",
                "#### Akty systemu\n",
                "\n",
                "| Typ                         | Opis                                                    |\n",
                "|----------------------------:|:--------------------------------------------------------|\n",
                "| affirm                      | potwierdzenie                                           |\n",
                "| bye                         | zakończenie rozmowy                                     |\n",
                "| canthear                    | „nic nie słyszę”                                        |\n",
                "| confirm-domain              | prośba o potwierdzenie dziedziny                        |\n",
                "| negate                      | zaprzeczenie                                            |\n",
                "| repeat                      | prośba o powtórzenie                                    |\n",
                "| reqmore                     | sprawdzenie czy użytkownik chce dodatkowych informacji  |\n",
                "| welcomemsg                  | przywitanie                                             |\n",
                "| canthelp                    | „nie mogę pomóc”                                        |\n",
                "| canthelp.missing_slot_value | „potrzebuję poznać wartość slotu, żeby pomóc”           |\n",
                "| expl-conf                   | potwierdzenie (wprost), że slot ma daną wartość         |\n",
                "| impl-conf                   | potwierdzenie (nie wprost), że slot ma daną wartość     |\n",
                "| inform                      | poinformowanie użytkownika, o przyjętej wartości slotu  |\n",
                "| offer                       | rekomendacja (restauracji)                              |\n",
                "| request                     | pytanie użytkownika o wartość slotu                     |\n",
                "| select                      | prośba o dokonanie wyboru spośród przedstawionych opcji |\n",
                "\n",
                "Przyjrzyjmy się również przykładom aktów systemowych."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "metadata": {},
            "outputs": [],
            "source": [
                "import glob\n",
                "import json\n",
                "import tabulate\n",
                "\n",
                "examples = set()\n",
                "\n",
                "for path in sorted(glob.glob('l04/data/**/log.json', recursive=True)):\n",
                "    if len(examples) > 30:\n",
                "        break\n",
                "\n",
                "    with open(path) as f:\n",
                "        for turn in json.load(f)['turns']:\n",
                "            output = turn['output']\n",
                "            examples.add((acts2desc(output['dialog-acts']), output['transcript']))\n",
                "\n",
                "tabulate.tabulate(examples, tablefmt='html', headers=['act', 'utterance'])"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Jak widać w powyższym ujęciu akty dialogowe takie jak `inform`, `request` czy `expl-conf` mogą\n",
                "przyjmować pewne parametry.\n",
                "\n",
                "### Ramy\n",
                "Strukturą danych powszechnie wykorzystywaną w systemach dialogowych do reprezentacji wiedzy\n",
                "jest *rama* (ang. *frame*).\n",
                "Ramy są wykorzystywane zarówno do reprezentowania poszczególnych aktów mowy jak i do\n",
                "modelowania bieżącego stanu dialogu oraz celów użytkownika.\n",
                "Rama ma nazwę oraz pewną liczbę *slotów*. Każdy slot ma określoną nazwę oraz wartość.\n",
                "\n",
                "Ramy przedstawione poniżej stanowią reprezentacje aktów dialogowych."
            ]
        },
        {
            "cell_type": "code",
            "execution_count": null,
            "metadata": {},
            "outputs": [],
            "source": [
                "import json\n",
                "\n",
                "samples = ['voip-00d76b791d-20130327_005342',\n",
                "           'voip-00d76b791d-20130327_012544',\n",
                "           'voip-0f41c16f2f-20130402_004710']\n",
                "\n",
                "for sample in samples:\n",
                "    with open(f'l04/data/Mar13_S2A0/{sample}/label.json') as f:\n",
                "        print(json.dumps(json.load(f)['turns'][3]['semantics']['json'], indent=2))"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Zadanie\n",
                "-------\n",
                "Opisać wypowiedzi użytkownika i odpowiedzi systemu zgromadzone w Państwa korpusie eksperymentalnym (tj. plikach `*.tsv` w katalogu `data`) aktami dialogowymi."
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "### Uwagi\n",
                "\n",
                "  - Akty reprezentujące znaczenie poszczególnych wypowiedzi należy umieszczać w trzeciej kolumnie plików `*.tsv`.\n",
                "\n",
                "  - Do zapisu aktów proszę stosować notację wykorzystywaną w przykładach (`inform(phone=01223 244277)&offer(name=the lucky star)`).\n",
                "\n",
                "  - Klasyfikacja aktów dialogowych przedstawiona przez Hendersona i in. (2013) może stanowić dobry punkt wyjścia, ale nie trzeba się jej kurczowo trzymać."
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Przykładowe narzędzia do oznaczania tekstu\n",
                "------------------------------------------\n",
                "\n",
                "  - [brat](http://brat.nlplab.org/)\n",
                "\n",
                "  - [doccano](https://github.com/doccano/doccano)\n",
                "\n",
                "  - [WebAnno](https://webanno.github.io/webanno/)\n",
                "\n",
                "  - [LabelStudio](https://labelstud.io/)\n",
                "\n",
                "  - Microsoft Excel, Office 365 itp.\n"
            ]
        },
        {
            "cell_type": "markdown",
            "metadata": {},
            "source": [
                "Literatura\n",
                "----------\n",
                " 1. Austin, John Langshaw, How to Do Things with Words, Oxford, 1962.\n",
                "\n",
                " 2. John Searle, Speech Acts, Cambridge University Press, 1969, ISBN 0-521-09626-X.\n",
                "\n",
                " 3. Dorota Zdunkiewicz, Akty mowy, Współczesny język polski, Wrocław, 1993, pp. 259-270.\n",
                "\n",
                " 4.  Matthew Henderson, Blaise Thomson, Jason D. Williams, The Second Dialog State Tracking Challenge, SIGDIAL 2014, 263-272."
            ]
        }
    ],
    "metadata": {
        "author": "Marek Kubis",
        "email": "mkubis@amu.edu.pl",
        "interpreter": {
            "hash": "70fd8fd7e3fc54d896fe6c72238aed96c145f98c112de7d68dff3109a15fe3ea"
        },
        "jupytext": {
            "cell_metadata_filter": "-all",
            "main_language": "python",
            "notebook_metadata_filter": "-all"
        },
        "kernelspec": {
            "display_name": "Python 3.8.3 64-bit",
            "language": "python",
            "name": "python3"
        },
        "lang": "pl",
        "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.8.3"
        },
        "subtitle": "5.Struktura dialogu[laboratoria]",
        "title": "Systemy Dialogowe",
        "year": "2021"
    },
    "nbformat": 4,
    "nbformat_minor": 4
}