diff --git a/.gitignore b/.gitignore index 374c3c4..9274a22 100644 --- a/.gitignore +++ b/.gitignore @@ -215,4 +215,6 @@ fabric.properties slot-model -ConvLab-2 \ No newline at end of file +ConvLab-2 + +resources \ No newline at end of file diff --git a/README.md b/README.md index 2ec0201..1f0fbc4 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb b/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb index cb10ad7..a1d21e3 100644 --- a/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb +++ b/lab/08-parsing-semantyczny-uczenie(zmodyfikowany).ipynb @@ -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: , 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: , 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, , \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\u001b[1;34m()\u001b[0m\n\u001b[0;32m 37\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mrecall: \u001b[39m\u001b[39m\"\u001b[39m, recallScore)\n\u001b[0;32m 38\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m\"\u001b[39m\u001b[39mf1: \u001b[39m\u001b[39m\"\u001b[39m, f1Score)\n\u001b[1;32m---> 40\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 14\u001b[0m fp \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[0;32m 15\u001b[0m fn \u001b[39m=\u001b[39m \u001b[39m0\u001b[39m\n\u001b[1;32m---> 16\u001b[0m sentences \u001b[39m=\u001b[39m [sentence \u001b[39mfor\u001b[39;00m sentence \u001b[39min\u001b[39;00m testset]\n\u001b[0;32m 17\u001b[0m \u001b[39mfor\u001b[39;00m sentence \u001b[39min\u001b[39;00m sentences:\n\u001b[0;32m 18\u001b[0m \u001b[39m# get sentence as terms list\u001b[39;00m\n\u001b[0;32m 19\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", diff --git a/src/components/NLU.py b/src/components/NLU.py index 9c2f4e9..a263df1 100644 --- a/src/components/NLU.py +++ b/src/components/NLU.py @@ -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: diff --git a/src/dialogue_system.py b/src/dialogue_system.py index 41ca86e..333058d 100644 --- a/src/dialogue_system.py +++ b/src/dialogue_system.py @@ -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()) diff --git a/tasks/zad8/pl/dataSentence/test.tsv b/tasks/zad8/pl/dataSentence/test.tsv new file mode 100644 index 0000000..2ef0b94 --- /dev/null +++ b/tasks/zad8/pl/dataSentence/test.tsv @@ -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 diff --git a/tasks/zad8/pl/dataSentence/train.tsv b/tasks/zad8/pl/dataSentence/train.tsv new file mode 100644 index 0000000..0d9a755 --- /dev/null +++ b/tasks/zad8/pl/dataSentence/train.tsv @@ -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 diff --git a/tasks/zad8/pl/intentClassification.py b/tasks/zad8/pl/intentClassification.py index b3932f9..371dead 100644 --- a/tasks/zad8/pl/intentClassification.py +++ b/tasks/zad8/pl/intentClassification.py @@ -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) \ No newline at end of file +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) \ No newline at end of file diff --git a/tasks/zad8/pl/train.conllu b/tasks/zad8/pl/train.conllu index 5b96485..9d7959a 100644 --- a/tasks/zad8/pl/train.conllu +++ b/tasks/zad8/pl/train.conllu @@ -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