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