diff --git a/README.md b/README.md index 1f0fbc4..64ce566 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ - aby porozmawiać z systemem należy uruchomić wszystkie komórki pliku **lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb**, w celu nauczenia modelu, po ich wykonaniu należy uruchomić pythonowy skrypt **src/dialogue_system.py** -- dodananie modelu służącego do klasyfikacji wypowiedzi użytkownika, rozdzielenie zadań tagowania slotow oraz klasyfikacji wypowiedzi użytkownika do dwóch niezależnych medeli +- dodananie modelu służącego do klasyfikacji wypowiedzi użytkownika, rozdzielenie zadań tagowania slotow oraz klasyfikacji wypowiedzi użytkownika do dwóch niezależnych modeli --- diff --git a/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb b/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb index a1d21e3..6dbacec 100644 --- a/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb +++ b/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb @@ -78,6 +78,13 @@ "Zbiór ten gromadzi wypowiedzi w trzech językach opisane slotami dla dwunastu ram należących do trzech dziedzin `Alarm`, `Reminder` oraz `Weather`. Dane wczytamy korzystając z biblioteki [conllu](https://pypi.org/project/conllu/)." ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": 7, @@ -249,7 +256,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -262,7 +269,7 @@ "from flair.models import SequenceTagger\n", "from flair.trainers import ModelTrainer\n", "from flair.datasets import DataLoader\n", - "\n", + "import flair\n", "# determinizacja obliczeń\n", "import random\n", "import torch\n", @@ -277,6 +284,27 @@ " torch.backends.cudnn.deterministic = True" ] }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.6.1'" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flair.__version__\n", + "# Python 3.8.3 " + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -505,16 +533,16 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[('co', 'O'), ('gracie', 'O'), ('obecnie', 'O')]" + "[('poprosze', 'O'), ('bilet', 'O'), ('na', 'O'), ('batman', 'B-title')]" ] }, - "execution_count": 46, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } diff --git a/lab/12-ujednoznacznianie.ipynb b/lab/12-ujednoznacznianie.ipynb new file mode 100644 index 0000000..cb512c5 --- /dev/null +++ b/lab/12-ujednoznacznianie.ipynb @@ -0,0 +1,211 @@ +{ + "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", + "
\n", + "

Systemy Dialogowe

\n", + "

12. Ujednoznacznianie wypowiedzi u\u017cytkownika [laboratoria]

\n", + "

Marek Kubis (2021)

