{ "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 }