340 lines
18 KiB
Plaintext
340 lines
18 KiB
Plaintext
{
|
|
"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
|
|
}
|