202 lines
6.5 KiB
Plaintext
202 lines
6.5 KiB
Plaintext
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "2c89fac1",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Ujednoznacznianie wypowiedzi użytkownika\n",
|
||
|
"========================================\n",
|
||
|
"\n",
|
||
|
"Problem\n",
|
||
|
"-------\n",
|
||
|
"W systemie dialogowym ukierunkowanym na wypełnianie wielu zadań jednocześnie polecenia użytkownika mogą być niejednoznacznie. Przykładowo wypowiedź\n",
|
||
|
"\n",
|
||
|
"> please book it for me\n",
|
||
|
"\n",
|
||
|
"może dotyczyć zarówno rezerwacji pokoju w hotelu jak i biletu na pociąg.\n",
|
||
|
"\n",
|
||
|
"System, w którym moduł NLU jest zbudowany z wykorzystaniem gramatyk semantycznych może zwrócić\n",
|
||
|
"więcej niż jedną ramę reprezentującą znaczenie wypowiedzi. Która rama powinna zostać uznana za\n",
|
||
|
"prawidłową?\n",
|
||
|
"\n",
|
||
|
"System, w którym moduł NLU jest zbudowany przy użyciu modelu sekwencyjnego może zwrócić jedną,\n",
|
||
|
"arbitralnie wybraną ramę. Co wtedy?\n",
|
||
|
"\n",
|
||
|
"Ujednoznacznianie z wykorzystaniem reguł\n",
|
||
|
"----------------------------------------\n",
|
||
|
"\n",
|
||
|
"Do ujednoznaczniania wypowiedzi użytkownika można wykorzystać monitor stanu dialogu oraz taktykę\n",
|
||
|
"prowadzenia dialogu. Możemy m.in.:\n",
|
||
|
"\n",
|
||
|
" 1. Dopasować niejednoznaczną wypowiedź do wszystkich dziedzin licząc na to, że w toku dialogu\n",
|
||
|
" niejednoznaczność zostanie rozstrzygnięta (to\n",
|
||
|
" rozwiązanie zostało przyjęte w monitorze `SimpleRuleDST` przedstawionym na zajęciach ósmych).\n",
|
||
|
"\n",
|
||
|
" 2. Dopasować niejednoznaczną wypowiedź wyłącznie do tej dziedziny, dla której stan dialogu zawiera\n",
|
||
|
" wypełnione sloty.\n",
|
||
|
"\n",
|
||
|
" 3. Sprawdzić czy wypowiedź użytkownika stanowi odpowiedź na pytanie uprzednio zadane przez system\n",
|
||
|
" (pole `request_state` w monitorze `SimpleRuleDST`).\n",
|
||
|
"\n",
|
||
|
" 4. Wykorzystać taktykę prowadzenia dialogu do zadania pytania, które rozstrzygnie\n",
|
||
|
" niejednoznaczność."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "4c43c939",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Ujednoznacznianie z wykorzystaniem uczenia maszynowego\n",
|
||
|
"------------------------------------------------------\n",
|
||
|
"\n",
|
||
|
"W procesie uczenia modelu NLU można wykorzystać historię dialogu jako kontekst (zbiór dodatkowych\n",
|
||
|
"cech) warunkujących wynik uczenia.\n",
|
||
|
"Takie podejście zostało zastosowane w modelu [jointBERT](https://github.com/thu-coai/ConvLab-2/blob/master/convlab2/nlu/jointBERT/jointBERT.py), w którym kontekst składa się z trzech (sklejonych ze sobą) tur dialogu poprzedzających bieżącą wypowiedź.\n",
|
||
|
"\n",
|
||
|
"Porównajmy skuteczność modelu bezkontekstowego ze skutecznością modelu uwzględniającego kontekst.\n",
|
||
|
"Do oceny jakości wykorzystamy zbiór danych [MultiWOZ](https://github.com/budzianowski/multiwoz) (Budzianowski i in., 2018)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "dc543a04",
|
||
|
"metadata": {
|
||
|
"lines_to_next_cell": 0
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from convlab2.nlu.jointBERT.multiwoz import BERTNLU\n",
|
||
|
"from convlab2.util.dataloader.module_dataloader import MultiTurnNLUDataloader\n",
|
||
|
"from convlab2.util.dataloader.dataset_dataloader import MultiWOZDataloader\n",
|
||
|
"\n",
|
||
|
"dataloader = MultiTurnNLUDataloader(dataset_dataloader=MultiWOZDataloader())\n",
|
||
|
"data = dataloader.load_data(data_key='test', role='sys')['test']"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "18cee3d4",
|
||
|
"metadata": {
|
||
|
"lines_to_next_cell": 0
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"data['utterance'][:3]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "eafcffe8",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"data['dialog_act'][:3]"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "10607b8d",
|
||
|
"metadata": {
|
||
|
"lines_to_next_cell": 0
|
||
|
},
|
||
|
"source": [
|
||
|
"Precision, recall oraz F1 obu modeli zmierzymy korzystając z funkcji `evaluate`."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "0c9b943c",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from convlab2.nlu.evaluate import calculateF1\n",
|
||
|
"from tqdm.notebook import tqdm\n",
|
||
|
"\n",
|
||
|
"def evaluate(model, data):\n",
|
||
|
" results = []\n",
|
||
|
"\n",
|
||
|
" for utt, ctx, acts in tqdm(zip(data['utterance'], data['context'], data['dialog_act']), total=len(data['utterance'])):\n",
|
||
|
" predicted = model.predict(utterance=utt, context=ctx)\n",
|
||
|
" results.append({'predict': predicted, 'golden': acts})\n",
|
||
|
"\n",
|
||
|
" precision, recall, fscore = calculateF1(results)\n",
|
||
|
" print(f'Precision: {precision:.4f} Recall: {recall:.4f} F1: {fscore:.4f}')\n",
|
||
|
" return precision, recall, fscore"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "db8227a6",
|
||
|
"metadata": {
|
||
|
"lines_to_next_cell": 0
|
||
|
},
|
||
|
"source": [
|
||
|
"Zmierzmy skuteczność modelu bezkontekstowego."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "7c29b75f",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"noctx_model = BERTNLU(mode='all',\n",
|
||
|
" config_file='multiwoz_all.json',\n",
|
||
|
" model_file='https://convlab.blob.core.windows.net/convlab-2/bert_multiwoz_all.zip')\n",
|
||
|
"\n",
|
||
|
"noctx_results = evaluate(noctx_model, data)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "f82fb6fc",
|
||
|
"metadata": {
|
||
|
"lines_to_next_cell": 0
|
||
|
},
|
||
|
"source": [
|
||
|
"Zmierzmy skutecznosć modelu uwzględniającego kontekst."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": null,
|
||
|
"id": "d3d7773f",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"ctx_model = BERTNLU(mode='all',\n",
|
||
|
" config_file='multiwoz_all_context.json',\n",
|
||
|
" model_file='https://convlab.blob.core.windows.net/convlab-2/bert_multiwoz_all_context.zip')\n",
|
||
|
"\n",
|
||
|
"ctx_results = evaluate(ctx_model, data)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"id": "621c5295",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Literatura\n",
|
||
|
"----------\n",
|
||
|
" 1. Pawel Budzianowski, Tsung-Hsien Wen, Bo-Hsiang Tseng, Iñigo Casanueva, Stefan Ultes, Osman Ramadan, Milica Gasic, MultiWOZ - A Large-Scale Multi-Domain Wizard-of-Oz Dataset for Task-Oriented Dialogue Modelling. EMNLP 2018, pp. 5016-5026"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"jupytext": {
|
||
|
"cell_metadata_filter": "-all",
|
||
|
"main_language": "python",
|
||
|
"notebook_metadata_filter": "-all"
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 5
|
||
|
}
|