{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5fb40545",
   "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",
   "id": "58255cc1",
   "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,
   "id": "1a0618ce",
   "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",
   "id": "2f2a21be",
   "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",
   "id": "b6112a72",
   "metadata": {},
   "source": [
    "Zilustrujmy powyższe zestawienie przykładami bezpośrednio ze zbioru testowego konkursu *Dialog State Tracking Challenge 2*."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "95b948c5",
   "metadata": {},
   "outputs": [],
   "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",
   "id": "4d9bd69f",
   "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,
   "id": "c12c43b9",
   "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",
   "id": "2d8d9f4a",
   "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,
   "id": "61cebc74",
   "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",
   "id": "60012ed2",
   "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",
   "id": "07d5cb8f",
   "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",
   "id": "8eabbfee",
   "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",
   "id": "b2e21e26",
   "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": {
  "jupytext": {
   "cell_metadata_filter": "-all",
   "main_language": "python",
   "notebook_metadata_filter": "-all"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}