lab 12
This commit is contained in:
parent
4dc305507e
commit
cf5e0585d1
@ -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**
|
- 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
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -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/)."
|
"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",
|
"cell_type": "code",
|
||||||
"execution_count": 7,
|
"execution_count": 7,
|
||||||
@ -249,7 +256,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 29,
|
"execution_count": 4,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [],
|
"outputs": [],
|
||||||
"source": [
|
"source": [
|
||||||
@ -262,7 +269,7 @@
|
|||||||
"from flair.models import SequenceTagger\n",
|
"from flair.models import SequenceTagger\n",
|
||||||
"from flair.trainers import ModelTrainer\n",
|
"from flair.trainers import ModelTrainer\n",
|
||||||
"from flair.datasets import DataLoader\n",
|
"from flair.datasets import DataLoader\n",
|
||||||
"\n",
|
"import flair\n",
|
||||||
"# determinizacja obliczeń\n",
|
"# determinizacja obliczeń\n",
|
||||||
"import random\n",
|
"import random\n",
|
||||||
"import torch\n",
|
"import torch\n",
|
||||||
@ -277,6 +284,27 @@
|
|||||||
" torch.backends.cudnn.deterministic = True"
|
" 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",
|
"cell_type": "markdown",
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
@ -505,16 +533,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cell_type": "code",
|
"cell_type": "code",
|
||||||
"execution_count": 46,
|
"execution_count": 47,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"outputs": [
|
"outputs": [
|
||||||
{
|
{
|
||||||
"data": {
|
"data": {
|
||||||
"text/plain": [
|
"text/plain": [
|
||||||
"[('co', 'O'), ('gracie', 'O'), ('obecnie', 'O')]"
|
"[('poprosze', 'O'), ('bilet', 'O'), ('na', 'O'), ('batman', 'B-title')]"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"execution_count": 46,
|
"execution_count": 47,
|
||||||
"metadata": {},
|
"metadata": {},
|
||||||
"output_type": "execute_result"
|
"output_type": "execute_result"
|
||||||
}
|
}
|
||||||
|
211
lab/12-ujednoznacznianie.ipynb
Normal file
211
lab/12-ujednoznacznianie.ipynb
Normal file
@ -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",
|
||||||
|
"<div class=\"alert alert-block alert-info\">\n",
|
||||||
|
"<h1> Systemy Dialogowe </h1>\n",
|
||||||
|
"<h2> 12. <i>Ujednoznacznianie wypowiedzi u\u017cytkownika</i> [laboratoria]</h2> \n",
|
||||||
|
"<h3> Marek Kubis (2021)</h3>\n",
|
||||||
|
"</div>\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
|
||||||
|
}
|
@ -23,7 +23,7 @@ class DP:
|
|||||||
break
|
break
|
||||||
return ["Cinema", systemAct, slotVal, ""]
|
return ["Cinema", systemAct, slotVal, ""]
|
||||||
elif (lastUserAct == "request"):
|
elif (lastUserAct == "request"):
|
||||||
# todo policy for user request
|
# TODO policy for user request
|
||||||
return ["Cinema", "", "", ""]
|
return ["Cinema", "", "", ""]
|
||||||
else:
|
else:
|
||||||
systemAct = "repeat"
|
systemAct = "repeat"
|
||||||
|
@ -74,8 +74,8 @@ class DST:
|
|||||||
"date": "",
|
"date": "",
|
||||||
"time": "",
|
"time": "",
|
||||||
"quantity": "",
|
"quantity": "",
|
||||||
"seats": "",
|
|
||||||
"area": "",
|
"area": "",
|
||||||
|
"seats": "",
|
||||||
"interval": "",
|
"interval": "",
|
||||||
},
|
},
|
||||||
"semi": {
|
"semi": {
|
||||||
|
@ -18,7 +18,7 @@ def chatbot():
|
|||||||
|
|
||||||
# main loop
|
# main loop
|
||||||
while isActive:
|
while isActive:
|
||||||
userMessage = input("$")
|
userMessage = input("$ ")
|
||||||
if userMessage == "/exit":
|
if userMessage == "/exit":
|
||||||
print("Do usłyszenia")
|
print("Do usłyszenia")
|
||||||
isActive = False
|
isActive = False
|
||||||
@ -29,5 +29,5 @@ def chatbot():
|
|||||||
# print(dst.state)
|
# print(dst.state)
|
||||||
dpAct = dp.getAction(dst.getLastUserAct(), dst.getEmptySlots(), dst.getSystemSlots())
|
dpAct = dp.getAction(dst.getLastUserAct(), dst.getEmptySlots(), dst.getSystemSlots())
|
||||||
print(dpAct)
|
print(dpAct)
|
||||||
# todo update DST system act
|
# TODO update DST system act
|
||||||
chatbot()
|
chatbot()
|
Loading…
Reference in New Issue
Block a user