add intent classifier
This commit is contained in:
parent
184bc462e0
commit
4dc305507e
4
.gitignore
vendored
4
.gitignore
vendored
@ -215,4 +215,6 @@ fabric.properties
|
||||
|
||||
slot-model
|
||||
|
||||
ConvLab-2
|
||||
ConvLab-2
|
||||
|
||||
resources
|
@ -4,7 +4,7 @@
|
||||
|
||||
- uczenie modelu realizowane jest w zmodyfikowanym pliku z zajęć **lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb**
|
||||
|
||||
- dane uczące, wygenerowane są automatycznie, na podstawie zebranych wcześniej dialogów, przez regułowy skrypt **tasks/zad8/pl/annotate.py**, a następnie poprawione ręcznie. Dane znajdują sie w dwóch plikach **tasks/zad8/pl/test.conllu** oraz **tasks/zad8/pl/train.conllu**
|
||||
- dane uczące, generowane są automatycznie, na podstawie zebranych wcześniej dialogów, przez regułowy skrypt **tasks/zad8/pl/annotate.py**, a następnie poprawione ręcznie. Dane znajdują sie w dwóch plikach **tasks/zad8/pl/test.conllu** oraz **tasks/zad8/pl/train.conllu**
|
||||
|
||||
- model wykorzystywany jest w klasie z pliku **src/components/NLU.py**
|
||||
|
||||
@ -12,6 +12,8 @@
|
||||
|
||||
- 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
|
||||
|
||||
---
|
||||
|
||||
## Zadanie 9/10 DST i DP
|
||||
|
@ -80,7 +80,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@ -249,12 +249,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"execution_count": 29,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from flair.data import Corpus, Sentence, Token\n",
|
||||
"from flair.datasets import SentenceDataset\n",
|
||||
"from flair.datasets import SentenceDataset, CSVClassificationCorpus\n",
|
||||
"from flair.embeddings import StackedEmbeddings\n",
|
||||
"from flair.embeddings import WordEmbeddings\n",
|
||||
"from flair.embeddings import CharacterEmbeddings\n",
|
||||
@ -286,7 +286,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"execution_count": 30,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@ -294,7 +294,7 @@
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Corpus: 346 train + 38 dev + 32 test sentences\n",
|
||||
"Dictionary with 78 tags: <unk>, O, O/reqmore, B-interval/reqmore, I-interval/reqmore, O/inform, B-title/inform, B-date/inform, I-date/inform, B-time/inform, B-quantity/inform, B-area/inform, I-area/inform, B-goal/inform, O/bye, O/hello, O/reqmore inform, B-goal/reqmore inform, I-goal/reqmore inform, B-date/reqmore inform, B-interval/reqmore inform, O/null, O/help, B-goal/reqmore, I-goal/reqmore, B-title/reqmore, B-title/reqmore inform, I-title/reqmore inform, O/ack, O/reqalts\n"
|
||||
"Dictionary with 20 tags: <unk>, O, B-interval, I-interval, B-title, B-date, I-date, B-time, B-quantity, B-area, I-area, B-goal, I-goal, I-title, I-time, I-quantity, B-seats, I-seats, <START>, <STOP>\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -320,7 +320,7 @@
|
||||
"\n",
|
||||
" return SentenceDataset(fsentences)\n",
|
||||
"\n",
|
||||
"corpus = Corpus(train=conllu2flair(trainset, 'slot', \"frame\"), test=conllu2flair(testset, 'slot', \"frame\"))\n",
|
||||
"corpus = Corpus(train=conllu2flair(trainset, 'slot'), test=conllu2flair(testset, 'slot'))\n",
|
||||
"print(corpus)\n",
|
||||
"tag_dictionary = corpus.make_tag_dictionary(tag_type='slot')\n",
|
||||
"print(tag_dictionary)"
|
||||
@ -335,7 +335,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"execution_count": 31,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -418,7 +418,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 9,
|
||||
"execution_count": 44,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@ -480,14 +480,14 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"execution_count": 45,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-05-22 15:25:19,970 loading file slot-model/final-model.pt\n"
|
||||
"2022-05-30 22:30:48,788 loading file slot-model/final-model.pt\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -505,16 +505,16 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 11,
|
||||
"execution_count": 46,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[('co', 'O/reqmore'), ('gracie', 'O/reqmore'), ('obecnie', 'O/reqmore')]"
|
||||
"[('co', 'O'), ('gracie', 'O'), ('obecnie', 'O')]"
|
||||
]
|
||||
},
|
||||
"execution_count": 11,
|
||||
"execution_count": 46,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@ -526,7 +526,7 @@
|
||||
" model.predict(fsentence)\n",
|
||||
" return [(token, ftoken.get_tag('slot').value) for token, ftoken in zip(sentence, fsentence)]\n",
|
||||
"\n",
|
||||
"predict(model, 'co gracie obecnie'.split())"
|
||||
"predict(model, 'poprosze bilet na batman'.split())"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -569,19 +569,16 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"execution_count": 43,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"ename": "NameError",
|
||||
"evalue": "name 'testset' is not defined",
|
||||
"output_type": "error",
|
||||
"traceback": [
|
||||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
|
||||
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
|
||||
"\u001b[1;32mc:\\Develop\\wmi\\AITECH\\sem1\\Systemy dialogowe\\lab\\08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb Cell 25'\u001b[0m in \u001b[0;36m<cell line: 40>\u001b[1;34m()\u001b[0m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=36'>37</a>\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mrecall: \u001b[39m\u001b[39m\"\u001b[39m, recallScore)\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=37'>38</a>\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mf1: \u001b[39m\u001b[39m\"\u001b[39m, f1Score)\n\u001b[1;32m---> <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=39'>40</a>\u001b[0m \u001b[39meval\u001b[39;49m()\n",
|
||||
"\u001b[1;32mc:\\Develop\\wmi\\AITECH\\sem1\\Systemy dialogowe\\lab\\08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb Cell 25'\u001b[0m in \u001b[0;36meval\u001b[1;34m()\u001b[0m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=13'>14</a>\u001b[0m fp \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=14'>15</a>\u001b[0m fn \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[1;32m---> <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=15'>16</a>\u001b[0m sentences \u001b[39m=\u001b[39m [sentence \u001b[39mfor\u001b[39;00m sentence \u001b[39min\u001b[39;00m testset]\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=16'>17</a>\u001b[0m \u001b[39mfor\u001b[39;00m sentence \u001b[39min\u001b[39;00m sentences:\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=17'>18</a>\u001b[0m \u001b[39m# get sentence as terms list\u001b[39;00m\n\u001b[0;32m <a href='vscode-notebook-cell:/c%3A/Develop/wmi/AITECH/sem1/Systemy%20dialogowe/lab/08-parsing-semantyczny-uczenie%28zmodyfikowany%29.ipynb#ch0000024?line=18'>19</a>\u001b[0m termsList \u001b[39m=\u001b[39m [w[\u001b[39m\"\u001b[39m\u001b[39mform\u001b[39m\u001b[39m\"\u001b[39m] \u001b[39mfor\u001b[39;00m w \u001b[39min\u001b[39;00m sentence]\n",
|
||||
"\u001b[1;31mNameError\u001b[0m: name 'testset' is not defined"
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n",
|
||||
"KeyboardInterrupt\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@ -608,7 +605,9 @@
|
||||
" # predict tags\n",
|
||||
" predTags = [tag[1] for tag in predict(model, termsList)]\n",
|
||||
" \n",
|
||||
" expTags = [token[\"slot\"] + \"/\" + token[\"frame\"] for token in sentence]\n",
|
||||
" # expTags = [token[\"slot\"] + \"/\" + token[\"frame\"] for token in sentence]\n",
|
||||
" expTags = [token[\"slot\"] for token in sentence]\n",
|
||||
"\n",
|
||||
" for i in range(len(predTags)):\n",
|
||||
" if (expTags[i][0] == \"O\" and expTags[i] != predTags[i]):\n",
|
||||
" fp += 1\n",
|
||||
@ -642,6 +641,191 @@
|
||||
" 4. Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N. Gomez, Lukasz Kaiser, Illia Polosukhin, Attention is All you Need, NIPS 2017, pp. 5998-6008, https://arxiv.org/abs/1706.03762\n",
|
||||
" 5. Alan Akbik, Duncan Blythe, Roland Vollgraf, Contextual String Embeddings for Sequence Labeling, Proceedings of the 27th International Conference on Computational Linguistics, pp. 1638–1649, https://www.aclweb.org/anthology/C18-1139.pdf\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"### Predykcja aktów mowy użytkownika"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 36,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-05-30 22:08:33,633 Reading data from ..\\tasks\\zad8\\pl\\dataSentence\n",
|
||||
"2022-05-30 22:08:33,633 Train: ..\\tasks\\zad8\\pl\\dataSentence\\train.tsv\n",
|
||||
"2022-05-30 22:08:33,634 Dev: None\n",
|
||||
"2022-05-30 22:08:33,635 Test: ..\\tasks\\zad8\\pl\\dataSentence\\test.tsv\n",
|
||||
"Corpus: 280 train + 31 dev + 32 test sentences\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"def conllu2flair(sentences, label2=None):\n",
|
||||
" fsentences = []\n",
|
||||
"\n",
|
||||
" for sentence in sentences:\n",
|
||||
" fsentence = Sentence()\n",
|
||||
"\n",
|
||||
" for token in sentence:\n",
|
||||
" ftoken = Token(token['form'])\n",
|
||||
"\n",
|
||||
" \n",
|
||||
" if label2:\n",
|
||||
" ftoken.add_tag(label2, token[label2])\n",
|
||||
" \n",
|
||||
" fsentence.add_token(ftoken)\n",
|
||||
"\n",
|
||||
" fsentences.append(fsentence)\n",
|
||||
"\n",
|
||||
" return SentenceDataset(fsentences)\n",
|
||||
"\n",
|
||||
"trainPath = \"../tasks/zad8/pl/dataSentence/train.tsv\"\n",
|
||||
"testPath = \"../tasks/zad8/pl/dataSentence/test.tsv\"\n",
|
||||
"dataFolder = \"../tasks/zad8/pl/dataSentence\"\n",
|
||||
"column_name_map = {0: \"text\", 1: \"label_topic\"}\n",
|
||||
"corpusClassification = CSVClassificationCorpus(dataFolder,\n",
|
||||
" column_name_map,\n",
|
||||
" skip_header=False,\n",
|
||||
" delimiter='\\t',\n",
|
||||
")\n",
|
||||
"print(corpusClassification)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 40,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-05-30 22:10:19,891 Computing label dictionary. Progress:\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"100%|██████████| 312/312 [00:04<00:00, 68.32it/s] "
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-05-30 22:10:25,276 [b'inform', b'reqmore', b'hello', b'infomrm', b'reqmore inform', b'bye', b'ack', b'reqalts', b'impl-conf inform', b'help', b'request', b'affirm', b'thankyou', b'affirm inform', b'bye thankyou', b'hello inform', b'infrom', b'confirm', b'negate confirm', b'negate', b'negate ', b'deny']\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"from flair.data import Corpus\n",
|
||||
"from flair.datasets import TREC_6\n",
|
||||
"from flair.embeddings import WordEmbeddings, FlairEmbeddings, DocumentRNNEmbeddings\n",
|
||||
"from flair.models import TextClassifier\n",
|
||||
"from flair.trainers import ModelTrainer\n",
|
||||
"\n",
|
||||
"from os.path import exists\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"# 2. create the label dictionary\n",
|
||||
"label_dict = corpusClassification.make_label_dictionary()\n",
|
||||
"\n",
|
||||
"# 3. make a list of word embeddings\n",
|
||||
"word_embeddings = [\n",
|
||||
" WordEmbeddings('pl'),\n",
|
||||
" FlairEmbeddings('polish-forward'),\n",
|
||||
" FlairEmbeddings('polish-backward'),\n",
|
||||
" CharacterEmbeddings(),\n",
|
||||
"]\n",
|
||||
"\n",
|
||||
"# 4. initialize document embedding by passing list of word embeddings\n",
|
||||
"# Can choose between many RNN types (GRU by default, to change use rnn_type parameter)\n",
|
||||
"document_embeddings = DocumentRNNEmbeddings(word_embeddings, hidden_size=256)\n",
|
||||
"\n",
|
||||
"# 5. create the text classifier\n",
|
||||
"classifier = TextClassifier(document_embeddings, label_dictionary=label_dict)\n",
|
||||
"\n",
|
||||
"# 6. initialize the text classifier trainer\n",
|
||||
"trainer = ModelTrainer(classifier, corpusClassification)\n",
|
||||
"\n",
|
||||
"modelPath = 'resources/taggers/trec/final-model.pt'\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"fileExists = exists(modelPath)\n",
|
||||
"\n",
|
||||
"if(not fileExists):\n",
|
||||
" # 7. start the training\n",
|
||||
" trainer.train('resources/taggers/trec',\n",
|
||||
" learning_rate=0.1,\n",
|
||||
" mini_batch_size=32,\n",
|
||||
" anneal_factor=0.5,\n",
|
||||
" patience=5,\n",
|
||||
" max_epochs=10)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"2022-05-30 22:10:47,199 loading file resources/taggers/trec/final-model.pt\n",
|
||||
"[reqmore (0.5459)]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"classifier = TextClassifier.load(modelPath)\n",
|
||||
"\n",
|
||||
"# create example sentence\n",
|
||||
"sentence = Sentence('Jakie filmy gracie jutro?')\n",
|
||||
"\n",
|
||||
"# predict class and print\n",
|
||||
"classifier.predict(sentence)\n",
|
||||
"\n",
|
||||
"print(sentence.labels)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 42,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"[inform (0.5967)]\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"# create example sentence\n",
|
||||
"sentence = Sentence('siedzenia h1 h2')\n",
|
||||
"\n",
|
||||
"# predict class and print\n",
|
||||
"classifier.predict(sentence)\n",
|
||||
"\n",
|
||||
"print(sentence.labels)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
@ -671,7 +855,7 @@
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.8.10"
|
||||
"version": "3.8.3"
|
||||
},
|
||||
"subtitle": "8.Parsing semantyczny z wykorzystaniem technik uczenia maszynowego[laboratoria]",
|
||||
"title": "Systemy Dialogowe",
|
||||
|
@ -1,19 +1,25 @@
|
||||
import re
|
||||
from flair.data import Sentence, Token
|
||||
from flair.datasets import SentenceDataset
|
||||
from flair.models import SequenceTagger
|
||||
from flair.models import SequenceTagger, TextClassifier
|
||||
|
||||
class NLU:
|
||||
|
||||
def __init__(self):
|
||||
self.nluModel = SequenceTagger.load('./lab/slot-model/final-model.pt')
|
||||
self.nluModelClassifier = TextClassifier.load('./lab/resources/taggers/trec/final-model.pt')
|
||||
self.nluModelTagger = SequenceTagger.load('./lab/slot-model/final-model.pt')
|
||||
|
||||
def predict(self, sentence):
|
||||
# user act prediction
|
||||
sentenceClass = Sentence(sentence)
|
||||
self.nluModelClassifier.predict(sentenceClass)
|
||||
|
||||
# tags prediction
|
||||
sentence = self.getStrCleaned(sentence)
|
||||
csentence = [{'form': word} for word in sentence]
|
||||
fsentence = self.conllu2flair([csentence])[0]
|
||||
self.nluModel.predict(fsentence)
|
||||
return self.toDSTInput([(token, ftoken.get_tag('slot').value) for token, ftoken in zip(sentence, fsentence)])
|
||||
self.nluModelTagger.predict(fsentence)
|
||||
return self.toDSTInput([(token, ftoken.get_tag('slot').value) for token, ftoken in zip(sentence, fsentence)], str(sentenceClass.labels[0]).split(" ")[0])
|
||||
|
||||
def conllu2flair(self, sentences, label=None):
|
||||
fsentences = []
|
||||
@ -42,27 +48,25 @@ class NLU:
|
||||
messageLower = messageLower.replace(char,'')
|
||||
return messageLower.split()
|
||||
|
||||
def toDSTInput(self, taggedSentence):
|
||||
def toDSTInput(self, taggedSentence, intent):
|
||||
result = []
|
||||
intent = None
|
||||
slotValue = None
|
||||
slot = None
|
||||
for tuple in taggedSentence:
|
||||
value, tagInt = tuple
|
||||
if intent is None: intent = tagInt.split("/")[1]
|
||||
if tagInt.split("/")[0] == "O":
|
||||
value, tag = tuple
|
||||
if tag == "O":
|
||||
if slotValue is not None:
|
||||
result.append([intent, 'Cinema', slot, slotValue])
|
||||
slot = None
|
||||
slotValue = None
|
||||
elif tagInt.split("/")[0].split("-")[0] == "B":
|
||||
slot = tagInt.split("/")[0].split("-")[1]
|
||||
elif tag.split("-")[0] == "B":
|
||||
slot = tag.split("-")[1]
|
||||
slotValue = value
|
||||
elif tagInt.split("/")[0].split("-")[0] == "I":
|
||||
elif tag.split("-")[0] == "I":
|
||||
try:
|
||||
slotValue += " " + value
|
||||
except:
|
||||
slot = tagInt.split("/")[0].split("-")[1]
|
||||
slot = tag.split("-")[1]
|
||||
slotValue = value
|
||||
|
||||
if slotValue is not None:
|
||||
|
@ -24,7 +24,7 @@ def chatbot():
|
||||
isActive = False
|
||||
else:
|
||||
nluPred = nlu.predict(sentence=userMessage)
|
||||
# print(nluPred)
|
||||
print(nluPred)
|
||||
dst.update(nluPred)
|
||||
# print(dst.state)
|
||||
dpAct = dp.getAction(dst.getLastUserAct(), dst.getEmptySlots(), dst.getSystemSlots())
|
||||
|
33
tasks/zad8/pl/dataSentence/test.tsv
Normal file
33
tasks/zad8/pl/dataSentence/test.tsv
Normal file
@ -0,0 +1,33 @@
|
||||
Dzień dobry. hello
|
||||
Jakie filmy są w tym tygodniu w repertuarze? reqmore
|
||||
O której godzinie w piątej mogę zobaczyć Na noże? reqmore inform
|
||||
Ok, w takim razie chciałbym zarezerwować 2 miejsca na seans o 19:30. inform
|
||||
Dwa normalne. inform
|
||||
Mogą być. ack
|
||||
Dziękuje bardzo. bye
|
||||
Witam hello
|
||||
Chciałbym zarezerować dwa bilety na Batman inform
|
||||
A kiedy jest najbliższy seans? inform
|
||||
To poproszę trzy bilety na batmana o 15:30 inform
|
||||
Na samym tyle sali inform
|
||||
Dziękuję thankyou
|
||||
Hej hello
|
||||
Chciałbym kupić bilety na seans Zorro - jak to było na prawdę inform
|
||||
Zorro2 inform
|
||||
Poproszę o listę seansów reqmore
|
||||
Poproszę o listę filmów granych jutro wieczorem reqmore inform
|
||||
Chciałbym kupić bilety na film To nie wypanda inform
|
||||
20:15 inform
|
||||
11 inform
|
||||
W środku, pomiedzy górnym i środkowym rzędzie
|
||||
W środku, pomiedzy górnym i środkowym rzędem inform
|
||||
<3 thankyou
|
||||
Dzień dobry hello
|
||||
Chciał bym zamówić bilet na film Minionki dzisiaj o 18.30 inform
|
||||
czy jest jakis film o godzinie 18:30? request
|
||||
niech będzie ack
|
||||
1 inform
|
||||
jakie sš dostępne ulgi?
|
||||
studencka inform
|
||||
daleko od ekranu inform
|
||||
tak ack
|
|
330
tasks/zad8/pl/dataSentence/train.tsv
Normal file
330
tasks/zad8/pl/dataSentence/train.tsv
Normal file
@ -0,0 +1,330 @@
|
||||
Tak. inform
|
||||
Normalny. reqmore
|
||||
Super, poproszę by miejsca były obok siebie. inform
|
||||
Super, czy można płacić z góry? reqmore
|
||||
Ok, czy bilety mam już zarezerwowane? reqmore
|
||||
Super, dziękuję. bye
|
||||
Dzień dobry. hello
|
||||
Chcę zarezerwować bilety. inform
|
||||
Dzisiaj. inform
|
||||
16:30:00 infomrm
|
||||
Cześć. hello
|
||||
Chciałbym anulować rezerwację biletu. inform
|
||||
Numer 42069. inform
|
||||
Numer 42068. inform
|
||||
Numer 42067. inform
|
||||
Chciałbym anulować rezerwację biletu dla imienia i nazwiska Jan Kowalski inform
|
||||
Nie pamiętam. Czy mogę podać e-mail? reqmore
|
||||
elo. hello
|
||||
Chciałbym kupić bilety na seans Zorro - jak to było na prawdę. inform
|
||||
Poproszę listę filmów granych jutro wieczorem reqmore inform
|
||||
Chciałbym kupić bilety na Transformers. inform
|
||||
Tak, chcę dwa bilety za 2 dni. inform
|
||||
Normalne. inform
|
||||
Przy oknie, w przedziale.
|
||||
Wagon z przedziałami, miejsce przy oknie.
|
||||
Tak, ale bardziej z góry. inform
|
||||
Exit. bye
|
||||
Kim jesteś? help
|
||||
Co gracie? reqmore
|
||||
Jaki Zorro? reqmore
|
||||
W jakich godzinach gracie Zorro? reqmore
|
||||
Chciałbym zarezerwować bilety na Batmana. inform
|
||||
21.03.2022. inform
|
||||
23.03.2022. inform
|
||||
Super. ack
|
||||
13:00 inform
|
||||
1 normalny. inform
|
||||
Blisko ekranu. inform
|
||||
Dziękuję, do usłyszenia. bye
|
||||
Dzień dobry. hello
|
||||
chciałbym się dowiedzieć jaki jest cennik. reqmore
|
||||
A jest zniżka studencka? reqmore
|
||||
a co leci dzisiaj w kinie? reqmore inform
|
||||
o której jest na noże? reqmore inform
|
||||
poproszę dwa bilety na 12 inform
|
||||
a jakie są? reqmore
|
||||
2 ulgowe poprosze. inform
|
||||
jakie są wolne miejsca? reqmore
|
||||
Tak. ack
|
||||
Chciałbym 3 bilety na batmana na jtro. inform
|
||||
coś koło południa. reqmore
|
||||
nic później? reqalts
|
||||
To ten o 19. inform
|
||||
2 ulgowe. inform
|
||||
z przodu. inform
|
||||
ale jakie miejsca?? reqmore
|
||||
Dzień dobry. hello
|
||||
Chciałabym zarezerwować bilet do kina. inform
|
||||
Dziś. inform
|
||||
Proszę na batmana. inform
|
||||
Proszę o godzine 20:19. inform
|
||||
ulogwy. inform
|
||||
1. impl-conf inform
|
||||
z tyłu, na środku (aby ekran był centralnie widoczny). inform
|
||||
dobrze, dziekuję. bye
|
||||
Witam hello
|
||||
Co potrafisz? help
|
||||
Jakie są najbliższe seanse? inform
|
||||
A jakie są dostępne? reqmore
|
||||
A w jakim to kinie? request
|
||||
A gdzie jest to kino? reqmore
|
||||
O której grają Uncharted? reqmore inform
|
||||
Ile kosztują bilety na ten film? request
|
||||
A w jaki dzień bielty są tańsze? reqmore
|
||||
w takim razie chciałbym zarezerwować dwa bilety normalne i jeden ulgowy na środę 20:00 inform
|
||||
Na środku sali inform
|
||||
ok ack
|
||||
Witam hello
|
||||
Jaki jest repertuar na piątek? reqmore inform
|
||||
O jakich godzinach grają te filmy? reqmore
|
||||
Wszystkie ack
|
||||
Czy obgługujecie rezerwację biletów grupowych? request
|
||||
Rozumiem, a jak mogę dokonać rezerwacji dla 20 osób? reqmore
|
||||
Tak affirm
|
||||
dziękuję ack
|
||||
Witam hello
|
||||
Czy w kinie Rialto grają jakieś stare filmy? reqmore
|
||||
to dziękuję thankyou
|
||||
Witam hello
|
||||
Czy tylko można u was rezerwować Nachos ?
|
||||
Chciałbym zapytać co u pana hello
|
||||
Poproszę bilet na batmana o 19:00 inform
|
||||
bez ludzi w okolicy inform
|
||||
Czy to wszystko affirm
|
||||
Dzień dobry! hello
|
||||
Chciałbym zarezerwować film
|
||||
Bilet na film inform
|
||||
Jakie filmy są teraz w kinach? request
|
||||
poproszę 3x bilet na ambulans inform
|
||||
niech będzie ten ostatni inform
|
||||
Przedostatnim inform
|
||||
Spoko ack
|
||||
Chciałbym jeszcze kupon na jedzenie
|
||||
Poproszę słony popcorn
|
||||
Duży
|
||||
Nara bye
|
||||
Dzień dobry hello
|
||||
Chciał bym zamówić bilet na film Minionki dzisiaj o 18.30 inform
|
||||
to poprosze ups 2 inform
|
||||
na dzisiaj inform
|
||||
najlepiej 18.30 inform
|
||||
poprosze 18 inform
|
||||
jakie są dostępne miejsca? request
|
||||
które miejsca są daleko od ekranu? reqmore
|
||||
w takim razie poproszę M5 inform
|
||||
dziekuje thankyou
|
||||
Cześć hello
|
||||
Co mogę zarezerwować? reqmore
|
||||
Gdzie znajduje się kino? request
|
||||
Tak, chciałbym iść do multikina na Malcie inform
|
||||
Super, teraz chciałbym zarezerwować bilet na film inform
|
||||
Uncharted inform
|
||||
wybieram godzine 12:00 inform
|
||||
1 miejsce, gdzieś na środku sali inform
|
||||
Pasuje ack
|
||||
Elo help
|
||||
Chciałabym zarezerwować bilet inform
|
||||
Co gracie request
|
||||
Ja bym chciała na Fantsaczne zwierzta inform
|
||||
29.03.2022 inform
|
||||
Jakoś wieczorkiem inform
|
||||
To na 21 prosze inform
|
||||
To na 18 proszę inform
|
||||
Najlepsze inform
|
||||
Moment no ile tych miejsc i czemu nie są w tym samym rzędzie reqmore
|
||||
proszę z managerem
|
||||
Jeden dla mnie i dla kotka proszę inform
|
||||
Dobra, to blikiem proszę
|
||||
Halo halo
|
||||
nie skończyłam
|
||||
Ehhh
|
||||
DZIEŃ DOBRY hello
|
||||
No właśnie. W czym możesz pomóc? help
|
||||
A jedzonko macie? reqmore
|
||||
Nachosy proszę reqmore
|
||||
A jakie sosy do Nachosów? reqmore
|
||||
Chciałabym anulować rezerwację inform
|
||||
123123 inform
|
||||
Dzięki <3 thankyou
|
||||
Dzień dobry hello
|
||||
Chciałabym zmienić rezerwację inform
|
||||
123123 inform
|
||||
Upewniam się ack
|
||||
Dzień dobry hello
|
||||
Chciałbym zarezerwować bilety inform
|
||||
batman inform
|
||||
dzisiaj inform
|
||||
podaj więcej informacji o seansach reqmore
|
||||
podaj więcej informacji o seansie o 15.20 reqmore
|
||||
czy film jest 2D czy 3D? reqmore
|
||||
podaj informacje o napisach/dubbingu reqmore
|
||||
Cześć hello
|
||||
Chciałbym zarezwsfsgf bilet
|
||||
Chciałbym zarezerwować bilet inform
|
||||
Jakie są wyświetlane w najbliższą sobotę? reqmore
|
||||
W których godzinach grany jest film To nie wypanda? reqmore inform
|
||||
W takim razie chciałbym kupić 3 bilety, jeśli możliwe miejsca koło siebie inform
|
||||
Najbliższa sobota inform
|
||||
Godzina 19:30 inform
|
||||
Najlepiej w ostatnim rzędzie inform
|
||||
Chciałbym zapłacić przy odbiorze reqmore
|
||||
Czy moja rezerwacja została potwierdzona? reqmore
|
||||
84372 inform
|
||||
Nie negate
|
||||
Dzień dobry hello
|
||||
Chciałbym dowiedzieć się jakie filmy są wyświetlane w tym tygodniu. reqmore
|
||||
W jakich godzinach mogę zobaczyć Batmana w piątek? reqmore inform
|
||||
Chciałbym zarezerwować 3 miejsca na seans o 17:45 inform
|
||||
Czy są dostępne miejsca w tylnych rzędach? reqmore inform
|
||||
Ok affirm inform
|
||||
Dziękuję, do widzenia bye thankyou
|
||||
Dzień dobry, chciałbym anulować rezerwację hello inform
|
||||
87574 inform
|
||||
Potwierdzam affirm
|
||||
Cześć hello
|
||||
Nie możesz thankyou
|
||||
Dzień dobry, Systemie hello
|
||||
Chciałbym kupić nachos reqmore
|
||||
Jak mogę się do takiej strefy dostać? reqmore
|
||||
W jakim mieście? reqmore
|
||||
Czy można zarezerwować u was bilety na seans? reqmore
|
||||
Jakie polecasz? reqmore
|
||||
Jaką ocenę posiada Batman? reqmore
|
||||
Dobrze. Chciałbym zatem zarezerwować bilet na Innych Ludzi inform
|
||||
22.03.2022 inform
|
||||
Jutro, po godzinie 16:00 inform
|
||||
Jaki jutro jest dzień tygodnia? request
|
||||
To poproszę o rezerwację na 17:45 inform
|
||||
17:45 inform
|
||||
Z tyłu sali, nie na samym końcu inform
|
||||
W jakiej części rzędu znajduje się to miejsce? request
|
||||
Dziękuję thankyou
|
||||
Dzień dobry hello
|
||||
chciałbym kupić dwa bilety na batmana inform
|
||||
jutro inform
|
||||
poproszę na 20:30 inform
|
||||
z tyłu inform
|
||||
w jakiej cenie są bilety? help
|
||||
są zniżki studenckie? help
|
||||
mógłbym kupić bilety? reqmore
|
||||
batman - chciałbym kupić zarezerwowane miejsca reqmore inform
|
||||
dobrze czy wystarczy zachować numer rezerwacji? reqmore
|
||||
dobrze ack
|
||||
witam hello
|
||||
jakie są jutro filmy? reqmore inform
|
||||
o ktorej jest nasze magiczne encanto? reqmore inform
|
||||
poproszę 3 bilety na 18:20 inform
|
||||
na środku inform
|
||||
poproszę jeszcze jedno miejsce obok inform
|
||||
dziekuje thankyou
|
||||
do widzenia bye
|
||||
Co dziś leci reqmore inform
|
||||
Co jest dobre dla dzieci reqmore
|
||||
"Poproszę 2 na ""to nie wypanda""" inform
|
||||
a z przodu gdzieś inform
|
||||
eee a o której?? request
|
||||
Dzień dobry hello
|
||||
Chciałabym zarezerwować bilet do kina inform
|
||||
Wyjdż za mnie inform
|
||||
The batman inform
|
||||
Dziś wieczorem inform
|
||||
Proszę o godzinie 20:15 inform
|
||||
z tyłu, na środku (aby ekran był centralnie widoczny) inform
|
||||
Dobrze, dziękuję thankyou
|
||||
cześć hello
|
||||
chciałbym sprawdzić repertuar kin reqmore
|
||||
na dzisiaj inform
|
||||
Witam hello
|
||||
Jakie sš najbliższe seanse? reqmore
|
||||
W jakim to kinie? reqmore
|
||||
A gdzie jest to kino? reqmore
|
||||
Ile kosztujš bilety na Inni ludzie? reqmore
|
||||
oba inform
|
||||
A w jaki dzień bilety sš tańsze? reqmore
|
||||
W takim razie chciałbym zarezerwować dwa bilety na czwartek na film Inni Ludzie inform
|
||||
Jeden normalny i ulgowy inform
|
||||
Na środku Sali inform
|
||||
Chciałem zarezerwować dwa miejsca reqmore
|
||||
Zgadzam się infrom
|
||||
Tak inform
|
||||
Jaki jest koszt tej rezerwacji? reqmore
|
||||
A ile kosztuje bilety łącznie? reqmore
|
||||
ok. Dziękuję ack
|
||||
Witam hello
|
||||
Chciałbym zarezerwować bilet ale nie wiem na co. inform
|
||||
Czy film Historia mojej żony jest ciekawy ? reqmore
|
||||
Dobrze to poproszę inform
|
||||
Ulgowy inform
|
||||
czy jest jakaś maksymalna liczba ? reqmore
|
||||
to poproszę 100 inform
|
||||
tak jak powiedziałem ulgowe inform
|
||||
środek Sali inform
|
||||
tak confirm
|
||||
Nie dziękuje negate confirm
|
||||
Dzień dobry! hello
|
||||
Chciałbym zarezerwować seans. Bilet na seans inform
|
||||
Jakie filmy są obecnie na ekranach? reqmore
|
||||
Sobota inform
|
||||
Poproszę 2 bilety na innych ludzi inform
|
||||
jeden ulgowy i jeden zwykły inform infrom
|
||||
Na środku Sali infrom
|
||||
Pewnie ack
|
||||
czy te miejsca sš obok siebie? reqmore
|
||||
Dzień dobry hello
|
||||
Chciałabym zarezerwować bilety inform
|
||||
Jaki film jest grany jutro w godzinach popołudniowych? request
|
||||
Czy sš wcześniejsze seanse? reqmore
|
||||
W takim razie chcę zarezerwować bilety na Psie Pazury inform
|
||||
Komu przysługuje ulga?
|
||||
Kim jest senior?
|
||||
W takim razie chcę zarezerwować normalne bilety na Psie Pazury inform
|
||||
Na środku inform
|
||||
3 inform
|
||||
Tak ack
|
||||
Ale chciałam 3 bilety negate
|
||||
zgadzam się ack
|
||||
tak ack
|
||||
nier negate
|
||||
tak ack
|
||||
nie
|
||||
Dzień dobry hello
|
||||
Chciałbym dowiedzieć się jaki jest aktualnie repertuar request
|
||||
Jutro jest w repertuarze film inni ludzie? request
|
||||
Ile kosztuje bilet na ten film? request
|
||||
ulogwy
|
||||
W górnej części sali inform
|
||||
Gdzie znajduje się to miejsce względem ekranu? reqmore
|
||||
Chciałbym na środku inform
|
||||
zgadzam ack
|
||||
jaka jest cena? reqmore
|
||||
Dobrze, rezerwuje ack
|
||||
Chciałbym anulować rezerwację deny
|
||||
Dziekuje bye
|
||||
Cześć hello
|
||||
Co można u was zjeść? request
|
||||
Co można obejrzeć w kwietniu request
|
||||
kiedy gracie DKF zamek? request
|
||||
poproszę dwa bilety ulgowe na 25/04/2022 12:15 15:50 inform
|
||||
pierwszy rzšd po lewej stronie inform
|
||||
Tak ack
|
||||
zgadzam się ack
|
||||
Jaki jest numer mojej rezerwacji reqmore
|
||||
Dziękuję systemie thankyou
|
||||
Siema hello
|
||||
Chcę iść do kina inform
|
||||
Co gracie request
|
||||
To na fdantastyczne zwierznera prosze inform
|
||||
A co macie request
|
||||
A na za tydzień? request
|
||||
To na za tydzień na cud guadalupe proszę inform
|
||||
To na coś innego request
|
||||
Dzisiaj inform
|
||||
Zaskocz mnie
|
||||
No to jakoś niech będzie jakoś to będzie inform
|
||||
Jeden dla mnie, drugi dla kota
|
||||
To jeden będzie infrom
|
||||
normalny
|
||||
na środku gdzieś inform
|
||||
Niech będzie ack
|
||||
jakieś potwierdzenie rezerwacji dostanę czy mogę po prostu wejść i usišść? request
|
|
@ -1,9 +1,19 @@
|
||||
import pandas as pd
|
||||
from sympy import true
|
||||
|
||||
def flatten(t):
|
||||
return [item for sublist in t for item in sublist]
|
||||
|
||||
def getData():
|
||||
# def getStrCleaned(rawMessage):
|
||||
# # / and : is needed for date and time recognition
|
||||
# punctuation = '!"#$%&\'()*+,-.;<=>?@[\\\\]^_`{|}~'
|
||||
# messageLower = rawMessage.lower()
|
||||
# # new_str = re.sub(' +', ' ', new_str)
|
||||
# for char in punctuation:
|
||||
# messageLower = messageLower.replace(char,'')
|
||||
# return messageLower.split()
|
||||
|
||||
def getData(testData):
|
||||
Xdata = []
|
||||
Ydata = []
|
||||
pathOut = './tasks/zad8/pl/'
|
||||
@ -14,15 +24,27 @@ def getData():
|
||||
for i in range(16,20):
|
||||
for j in range(20):
|
||||
for nr in range(1,5):
|
||||
fileName = pathIn + "dialog-" + str(i).zfill(2) + "-" + str(j).zfill(2) + "-" + str(nr).zfill(2) + ".tsv"
|
||||
fileName = pathIn + "dialog-" + str(i).zfill(2) + "-" + str(j).zfill(2) + "-" + str(nr).zfill(2)
|
||||
if testData: fileName += "(test)"
|
||||
fileName += ".tsv"
|
||||
try:
|
||||
df = pd.read_csv(fileName, sep='\t', header=None, encoding="utf-8")
|
||||
Xdata.append(df[1].tolist())
|
||||
Ydata.append(df[2].tolist())
|
||||
dfSys = df[df[0] == "user"]
|
||||
dfSys.dropna()
|
||||
Xdata.append(dfSys[1].tolist())
|
||||
Ydata.append(dfSys[2].tolist())
|
||||
# Xdata = [getStrCleaned(x) for x in Xdata]
|
||||
except:
|
||||
pass
|
||||
return flatten(Xdata), flatten(Ydata)
|
||||
|
||||
x,y = getData()
|
||||
x, y = getData(False)
|
||||
xTest, yTest = getData(True)
|
||||
dataTuples = list(zip(x, y))
|
||||
testDataTuples = list(zip(xTest, yTest))
|
||||
|
||||
print(y)
|
||||
df = pd.DataFrame(dataTuples)
|
||||
dfTest = pd.DataFrame(testDataTuples)
|
||||
|
||||
df.to_csv('tasks/zad8/pl/dataSentence/train.tsv', sep="\t", index=False, header=None)
|
||||
dfTest.to_csv('tasks/zad8/pl/dataSentence/test.tsv', sep="\t", index=False, header=None)
|
@ -2369,11 +2369,11 @@
|
||||
7 12:15 inform B-time
|
||||
8 15:50 inform B-time
|
||||
|
||||
# text: pierwszy rzšd po lewej stronie
|
||||
# text: pierwszy rząd po lewej stronie
|
||||
# intent: inform
|
||||
# slots: pierwszyrzšdpopolewej:area
|
||||
# slots: pierwszyrządpopolewej:area
|
||||
1 pierwszy inform B-area
|
||||
2 rzšd inform I-area
|
||||
2 rząd inform I-area
|
||||
3 po inform I-area
|
||||
4 lewej inform I-area
|
||||
5 stronie inform NoLabel
|
||||
|
Loading…
Reference in New Issue
Block a user