systemy_dialogowe/notebooks/12-ujednoznacznianie.ipynb

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
}