{ "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", "
\n", "

Systemy Dialogowe

\n", "

5. Struktura dialogu [laboratoria]

\n", "

Marek Kubis (2021)

\n", "
\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", "\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\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mglob\u001b[39;00m\n\u001b[0;32m 2\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mjson\u001b[39;00m\n\u001b[1;32m----> 3\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mtabulate\u001b[39;00m\n\u001b[0;32m 4\u001b[0m \u001b[39mimport\u001b[39;00m \u001b[39mitertools\u001b[39;00m\n\u001b[0;32m 6\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 }