\n", + "
\n", + "\n", + "![Logo 2](https://git.wmi.amu.edu.pl/AITech/Szablon/raw/branch/master/Logotyp_AITech2.jpg)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ujednoznacznianie wypowiedzi u\u017cytkownika\n", + "========================================\n", + "\n", + "Problem\n", + "-------\n", + "W systemie dialogowym ukierunkowanym na wype\u0142nianie wielu zada\u0144 jednocze\u015bnie polecenia u\u017cytkownika mog\u0105 by\u0107 niejednoznacznie. Przyk\u0142adowo wypowied\u017a\n", + "\n", + "> please book it for me\n", + "\n", + "mo\u017ce dotyczy\u0107 zar\u00f3wno rezerwacji pokoju w hotelu jak i biletu na poci\u0105g.\n", + "\n", + "System, w kt\u00f3rym modu\u0142 NLU jest zbudowany z wykorzystaniem gramatyk semantycznych mo\u017ce zwr\u00f3ci\u0107\n", + "wi\u0119cej ni\u017c jedn\u0105 ram\u0119 reprezentuj\u0105c\u0105 znaczenie wypowiedzi. Kt\u00f3ra rama powinna zosta\u0107 uznana za\n", + "prawid\u0142ow\u0105?\n", + "\n", + "System, w kt\u00f3rym modu\u0142 NLU jest zbudowany przy u\u017cyciu modelu sekwencyjnego mo\u017ce zwr\u00f3ci\u0107 jedn\u0105,\n", + "arbitralnie wybran\u0105 ram\u0119. Co wtedy?\n", + "\n", + "Ujednoznacznianie z wykorzystaniem regu\u0142\n", + "----------------------------------------\n", + "\n", + "Do ujednoznaczniania wypowiedzi u\u017cytkownika mo\u017cna wykorzysta\u0107 monitor stanu dialogu oraz taktyk\u0119\n", + "prowadzenia dialogu. Mo\u017cemy m.in.:\n", + "\n", + " 1. Dopasowa\u0107 niejednoznaczn\u0105 wypowied\u017a do wszystkich dziedzin licz\u0105c na to, \u017ce w toku dialogu\n", + " niejednoznaczno\u015b\u0107 zostanie rozstrzygni\u0119ta (to\n", + " rozwi\u0105zanie zosta\u0142o przyj\u0119te w monitorze `SimpleRuleDST` przedstawionym na zaj\u0119ciach \u00f3smych).\n", + "\n", + " 2. Dopasowa\u0107 niejednoznaczn\u0105 wypowied\u017a wy\u0142\u0105cznie do tej dziedziny, dla kt\u00f3rej stan dialogu zawiera\n", + " wype\u0142nione sloty.\n", + "\n", + " 3. Sprawdzi\u0107 czy wypowied\u017a u\u017cytkownika stanowi odpowied\u017a na pytanie uprzednio zadane przez system\n", + " (pole `request_state` w monitorze `SimpleRuleDST`).\n", + "\n", + " 4. Wykorzysta\u0107 taktyk\u0119 prowadzenia dialogu do zadania pytania, kt\u00f3re rozstrzygnie\n", + " niejednoznaczno\u015b\u0107." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Ujednoznacznianie z wykorzystaniem uczenia maszynowego\n", + "------------------------------------------------------\n", + "\n", + "W procesie uczenia modelu NLU mo\u017cna wykorzysta\u0107 histori\u0119 dialogu jako kontekst (zbi\u00f3r dodatkowych\n", + "cech) warunkuj\u0105cych wynik uczenia.\n", + "Takie podej\u015bcie zosta\u0142o zastosowane w modelu [jointBERT](https://github.com/thu-coai/ConvLab-2/blob/master/convlab2/nlu/jointBERT/jointBERT.py), w kt\u00f3rym kontekst sk\u0142ada si\u0119 z trzech (sklejonych ze sob\u0105) tur dialogu poprzedzaj\u0105cych bie\u017c\u0105c\u0105 wypowied\u017a.\n", + "\n", + "Por\u00f3wnajmy skuteczno\u015b\u0107 modelu bezkontekstowego ze skuteczno\u015bci\u0105 modelu uwzgl\u0119dniaj\u0105cego kontekst.\n", + "Do oceny jako\u015bci wykorzystamy zbi\u00f3r danych [MultiWOZ](https://github.com/budzianowski/multiwoz) (Budzianowski i in., 2018)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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, + "metadata": { + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "data['utterance'][:3]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "data['dialog_act'][:3]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Precision, recall oraz F1 obu modeli zmierzymy korzystaj\u0105c z funkcji `evaluate`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Zmierzmy skuteczno\u015b\u0107 modelu bezkontekstowego." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "metadata": { + "lines_to_next_cell": 0 + }, + "source": [ + "Zmierzmy skutecznos\u0107 modelu uwzgl\u0119dniaj\u0105cego kontekst." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "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", + "metadata": {}, + "source": [ + "Literatura\n", + "----------\n", + " 1. Pawel Budzianowski, Tsung-Hsien Wen, Bo-Hsiang Tseng, I\u00f1igo 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" + }, + "author": "Marek Kubis", + "email": "mkubis@amu.edu.pl", + "lang": "pl", + "subtitle": "12.Ujednoznacznianie wypowiedzi u\u017cytkownika[laboratoria]", + "title": "Systemy Dialogowe", + "year": "2021" + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/src/components/DP.py b/src/components/DP.py index 927e69d..38242ec 100644 --- a/src/components/DP.py +++ b/src/components/DP.py @@ -23,7 +23,7 @@ class DP: break return ["Cinema", systemAct, slotVal, ""] elif (lastUserAct == "request"): - # todo policy for user request + # TODO policy for user request return ["Cinema", "", "", ""] else: systemAct = "repeat" diff --git a/src/components/DST.py b/src/components/DST.py index 1699122..72e4261 100644 --- a/src/components/DST.py +++ b/src/components/DST.py @@ -74,8 +74,8 @@ class DST: "date": "", "time": "", "quantity": "", - "seats": "", "area": "", + "seats": "", "interval": "", }, "semi": { diff --git a/src/dialogue_system.py b/src/dialogue_system.py index 333058d..e0abf19 100644 --- a/src/dialogue_system.py +++ b/src/dialogue_system.py @@ -18,7 +18,7 @@ def chatbot(): # main loop while isActive: - userMessage = input("$") + userMessage = input("$ ") if userMessage == "/exit": print("Do usłyszenia") isActive = False @@ -29,5 +29,5 @@ def chatbot(): # print(dst.state) dpAct = dp.getAction(dst.getLastUserAct(), dst.getEmptySlots(), dst.getSystemSlots()) print(dpAct) - # todo update DST system act + # TODO update DST system act chatbot() \ No newline at end of file