From 70606851a1821eff0571eaa22ac6fbf4f76c3ec3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20J=C4=99dyk?= Date: Sun, 30 May 2021 12:55:49 +0200 Subject: [PATCH] new NLU using ML --- .gitignore | 4 +- NaturalLanguageUnderstanding.py | 131 ++++- UserActType.py | 16 +- book.jsgf | 29 -- data/dialog-08-03-01.tsv | 10 +- data/dialog-08-05-01.tsv | 10 +- data/dialog-08-07-01.tsv | 8 +- data/dialog-08-09-01.tsv | 12 +- data/dialog-08-11-01.tsv | 10 +- data/dialog-08-13-01.tsv | 10 +- data/dialog-08-15-01.tsv | 6 +- data/dialog-09-04-01.tsv | 10 +- data/dialog-09-06-01.tsv | 12 +- data/dialog-09-08-01.tsv | 14 +- data/dialog-09-10-01.tsv | 12 +- data/dialog-09-12-01.tsv | 8 +- data/dialog-09-14-01.tsv | 8 +- data/dialog-10-01-01.tsv | 4 +- data/dialog-10-03-01.tsv | 8 +- data/dialog-10-05-01.tsv | 8 +- data/dialog-10-07-01.tsv | 6 +- data/dialog-10-09-01.tsv | 26 +- data/dialog-10-11-01.tsv | 8 +- data/dialog-10-13-01.tsv | 8 +- data/dialog-10-15-01.tsv | 6 +- data/dialog-11-04-01.tsv | 10 +- data/dialog-11-06-01.tsv | 10 +- data/dialog-11-08-01.tsv | 14 +- data/dialog-11-10-01.tsv | 10 +- data/dialog-11-12-01.tsv | 6 +- data/dialog-11-14-01.tsv | 10 +- data/train.conllu | 856 ++++++++++++++++++++++++++++++++ eval2.py | 34 -- evaluate.py | 25 +- main.py | 14 +- test_nlu.py | 43 ++ train_frame_nlu.py | 62 +++ train_slot_nlu.py | 62 +++ 38 files changed, 1300 insertions(+), 240 deletions(-) delete mode 100644 book.jsgf create mode 100644 data/train.conllu delete mode 100644 eval2.py create mode 100644 test_nlu.py create mode 100644 train_frame_nlu.py create mode 100644 train_slot_nlu.py diff --git a/.gitignore b/.gitignore index 0b81a20..64da0ce 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /venv -__pycache__ \ No newline at end of file +__pycache__ +frame-model +slot-model \ No newline at end of file diff --git a/NaturalLanguageUnderstanding.py b/NaturalLanguageUnderstanding.py index 9127206..1be9368 100644 --- a/NaturalLanguageUnderstanding.py +++ b/NaturalLanguageUnderstanding.py @@ -1,30 +1,125 @@ +from typing import get_args from UserActType import UserActType from UserAct import UserAct -import jsgf +from flair.data import Sentence, Token +from flair.datasets import SentenceDataset +from flair.models import SequenceTagger class NLU: def __init__(self): - self.book_grammar = jsgf.parse_grammar_file('book.jsgf') + self.frame_model = SequenceTagger.load('frame-model/final-model.pt') + self.slot_model = SequenceTagger.load('slot-model/final-model.pt') - def get_dialog_act(self, rule): - slots = [] - self.get_slots(rule.expansion, slots) - return UserAct(UserActType[rule.name.upper()], slots) + def conllu2flair(self, sentences, label=None): + fsentences = [] + for sentence in sentences: + fsentence = Sentence() + for token in sentence: + ftoken = Token(token['form']) + if label: + ftoken.add_tag(label, token[label]) + fsentence.add_token(ftoken) + fsentences.append(fsentence) + return SentenceDataset(fsentences) - def get_slots(self, expansion, slots): - if expansion.tag != '': - slots.append((expansion.tag, expansion.current_match)) - return + def get_act_type_from_intent(self, intent): + if 'inform' in intent: + return UserActType.INFORM + elif 'meeting' in intent: + if 'create' in intent: + return UserActType.CREATE_MEETING + elif 'update' in intent: + return UserActType.UPDATE_MEETING + elif 'cancel' in intent: + return UserActType.CANCEL_MEETING + elif 'list' in intent: + return UserActType.MEETING_LIST + elif 'free_time' in intent: + return UserActType.FREE_TIME + elif 'hello' in intent: + return UserActType.HELLO + elif 'bye' in intent: + return UserActType.BYE + elif 'confirm' in intent: + return UserActType.CONFIRM + elif 'negate' in intent: + return UserActType.NEGATE + elif 'thankyou' in intent: + return UserActType.THANKYOU + else: + return UserActType.INVALID - for child in expansion.children: - self.get_slots(child, slots) + def get_slots(self, slots): + arguments = [] + candidate = None + for slot in slots: + if slot[1].startswith("B-"): + if(candidate != None): + arguments.append(candidate) + candidate = [slot[1].replace("B-", ""), slot[0]] + if slot[1].startswith("I-") and candidate != None and slot[1].endswith(candidate[0]): + candidate[1] += " " + slot[0] + if(candidate != None): + arguments.append(candidate) + temp_slots = [(x[0], x[1]) for x in arguments] + final_slots = [] + description_slot = '' + place_slot = '' + for slot in temp_slots: + if slot[0] == 'description': + if description_slot != '': + description_slot += ' ' + description_slot += slot[1] + elif slot[0] == 'place': + if place_slot != '': + place_slot += ' ' + place_slot += slot[1] + elif slot[0] == 'date': + slot_value = slot[1].casefold() + if len(slot_value) > 3: + final_slots.append(('date', slot_value.strip('.'))) + elif slot[0] == 'time': + numeric = False + for char in slot[1]: + if char.isdigit(): + numeric = True + if numeric: + final_slots.append(('time', slot[1].strip('.'))) + elif slot[0] == 'participant': + if len(slot[1]) > 3: + final_slots.append(('participant', slot[1].strip('.'))) + else: + final_slots.append(slot) + if description_slot != '': + final_slots.append(('description', description_slot.strip('.'))) + if place_slot != '': + final_slots.append(('place', place_slot.strip('.'))) + return final_slots + + def analyse_user_input(self, text): + sentence = text.translate(str.maketrans('', '', '!"#$%&\'()*+,/;<=>?@[\]^_`{|}~')) + sentence = sentence.strip('.') + csentence = [{'form': word} for word in sentence.split()] + fsentence = self.conllu2flair([csentence])[0] + self.frame_model.predict(fsentence) + self.slot_model.predict(fsentence) + possible_intents = {} + for token in fsentence: + for intent in token.annotation_layers["frame"]: + if(intent.value in possible_intents): + possible_intents[intent.value] += intent.score + else: + possible_intents[intent.value] = intent.score + return [(token, ftoken.get_tag('slot').value) for token, ftoken in zip(sentence.split(), fsentence) if ftoken.get_tag('slot').value != 'O'], max(possible_intents) - if not expansion.children and isinstance(expansion, jsgf.NamedRuleRef): - self.get_slots(expansion.referenced_rule.expansion, slots) + def get_user_act(self, analysis): + slots = analysis[0] + intent = analysis[1] + act_type = self.get_act_type_from_intent(intent) + slots = self.get_slots(slots) + return UserAct(act_type, slots) def parse_user_input(self, text: str) -> UserAct: - matched_rules = self.book_grammar.find_matching_rules(text) - if matched_rules: - return self.get_dialog_act(matched_rules[0]) - return UserAct(UserActType.INVALID, []) + analysis = self.analyse_user_input(text) + return self.get_user_act(analysis) diff --git a/UserActType.py b/UserActType.py index 59db987..52e488e 100644 --- a/UserActType.py +++ b/UserActType.py @@ -5,11 +5,13 @@ from enum import Enum, unique class UserActType(Enum): HELLO = 0 BYE = 1 - CREATE_MEETING = 2 - CANCEL_MEETING = 3 - CHANGE_MEETING = 4 - MEETING_LIST = 5 - CONFIRM = 6 - NEGATE = 7 - THANKYOU = 8 + CONFIRM = 2 + NEGATE = 3 + THANKYOU = 4 + INFORM = 5 + CREATE_MEETING = 6 + UPDATE_MEETING = 7 + CANCEL_MEETING = 8 + MEETING_LIST = 9 + FREE_TIME = 10 INVALID = -1 diff --git a/book.jsgf b/book.jsgf deleted file mode 100644 index 1ed1a52..0000000 --- a/book.jsgf +++ /dev/null @@ -1,29 +0,0 @@ -#JSGF V1.0 UTF-8 pl; - -grammar book; - -public = chciałbym (zapisać | wpisać | dodać | utworzyć | umówić) (nowe)* spotkanie; - -public = chciałbym (anulować | odwołać | usunąć) spotkanie; - -public = chciałbym (przesunąć | zmienić | edytować) spotkanie; - -public = jakie spotkania mam {date}; - - = ( | dzisiaj | jutro | pojutrze | ); - - = 1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31; - - = stycznia | lutego | marca | kwietnia | maja | czerwca | lipca | sierpnia | września | października | listopada | grudnia; - - = w (poniedziałek | środę | czwartek | piątek | sobotę | niedzielę) | we wtorek; - -public = potwierdzam | tak | zgadza się; - -public = witam | dzień dobry | cześć | siemka | dobry wieczór | hej | hejka; - -public = (bardzo)* dziękuję (bardzo)*; - -public = do widzenia | miłego dnia | to by było wszystko na teraz | to wszystko | to wszystko na tę chwilę; - -public = nie; \ No newline at end of file diff --git a/data/dialog-08-03-01.tsv b/data/dialog-08-03-01.tsv index fe88e66..da9281b 100644 --- a/data/dialog-08-03-01.tsv +++ b/data/dialog-08-03-01.tsv @@ -1,19 +1,19 @@ Interlocutor Text Acts -user Chciałbym zapisać spotkanie request(create_meeting) +user Chciałbym zapisać spotkanie create_meeting() system Proszę podać dzień na jaki mam zapisać spotkanie. request(date) -user 05.04.2021 infrom(date='05.04.2021') +user 05.04.2021 inform(date='05.04.2021') system Proszę podać godzinę i długość spotkania. request(time, meeting_length) user 19:00 - 21:00 inform(time='19:00', duration='2 godziny') system Niestety, godzina ta jest już zajęta przez inne spotkanie, proponuję godzinę 19:30 - 21:30. offer(time='19:30') -user ok confirm(time) +user ok confirm() system Czy mam zapisać miejsce spotkania? request(place) user nie negate() system Czy mam dodać opis do spotkania? request(description) user nie negate() -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) user nie negate() system Proszę potwierdzić utworzenie spotkania: Data: Poniedziałek 5.04.2021 19:30-21:30 confirm-domain() -user potwierdzam ack(create_meeting) +user potwierdzam confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) user Koniec zapisu bye() system Miłego dnia bye() \ No newline at end of file diff --git a/data/dialog-08-05-01.tsv b/data/dialog-08-05-01.tsv index 0c50580..d98538a 100644 --- a/data/dialog-08-05-01.tsv +++ b/data/dialog-08-05-01.tsv @@ -3,12 +3,12 @@ user Dzień dobry hello() system Dzień dobry, witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() user Chciałbym anulować spotkanie request(cancel_meeting) system Proszę podać datę i godzinę spotkania do odwołania. request(date, time) -user Spotkanie o 19:00 w piątek inform(date='next friday', time='19:00') +user Spotkanie o 19:00 w piątek inform(date='piątek', time='19:00') system Czy jesteś pewien, że chcesz odwołać poniższe spotkanie? Data: Piątek 2.04.2021 19:00-20:00 Miejsce: Gabinet Dentystyczny MegaDent Spotkanie z: doktor Emilia Ząb Opis: Wizyta u dentysty confirm-domain() -user Tak ack(cancel_meeting) +user Tak confirm() system Spotkanie zostało pomyślnie odwołane. inform(cancel_meeting) -user Proszę wpisać nowe spotkanie na ten termin: Wyjście do Kina z Tomkiem request(create_meeting) +user Proszę wpisać nowe spotkanie na ten termin: Wyjście do Kina z Tomkiem create_meeting() system Proszę potwierdzić utworzenie spotkania: Data: Piątek 2.04.2021 19:00-20:00 Miejsce: Kino Spotkanie z: Tomek Opis: Wyjście do Kina confirm-domain() -user Tak, zgadza się ack(create_meeting) +user Tak, zgadza się confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) -user Dziękuję bye() +user Dziękuję thankyou() diff --git a/data/dialog-08-07-01.tsv b/data/dialog-08-07-01.tsv index 0406a45..f07b51c 100644 --- a/data/dialog-08-07-01.tsv +++ b/data/dialog-08-07-01.tsv @@ -1,14 +1,14 @@ Interlocutor Text Acts system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Jakie mam wolne terminy w najbliższy piątek request(free_time) +user Jakie mam wolne terminy w najbliższy piątek free_time(date='najbliższy piątek') system Wolne terminy w piątek to: 9:00-12:15 14:00-15:00 18:00-24:00 inform(free_time) user Chciałabym, aby moje spotkania mogły być planowane maksymalnie do godziny 17 by mieć spokój poza godzinami pracy request(set_max_meeting_time) system Godziny spotkań zostały pomyślnie zmienione. Obecne godziny to 8:00-17:00 inform(time=8:00, duration='9 godzin') -user Dziękuję. Proszę wpisać spotkanie na piątek godzinę 9:00 "Podsumowanie miesiąca", salka A request(create_meeting) +user Dziękuję. Proszę wpisać spotkanie na piątek godzinę 9:00 "Podsumowanie miesiąca", salka A create_meeting(date='piątek',time='9:00',description='Podsumowanie miesiąca',place='Salka A' system Proszę potwierdzić utworzenie spotkania: Data: Piątek 2.04.2021 9:00 Miejsce: salka A Spotkanie z: Brak Opis: Podsumowanie miesiąca confirm-domain() user potwierdzam ack(create_meeting) -system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) -user Chciałabym zobaczyć podsumowanie spotkań z ostatniego miesiąca request(meeting_list) +system Spotkanie zostało pomyślnie dodane do kalendarza. confirm() +user Chciałabym zobaczyć podsumowanie spotkań z ostatniego miesiąca meeting_list(date='ostatniego miesiąca') system Na ostatni miesiąc zaplanowano następujące spotkania: inform(meeting_list) system Data: Czwartek 11.02.2021 20:00-21:30 Miejsce: Multikino Spotkanie z: Kasia Opis: Wyjście do kina inform(meeting_list) system Data: Sobota 20.02.2021 12:00-14:00 Miejsce: Cytadela Spotkanie z: Brak Opis: Spacer inform(meeting_list) diff --git a/data/dialog-08-09-01.tsv b/data/dialog-08-09-01.tsv index f62a9ba..cf297be 100644 --- a/data/dialog-08-09-01.tsv +++ b/data/dialog-08-09-01.tsv @@ -1,16 +1,16 @@ Interlocutor Text Acts user Hej hello() system Hej, witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Jakie mam spotkania jutro? request(meeting_list) +user Jakie mam spotkania jutro? meeting_list(date='jutro') system Na jutro zaplanowano następujące spotkania: inform(meeting_list) system Data: Wtorek 30.03.2021 10:00-11:30 Miejsce: Platforma MS Teams Spotkanie z: Marek Kubis Opis: Odrabianie zajęć z Systemów Dialogowych inform(meeting_list) -user Czy moge przesunąć to spotkanie? request(update_meeting) +user Czy moge przesunąć to spotkanie? update_meeting() system Obecny czas spotkania to: Wtorek 30.03.2021 10:00-11:30, jaki ma być nowy czas spotkania? request(date, time) -user Ten sam dzień ale o 13 początek inform(date='ten sam dzień', time='13:00') +user Ten sam dzień ale o 13 początek inform(date='ten sam dzień', time='13') system Czas został pomyślnie zmieniony affirm(update_meeting) -user Chciałbym dodać nowe spotkanie request(create_meeting) +user Chciałbym dodać nowe spotkanie create_meeting() system Proszę podać dzień na jaki mam umówić spotkanie. request(date) -user pierwszy kwietnia informe(date='01.04.2021') +user pierwszy kwietnia inform(date='pierwszy kwietnia') system Proszę podać godzinę i długość spotkania. request(time) user 18:30 bez ustalonego czasu spotkania inform(time='18:30') system Czy mam zapisać miejsce spotkania? request(place) @@ -20,7 +20,7 @@ user nie negate() system Czy mam dodać opis do spotkania? request(description) user Tak. Spotkanie rekreacyjne inform(description='Spotkanie rekreacyjne') system Proszę potwierdzić utworzenie spotkania: Data: Czwartek 1.04.2021 18:30 Miejsce: Brak Spotkanie z: Brak Opis: Spotkanie rekreacyjne confirm-domain() -user Tak zgadza się ack(create_meeting) +user Tak zgadza się confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) user To by było wszystko bye() system Miłego dnia bye() \ No newline at end of file diff --git a/data/dialog-08-11-01.tsv b/data/dialog-08-11-01.tsv index e8012cb..8c02b91 100644 --- a/data/dialog-08-11-01.tsv +++ b/data/dialog-08-11-01.tsv @@ -1,19 +1,19 @@ Interlocutor Text Acts user cześć operatorze hello() system Cześć, witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Chciałbym umówić nowe spotkanie request(create_meeting) +user Chciałbym umówić nowe spotkanie create_meeting() system Proszę podać dzień na jaki mam umówić spotkanie. request(date) user jutro inform(date='jutro') system Proszę podać godzinę i długość spotkania. request(time, duration) user Godzina 18:30, czas trwania 2 godziny inform(time='18:30', duration='2 godziny') system Niestety, godzina ta jest już zajęta przez inne spotkanie, proponuję godzinę 19:00. offer(time='19:00') -user Akceptuje i proszę zmienić czas trwania na 1,5h ack() & inform(duration='1,5 godziny') +user Akceptuje i proszę zmienić czas trwania na 1,5h confirm() & inform(duration='1,5 godziny') system Czy mam zapisać miejsce spotkania? request(place) -user Tak ack() +user Tak confirm() system Gdzie ma się odbyć spotkanie? request(place) user Restauracja ABC inform(place='Restauracja ABC') -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) -user tak, Jan Kowalski inform(participants=['Jan Kowalski']) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) +user tak, Jan Kowalski inform(participant=['Jan Kowalski']) system Czy mam dodać opis do spotkania? request(description) user Nie, Dziękuję negate() & thankyou() system Proszę potwierdzić utworzenie spotkania: Data: Wtorek 30.03.2021 19:00-20:30 Miejsce: Restauracja ABC Spotkanie z: Jan Kowalski confirm-domain() diff --git a/data/dialog-08-13-01.tsv b/data/dialog-08-13-01.tsv index 8a8b345..f776355 100644 --- a/data/dialog-08-13-01.tsv +++ b/data/dialog-08-13-01.tsv @@ -1,22 +1,22 @@ Interlocutor Text Acts user Dzień dobry! hello() system Dzień dobry, witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Proszę o rozpiskę spotkań na następny tydzień request(meeting_list) +user Proszę o rozpiskę spotkań na następny tydzień meeting_list(date='następny tydzień') system Na następny tydzień zaplanowano następujące spotkania: inform(meeting_list) system Data: Czwartek 08.03.2021 13:00-13:30 Miejsce: Urząd Miasta Spotkanie z: Brak Opis: Złożenie wniosku w urzędzie inform(meeting_list) system Data: Czwartek 08.03.2021 18:00-18:30 Miejsce: Sklep spożywczy Spotkanie z: Brak Opis: Zakupy inform(meeting_list) -user Chciałabym dodać spotkanie do kalendarza. request(create_meeting) +user Chciałabym dodać spotkanie do kalendarza. create_meeting() system Proszę podać dzień na jaki mam umówić spotkanie. request(date) user Czwartek inform(date='Czwartek') system Proszę podać godzinę i długość spotkania. request(time, duration) user Spotkanie rozpocznie się o 12:00 i będzie trwało 2 godziny. inform(time=12:00, duration='2 godziny') system Czy mam zapisać miejsce spotkania? request(place) user Restauracja w hotelu Anderisa. inform(place='Restauracja w hotelu Anderisa') -system Czy mam zapisać nazwisko osoby, której dotyczy to spotkanie? request(participants) -user Hanna Kowalska. inform(participants=['Hanna Kowalska']) +system Czy mam zapisać nazwisko osoby, której dotyczy to spotkanie? request(participant) +user Hanna Kowalska. inform(participant='Hanna Kowalska') system Czy mam dodać opis do spotkania? request(description) user Nie. negate() system Proszę potwierdzić utworzenie spotkania: Data: Czwartek 1.04.2021 12:00-14:00 Miejsce: Restauracja w hotelu Anderisa Spotkanie z: Hanna Kowalska. confirm-domain() -user Potwierdzam. confirm(create_meeting) +user Potwierdzam. confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) user Dziękuje thankyou() \ No newline at end of file diff --git a/data/dialog-08-15-01.tsv b/data/dialog-08-15-01.tsv index de9c82e..358eff0 100644 --- a/data/dialog-08-15-01.tsv +++ b/data/dialog-08-15-01.tsv @@ -1,14 +1,14 @@ Interlocutor Text Acts user Dzień dobry! hello() system Dzień dobry. Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Podaj mi proszę moje spotkania na najbliższy tydzień request(meeting_list) +user Podaj mi proszę moje spotkania na najbliższy tydzień meeting_list(date='najbliższy tydzień') system Na najbliższy tydzień zaplanowano następujące spotkania: inform(meeting_list) system Data: Wtorek 30.03.2021 10:00-11:30 Miejsce: Platforma MS Teams Spotkanie z: Marek Kubis Opis: Odrabianie zajęć z Systemów Dialogowych inform(meeting_list) system Data: Piątek 02.03.2021 18:00-20:00 Miejsce: Brak Spotkanie z: Jan Nowak Opis: Piątkowe Kręgle inform(meeting_list) -user hmm. myślałam, że miałam umówioną wizytę u lekarza w tym tygodniu. Jakie spotkania mam w przyszłym? request(meeting_list) +user hmm. myślałam, że miałam umówioną wizytę u lekarza w tym tygodniu. Jakie spotkania mam w przyszłym tygodniu? meeting_list(date='przyszłym tygodniu') system Na następny tydzień zaplanowano następujące spotkania: inform(meeting_list) system Data: Środa 7.04.2021 16:15 Miejsce: Przychodnia lekarska SuperMed Spotkanie z: doktor Adam Kowalski Opis: Wizyta u lekarza rodzinnego inform(meeting_list) -user Ok. czyli w przyszłym. Zmień proszę godzinę tego spotkania na 17:30 request(update_meeting) & inform(time='17:30') +user Ok. czyli w przyszłym. Zmień proszę godzinę tego spotkania na 17:30 update_meeting(time='17:30') system Czas spotkania został pomyślnie zmieniony. affirm(update_meeting) user Bardzo dziękuję thankyou() user To wszystko na tę chwilę bye() diff --git a/data/dialog-09-04-01.tsv b/data/dialog-09-04-01.tsv index 97acdcf..2b3b449 100644 --- a/data/dialog-09-04-01.tsv +++ b/data/dialog-09-04-01.tsv @@ -1,16 +1,16 @@ Interlocutor Text Acts -user Chciałbym umówić spotkanie dzisiaj o godzinie 17.00 request(create_meeting) & inform(date='dzisiaj', time='17.00') +user Chciałbym umówić spotkanie dzisiaj o godzinie 17.00 create_meeting(date='dzisiaj', time='17.00') system Niestety, godzina ta jest już zajęta przez inne spotkanie, proponuję godzinę 18:00. offer(time='18:00') -user Ok, może być godzina 18 confirm(time) +user Ok, może być godzina 18 confirm() system Proszę podać długość spotkania. request(duration) user 45 minut inform(duration=45 minut) system Czy mam zapisać miejsce spotkania? request(place) user Tak, proszę dodać restaurację Bankcook w Poznaniu jako miejsce spotkania. inform(place='resturacja Bankcook w Poznaniu') -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) -user Tak, proszę dodać Jan Nowak do spotkania oraz wysłać mu powiadomienie o zaproszeniu. inform(participants=['Jan Nowak']) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) +user Tak, proszę dodać Jan Nowak do spotkania oraz wysłać mu powiadomienie o zaproszeniu. inform(participant='Jan Nowak') system Czy mam dodać opis do spotkania? request(description) user Tak, opis to "Omówienie zakupu akcji firmy GameStop". inform(description='Omówienie zakupu akcji firmy GameStop') system Proszę potwierdzić utworzenie spotkania: Data: Wtorek 30.03.2021 18:00-18:45 Miejsce: Bankcook w Poznaniu Spotkanie z: Jan Nowak Opis: Omówienie zakupu akcji firmy GameStop confirm-domain() -user Zgadza się, Proszę również wysłać mi powiadomienie 2 godziny przed spotkaniem. confirm() & request(set_reminder) & inform(reminder='2 godziny przed') +user Zgadza się, Proszę również wysłać mi powiadomienie 2 godziny przed spotkaniem. confirm() system Powiadomienie zostanie wysłane 2 godziny przed spotkaniem. affirm(create_meeting) user Dziękuję! bye() \ No newline at end of file diff --git a/data/dialog-09-06-01.tsv b/data/dialog-09-06-01.tsv index c70a149..0ff261f 100644 --- a/data/dialog-09-06-01.tsv +++ b/data/dialog-09-06-01.tsv @@ -1,24 +1,24 @@ Interlocutor Text Acts user Dzień dobry hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Chcialbym sprawdzic czy mam jakies spotkania w najblizszym tygodniu request(meeting_list) & inform(date='next week') +user Chcialbym sprawdzic czy mam jakies spotkania w najblizszym tygodniu meeting_list(date='najblizszym tygodniu') system Na ten tydzień zaplanowano następujące spotkania: Data: Środa 31.03.2021 14:00-15:00 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) system Oraz: Data: Piątek 02.04.2021 16:00-17:15 Miejsce: Dom Spotkanie z: Kacper (Brat) Opis: Zaplanowanie imprezy urodzinowej dla mamy inform(meeting_list) -user Chciałbym dodać spotkanie do kalendarza request(create_meeting) +user Chciałbym dodać spotkanie do kalendarza create_meeting() system Proszę podać dzień na jaki mam umówić spotkanie. request(date) user 12.04.2021 inform(date='12.04.2021') system Proszę podać godzinę i długość spotkania. request(time, duration) user 18:00 - 2 godziny inform(time='18:00', duration='2 godziny') system Czy mam zapisać miejsce spotkania? request(place) -user Tak ack() +user Tak confirm() user restauracja xyz inform(place='restauracja xyz') -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) user nie negate() system Czy mam dodać opis do spotkania? request(description) user nie negate() system Proszę potwierdzić utworzenie spotkania: Data: Poniedziałek 12.04.2021 18:00-20:00 Miejsce: restauracja xyz confirm-domain() user Spotkanie jednak będzie trwało 4 godziny inform(duration='4 godziny') system Proszę potwierdzić utworzenie spotkania: Data: Poniedziałek 12.04.2021 18:00-22:00 Miejsce: restauracja xyz confirm-domain() -user Potwierdzam confirm(create_meeting) +user Potwierdzam confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) -user Dziękuję bye() \ No newline at end of file +user Dziękuję thankyou() \ No newline at end of file diff --git a/data/dialog-09-08-01.tsv b/data/dialog-09-08-01.tsv index ea421ca..ba68322 100644 --- a/data/dialog-09-08-01.tsv +++ b/data/dialog-09-08-01.tsv @@ -1,15 +1,15 @@ Interlocutor Text Acts -user Dzień dobry, chciałbym umówić spotkanie hello() & request(create_meeting) -system Witam w twoim prywatnym asystencie kalendarza spotkań. Proszę podać dzień na jaki mam umówić spotkanie. wellcomemsg() & request(date) -user 12 kwietnia inform(date='12.04.2021') +user Dzień dobry, chciałbym umówić spotkanie hello() & create_meeting() +system Witam w twoim prywatnym asystencie kalendarza spotkań. Proszę podać dzień na jaki mam umówić spotkanie. welcomemsg() & request(date) +user 12 kwietnia inform(date='12 kwietnia') system Proszę podać godzinę i długość spotkania. request(time, duration) user 9:00-12:00 inform(time='9:00', duration='3 godziny') system Czy mam zapisać miejsce spotkania? request(place) user nie negate() -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) -user tak, Adam Nowak inform(participants=['Adam Nowak']) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) +user tak, Adam Nowak inform(participant='Adam Nowak') system Czy mam dodać opis do spotkania? request(description) -user tak, Spotkanie z kierownikiem zespołu w sprawie prac projektowych inform(description='Spotkanie z kierownikiem zespołu w sprawie prac projektowych') +user tak, Spotkanie z kierownikiem zespołu w sprawie prac projektowych inform(description='w sprawie prac projektowych') system Proszę potwierdzić utworzenie spotkania: Data: Poniedziałek 12.04.2021 9:00-12:00 Spotkanie z: Adam Nowak Opis: Spotkanie z kierownikiem zespołu w sprawie prac projektowych confirm-domain() -user potwierdzam confirm(create_meeting) +user potwierdzam confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) \ No newline at end of file diff --git a/data/dialog-09-10-01.tsv b/data/dialog-09-10-01.tsv index 86abba3..6096697 100644 --- a/data/dialog-09-10-01.tsv +++ b/data/dialog-09-10-01.tsv @@ -1,20 +1,20 @@ Interlocutor Text Acts user Cześć. hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Chciałbym utworzyć nowe spotkanie. request(create_meeting) +user Chciałbym utworzyć nowe spotkanie. create_meeting() system Proszę podać dzień na jaki mam umówić spotkanie. request(date) user Najbliższy poniedziałek. inform(date='najbliższy poniedziałek') system Proszę podać godzinę i długość spotkania. request(time, duration) user Spotkanie będzie w godzinach 16:30-19:00 inform(time='16:30', duration='2:30') system Czy mam zapisać miejsce spotkania? request(place) user Miejsce spotkania to Kawiarnia JKL inform(place='Kawiarnia JKL') -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) -user Spotkanie będzie z Janem Nowakiem inform(participants=['Jan Nowak']) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) +user Spotkanie będzie z Janem Nowakiem inform(participant='Janem Nowakiem') system Czy mam dodać opis do spotkania? request(description) -user Tak. Spotkanie będzie dotyczyło omówienia strategii biznesowej. inform(description='Omówienie strategii biznesowej') +user Tak. Spotkanie będzie dotyczyło omówienia strategii biznesowej. inform(description='omówienia strategii biznesowej') system Proszę potwierdzić utworzenie spotkania: Data: Poniedziałek 05.04.2021 16:30-19:00 Miejsce: Kawiarnia JKL Spotkanie z: Jan Nowak Opis: Omówienie strategii biznesowej confirm-domain() -user Potwierdzam. confirm(create_meeting) +user Potwierdzam. confirm() system Spotkanie zostało pomyślnie dodane do kalendarza. affirm(create_meeting) -user Czy mam jakieś spotkania w najbliższy piątek? request(meeting_list) & inform(date='najbliższy piątek') +user Czy mam jakieś spotkania w najbliższy piątek? meeting_list(date='najbliższy piątek') system Na piątek zaplanowano następujące spotkania: Data: Poniedziałek 29.03.2021 14:00-15:00 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) user Dziękuję, to wszystko. thankyou() & bye() \ No newline at end of file diff --git a/data/dialog-09-12-01.tsv b/data/dialog-09-12-01.tsv index 331c146..0f0c08b 100644 --- a/data/dialog-09-12-01.tsv +++ b/data/dialog-09-12-01.tsv @@ -1,11 +1,11 @@ Interlocutor Text Acts user Cześć hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Czy mam jakieś zaplanowane spotkania? request(meeting_list) +user Czy mam jakieś zaplanowane spotkania? meeting_list() system Najbliższe spotkanie to: Data: Piątek 02.04.2021 19:00 Miejsce: Brak Spotkanie z: Marek Opis: Spotkanie towarzyskie inform(meeting_list) system Kolejne spotkanie to: Data: Środa 31.03.2021 14:00-15:00 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) -user Chciałbym usunać drugie spotkanie. request(cancel_meeting) +user Chciałbym usunać drugie spotkanie. cancel_meeting() system Czy jesteś pewien, że chcesz odwołać poniższe spotkanie? Data: Środa 31.03.2021 14:00-15:00 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC confirm-domain() -user Tak. Chciałbym je przesunąć na za tydzień negate() & request(update_meeting) & inform(date='za tydzień') +user Tak. Chciałbym je przesunąć na za tydzień negate() & update_meeting() & inform(date='za tydzień') system Czas został zmieniony, czy to wszystkie edycje? affirm(update_meeting) -user Tak. Dziękuję za pomoc : ) bye() \ No newline at end of file +user Tak. Dziękuję za pomoc : ) bye() & thankyou() \ No newline at end of file diff --git a/data/dialog-09-14-01.tsv b/data/dialog-09-14-01.tsv index 5eb71eb..ffbf03a 100644 --- a/data/dialog-09-14-01.tsv +++ b/data/dialog-09-14-01.tsv @@ -1,15 +1,15 @@ Interlocutor Text Acts user Cześć hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Proszę o dodanie spotkania biznesowego na dziś wieczór request(create_meeting) & inform(date='dziś') +user Proszę o dodanie spotkania biznesowego na dziś wieczór create_meeting(date='dziś') system Proszę podać godzinę i długość spotkania. request(time, duration) user na godzinę 19:00 i długość spotkania nieokreślona inform(time=19:00', duration='null') system Czy mam zapisać miejsce spotkania? request(place) user Tak, Cytadela Poznań inform(place='Cytadela Poznań') -system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participants) -user tak osoba XXX YYY inform(participants=['XXX YYY']) +system Czy mam zapisać naziwsko osoby, której dotyczy to spotkanie? request(participant) +user tak osoba XXX YYY inform(participant='XXX YYY') system Czy mam dodać opis do spotkania? request(description) user Nie, to wszystko. Proszę podać podsumowanie negate() system Proszę potwierdzić utworzenie spotkania: Data: Wtorek 30.03.2021 19:00- Miejsce: Cytadela Poznań Spotkanie z: XXX YYY confirm-domain() -user Tak wszystko się zgadza. Dziękuję za rozmowę confirm(create_meeting) & bye() +user Tak wszystko się zgadza. Dziękuję za rozmowę confirm() & thankyou() system Spotkanie zostało pomyślnie dodane do kalendarza. inform(create_meeting) \ No newline at end of file diff --git a/data/dialog-10-01-01.tsv b/data/dialog-10-01-01.tsv index d9c25ca..058ee5e 100644 --- a/data/dialog-10-01-01.tsv +++ b/data/dialog-10-01-01.tsv @@ -1,8 +1,8 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user proszę o wyświetlenie jutrzejszego kalendarza request(meeting_list) & inform(date='30.03.2021') +user proszę o wyświetlenie jutrzejszego kalendarza meeting_list(date='jutrzejszego') system Jutrzejsze spotkania: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC --- Data: Wtorek 30.03.2021 18:00-19:30 Miejsce: Firma ABC Spotkanie z: Janusz Kowalski inform(meeting_list) -user Dodaj pozycję jutro na 16-17.30: Lunch z księgową w miejscu: Cafe Teria request(create_meeting) & inform(date='30.03.2021', time='16:00', meeting_length='90 minut', participant=['księgowa'], place='Cafe Teria') +user Dodaj pozycję jutro na 16-17.30: Lunch z księgową w miejscu: Cafe Teria create_meeting(date='jutro', time='16', meeting_length='90 minut', description='Lunch z księgową', place='Cafe Teria') system Spotkanie zostało dodane: Data: Wtorek 16:00-17:30 Miejsce: Cafe Teria Spotkanie z: księgowa Opis: lunch affirm(create_meeting) user dziękuje to wszystko bye() & thankyou() system Dziękuję. Do widzenia. bye() \ No newline at end of file diff --git a/data/dialog-10-03-01.tsv b/data/dialog-10-03-01.tsv index 6df8b3b..10f46f4 100644 --- a/data/dialog-10-03-01.tsv +++ b/data/dialog-10-03-01.tsv @@ -1,14 +1,14 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Chciałbym zapisać spotkanie request(create_meeting) +user Chciałbym zapisać spotkanie create_meeting() system Proszę podać dzień, na jaki mam umówić spotkanie. request(date) user 08.04.2021 inform(date='08.04.2021') system Proszę o podanie godziny i czasu trwania spotkania. request(time) & request(meeting_length) -user 17:00 - 19:00 inform(time='17:00') & inform(meeting_length='2 godziny') +user 17:00 - 19:00 inform(time='17:00', meeting_length='2 godziny') system Jakie będzie miejsce tego spotkania? request(place) user Kawiarnia MCafe przy ulicy Grunwaldzkiej inform(place='Kawiarnia MCafe przy ulicy Grunwaldzkiej') -system Z jaką osobą będzie to spotkanie? request(participants) -user Sylwia Kowalska inform(participants=['Sylwia Kowalska']) +system Z jaką osobą będzie to spotkanie? request(participant) +user Sylwia Kowalska inform(participant='Sylwia Kowalska') system Czy mam dodać opis do spotkania? request(description) user tak confirm() system Jaki ma być opis spotkania? request(description) diff --git a/data/dialog-10-05-01.tsv b/data/dialog-10-05-01.tsv index b2e33b9..9ce74c8 100644 --- a/data/dialog-10-05-01.tsv +++ b/data/dialog-10-05-01.tsv @@ -1,16 +1,16 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Chciałbym sprawdzić moje spotkania w piątek request(meeting_list) & inform(date=02.04.2021) +user Chciałbym sprawdzić moje spotkania w piątek meeting_list(date='piątek') system Na piątek 02.04.2021 nie masz zaplanywanych żadnych spotkań. inform(meeting_list) -user proszę wpisać na 02.04.2021 o godzinie 19:00: Wyjście do kina ze znajomą request(create_meeting) & inform(date='02.04.2021', time='19:00', participants=['znajoma'], place='kino', description='wyjście do kina') +user proszę wpisać na 02.04.2021 o godzinie 19:00: Wyjście do kina ze znajomą create_meeting(date='02.04.2021', time='19:00', description='Wyjście do kina ze znajomą') system Ile będzie trwało to spotkanie? request(meeting_length) user 2 godziny inform(meeting_length='2 godziny') system Spotkanie zostało dodane: Data: Piątek 02.04.2021 19:00-21:00 Miejsce: kino Z: znajoma Opis: wyjście do kina affirm(create_meeting) -user Pomyliłem się podczas podawania godziny. Chciałbym przełożyć to spotkanie na 20:00 do 22:00 request(update_meeting) & inform(time='20:00', meeting_length='2 godziny') +user Pomyliłem się podczas podawania godziny. Chciałbym przełożyć to spotkanie na 20:00 do 22:00 update_meeting(time='20:00', meeting_length='2 godziny') system Spotkanie zostało zmienione: Data: Piątek 02.04.2021 20:00-22:00 Miejsce: kino Z: znajoma Opis: wyjście do kina affirm(update_meeting) user Dziękuję thankyou() system Czy mogę jeszcze Ci w czymś pomóc? reqmore() -user ile będę miał dni bez zaplanowanych spotkań w przyszłym miesiącu request(free_days_count) & inform(time='przyszły miesiąc') +user ile będę miał dni bez zaplanowanych spotkań w przyszłym miesiącu free_days_count(time='przyszły miesiąc') system Dni bez zaplanowanych spotkań w przyszłym miesiącu: 29 welcomemsg() user Dziękuję za informację thankyou() system Czy mogę jeszcze w czymś pomóc? reqmore() diff --git a/data/dialog-10-07-01.tsv b/data/dialog-10-07-01.tsv index ebb2767..40f041f 100644 --- a/data/dialog-10-07-01.tsv +++ b/data/dialog-10-07-01.tsv @@ -1,10 +1,10 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Jakie mam nadchodzące wydarzenia w tym tygodniu? request(meeting_list) & inform(date='ten tydzień') +user Jakie mam nadchodzące wydarzenia w tym tygodniu? meeting_list(date='tym tygodniu') system Wydarzenia w tym tygodniu: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC --- Data: Czwartek 01.04.2021 12:00-15:30 Miejsce: Firma ABC Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) -user Chciałabym przesunąć spotkanie z Jan Nowak na najbliższy wtorek request(update_meeting) +user Chciałabym przesunąć spotkanie z Jan Nowak na najbliższy wtorek update_meeting(participant='Jan Nowak', date='najbliższy wtorek') system Na którą godzinę? request(time) -user Jakie mam godziny dostępne w najblizszy wtorek? request(free_time) & inform(date='najbliższy wtorek') +user Jakie mam godziny dostępne w najblizszy wtorek? free_time(date='najbliższy wtorek') system Dostępne godziny w najbliższy wtorek: 00:00-10:00 12:00-14:00 15:30-24:00 inform(free_time) user na godzinę 9:30 inform(time='9:30') system Które spotkanie z Jan Nowak chcesz przesunąć? Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC --- Data: Czwartek 01.04.2021 12:00-15:30 Miejsce: Firma ABC Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) & request(meeting) diff --git a/data/dialog-10-09-01.tsv b/data/dialog-10-09-01.tsv index a157c95..abe9a1f 100644 --- a/data/dialog-10-09-01.tsv +++ b/data/dialog-10-09-01.tsv @@ -1,28 +1,28 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Jakie mam spotkania 31 marca? request(meeting_list) & inform(date='31.03.2021') +user Jakie mam spotkania 31 marca? meeting_list(date='31 marca') system Nie masz żadnych spotkań 31 marca. Czy chciałbyś umówić spotkanie na ten dzień? inform(meeting_list) -user Nie. A jakie spotkania mam jutro? request(meeting_list) & inform(date='jutro') +user Nie. A jakie spotkania mam jutro? meeting_list(date='jutro') system Na jutro masz zaplanowane następujące spotkania: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC inform(meeting_list) -user Chciałbym odwołać to spotkanie request(cancel_meeting) & inform(spotkanie='to spotkanie') +user Chciałbym odwołać to spotkanie cancel_meeting() system Czy jesteś pewien, że chcesz odwołać to spotkanie? confirm-domain() -user Tak ack() +user Tak confirm() system Spotkanie zostało odwołane. Czy mogę w czymś jeszcze pomóc? affirm(cancel_meeting) & reqmore() -user Chciałbym zaplanować nowe spotkanie na miejsce tego odwołanego request(create_meeting) +user Chciałbym zaplanować nowe spotkanie na miejsce tego odwołanego create_meeting() system Gdzie będzie to spotkanie? request(place) user bez miejsca negate() -system Z kim będzie to spotkanie? request(participants) -user Jan Kowalski inform(participants=['Jan Kowalski']) +system Z kim będzie to spotkanie? request(participant) +user Jan Kowalski inform(participant='Jan Kowalski') system Spotkanie zostało dodane do kalendarza: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: brak Z: Jan Kowalski affirm(create_meeting) -user Chciałbym jeszcze dodać nową osobę do tego spotkania request(update_meeting) -system Kogo dodać do tego spotkania? request(participants) -user Jan Nowak inform(participants=['Jan Nowak']) +user Chciałbym jeszcze dodać nową osobę do tego spotkania update_meeting() +system Kogo dodać do tego spotkania? request(participant) +user Jan Nowak inform(participant='Jan Nowak') system Uczestnik spotkania został dodany: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: brak Z: Jan Kowalski i Jan Nowak affirm(update_meeting) -user A jakie mam wolne terminy jutro? request(free_time) & inform(date='jutro') +user A jakie mam wolne terminy jutro? free_time(date='jutro') system Dostępne terminy jutro: 00:00-10:00 12:00-14:00 15:30-24:00 inform(free_time) -user Kiedy mam spotkanie z Janem Nowakiem? request(meeting_list) & inform(participants=['Jan Nowak']) +user Kiedy mam spotkanie z Janem Nowakiem? meeting_list(participant='Jan Nowak') system Spotkania z Janem Nowakiem: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: brak Z: Jan Kowalski i Jan Nowak inform(meeting_list) -user Chciałbym usunąć Jana Kowalskiego z tego spotkania request(update_meeting) & inform(meeting='to spotkanie', participants=['Jan Kowalski']) +user Chciałbym usunąć Jana Kowalskiego z tego spotkania update_meeting(participant='Jan Kowalski') system Jan Kowalski został usunięty ze spotkania: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: brak Z: Jan Nowak affirm(update_meeting) user To by było wszystko na teraz bye() system Do widzenia. Życzę miłego dnia. bye() \ No newline at end of file diff --git a/data/dialog-10-11-01.tsv b/data/dialog-10-11-01.tsv index ff2535e..82f96c6 100644 --- a/data/dialog-10-11-01.tsv +++ b/data/dialog-10-11-01.tsv @@ -1,12 +1,12 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Chciałbym przesunąć spotkanie request(update_meeting) +user Chciałbym przesunąć spotkanie update_meeting() system Jakie spotkanie chcesz przesunąć? request(meeting) -user Dzisiejsze o godzinie 20:00 inform(meeting='Dzisiejsze o godzinie 20:00') +user Dzisiejsze o godzinie 20:00 inform(date='Dzisiejsze', time='20:00') system Na kiedy chcesz przesunąć to spotkanie? Data: Poniedziałek 29.03.2021 20:00-20:30 Miejsce: Firma ABC Spotkanie z: Jan Nowak - Prezes firmy ABC request(time) -user na środę o godzinie 19:00, proszę też zmienić miejsce na Restauracja ABC request(update_meeting) & inform(time='19:00', place='Restauracja ABC') +user na środę o godzinie 19:00, proszę też zmienić miejsce na Restauracja ABC update_meeting(time='19:00', place='Restauracja ABC') system Spotkanie zostało zmienione: Data: Środa 31.03.2021 19:00-20:30 Miejsce: Restauracja ABC Spotkanie z: Jan Nowak - Prezes firmy ABC affirm(update_meeting) -user proszę też zmienić czas trwania na 1 godzinę request(update_meeting) +user proszę też zmienić czas trwania na 1 godzinę update_meeting() system Spotkanie zostało zmienione: Data: Środa 31.03.2021 19:00-20:00 Miejsce: Restauracja ABC Spotkanie z: Jan Nowak - Prezes firmy ABC affirm(update_meeting) user Dziękuje thankyou() system Czy mogę jeszcze w czymś pomóc? reqmore() diff --git a/data/dialog-10-13-01.tsv b/data/dialog-10-13-01.tsv index 8cb61c6..0652eac 100644 --- a/data/dialog-10-13-01.tsv +++ b/data/dialog-10-13-01.tsv @@ -1,12 +1,12 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Proszę o rozpiskę spotkań w tym tygodniu. request(meeting_list) & inform(date='w tym tygodniu') +user Proszę o rozpiskę spotkań w tym tygodniu. meeting_list(date='tym tygodniu') system Spotkania w tym tygodniu: Data: Wtorek 30.03.2021 14:00-15:30 Miejsce: Sala konferencyjna w biurze Spotkanie z: Jan Nowak - Prezes firmy ABC --- Data: Czwartek 01.04.2021 12:00-15:30 Miejsce: Firma ABC Spotkanie z: Jan Nowak - Prezes firmy ABC --- Data: Piątek 02.04.2021 19:00-20:00 Miejsce: Restauracja ABC Spotkanie z: Janusz Kowalski - Prezes firmy XYZ inform(meeting_list) -user Chciałabym odwołać spotkanie request(cancel_meeting) +user Chciałabym odwołać spotkanie cancel_meeting() system Jakie spotkanie chcesz odwołać? request(meeting) -user Spotkanie z Januszem Kowalskim. inform(meeting='Spotkanie z Januszem Kowalskim') +user Spotkanie z Januszem Kowalskim. inform(participant='Januszem Kowalskim') system Czy na pewno odwołać spotkanie? Data: Piątek 02.04.2021 19:00-20:00 Miejsce: Restauracja ABC Spotkanie z: Janusz Kowalski - Prezes firmy XYZ confirm-domain() -user Tak confirm(cancel_meeting) +user Tak confirm() system Spotkanie zostało odwołane. Czy mogę jeszcze Ci w czymś pomóc? affirm(cancel_meeting) & reqmore() user Nie, dziękuję. negate() & thankyou() system Dziękuję. Do widzenia. bye() \ No newline at end of file diff --git a/data/dialog-10-15-01.tsv b/data/dialog-10-15-01.tsv index 99b4d58..ae8f13a 100644 --- a/data/dialog-10-15-01.tsv +++ b/data/dialog-10-15-01.tsv @@ -1,11 +1,11 @@ Interlocutor Text Acts system Witam w prywatnym asystencie kalendarza spotkań. W czym mogę pomóc? welcomemsg() -user Jakie wolne terminy mam w najbliższym tygodniu? request(free_time) & inform(date='w najbliższym tygodniu') +user Jakie wolne terminy mam w najbliższym tygodniu? free_time(date='najbliższym tygodniu') system Wolne terminy w nadchodzącym tygodniu: 30.03.2021 00:00-24:00 31.03.2021 00:00-24:00 01.04.2021 00:00-24:00 02.04.2021 00:00-08:00 10:00-12:00 16:00-24:00 03.04.2021 00:00-24:00 04.04.2021 00:00-10:00 14:00-24:00 05.04.2021 00:00-24:00 inform(free_time) user Ooo, ale ja się obijam. Nie mam ustalonych żadnych spotkań! null() -user zapisz mi proszę spotkanie z 3 marca od 17-19, mam wizytę u lekarza request(create_meeting) +user zapisz mi proszę spotkanie z 3 marca od 17-19, mam wizytę u lekarza create_meeting(date='3 marca', time='17', description='wizytę u lekarza') system W jakim miejscu odbędzie się to spotkanie? request(place) -user w przychodni przy ulicy dialogowej inform(place='przychodnia przy ulicy dialogowej') +user w przychodni przy ulicy dialogowej inform(place='przychodni przy ulicy dialogowej') user Czy możesz dodać notatkę, żebym pamiętała o poprzednich wynikach? request(create_note) system Spotkanie zostało dodane: Data: Sobota 03.03.2022 17:00-19:00 Miejsce: Przychodnia przy ulicy dialogowej Spotkanie z: brak Opis: wizyta u lekarza affirm(create_meeting) system Niestety asystent kalendarza spotkań nie obsługuje obecnie dodawania notatek. Weźmiemy pod uwagę twoje uwagi przy dalszym jego rozwoju. canthelp() diff --git a/data/dialog-11-04-01.tsv b/data/dialog-11-04-01.tsv index 98a361e..ea4b55f 100644 --- a/data/dialog-11-04-01.tsv +++ b/data/dialog-11-04-01.tsv @@ -1,11 +1,11 @@ Interlocutor Text Acts system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Proszę stworzyć w moim kalendarzu spotkanie online 24.04.2021 o godzinie 17.00. request(create_meeting) & inform(date='24.04.2021', time='17:00', place='online') -system Czy chcesz dodać uczestników spotkania? request(participants) -user Tak, proszę zaprosić Jan Nowak, Grażyna Kowalska i Hubert Noga. ack() & inform(participants=['Jan Nowak','Grażyna Kowalska','Hubert Noga']) +user Proszę stworzyć w moim kalendarzu spotkanie online 24.04.2021 o godzinie 17.00. create_meeting(date='24.04.2021', time='17:00') +system Czy chcesz dodać uczestników spotkania? request(participant) +user Tak, proszę zaprosić Jan Nowak, Grażyna Kowalska i Hubert Noga. confirm() & inform(participant='Jan Nowak',participant='Grażyna Kowalska',participant='Hubert Noga') system Proszę potwierdzić utworzenie spotkania: Data: Sobota 24.04.2021 17:00 Miejsce: spotkanie online Spotkanie z: Jan Nowak, Grażyna Kowalska, Hubert Noga confirm-domain() -user Proszę dodać opis "Omówienie projektu XYZ" oraz dodać powiadomienie 30 min przed spotkaniem. inform(description='Omówienie projektu XYZ', reminder='30 min') +user Proszę dodać opis "Omówienie projektu XYZ" oraz dodać powiadomienie 30 min przed spotkaniem. inform(description='Omówienie projektu XYZ') system Proszę potwierdzić utworzenie spotkania: Data: Sobota 24.04.2021 17:00 Miejsce: spotkanie online Spotkanie z: Jan Nowak, Grażyna Kowalska, Hubert Noga Opis: Omówienie projektu XYZ Przypomnienie: 30 min confirm-domain() -user Tak, potwierdzam, dziękuję. confirm(create_meeting) & thankyou() +user Tak, potwierdzam, dziękuję. confirm() & thankyou() system Spotkanie zostało dodane do kalendarza. Czy mogę pomóc w czymś jeszcze? affirm(create_meeting) && reqmore() user Nie, dziękuję. To wszystko. thankyou() & bye() \ No newline at end of file diff --git a/data/dialog-11-06-01.tsv b/data/dialog-11-06-01.tsv index eb2b056..30e3a7e 100644 --- a/data/dialog-11-06-01.tsv +++ b/data/dialog-11-06-01.tsv @@ -1,15 +1,15 @@ Interlocutor Text Acts user Dzień dobry hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Chcialbym sprawdzic czy mam jakies spotkania w najblizszym tygodniu request(meeting_list) & inform(date='w najblizszym tygodniu') +user Chcialbym sprawdzic czy mam jakies spotkania w najblizszym tygodniu meeting_list(date='najblizszym tygodniu') system Data: Wtorek 30.03.2021 19:00-20:30 Miejsce: Restauracja ABC Spotkanie z: Jan Kowalski --- Data: Środa 31.03.2021 12:00-15:30 Miejsce: Firma ABC Spotkanie z: Adam Nowak inform(meeting_list) -user Chciałbym odwołać spotkanie i wjego miejsce wpisać nowe request(cancel_meeting) & request(create_meeting) +user Chciałbym odwołać spotkanie i wjego miejsce wpisać nowe cancel_meeting() & create_meeting() system Jakie spotkanie chcesz odwołać? request(meeting) -user Spotkanie z Adam Nowak inform(meeting='Spotkanie z Adam Nowak') +user Spotkanie z Adam Nowak inform(participant='Adam Nowak') system Spotkanie zostało odwołane. Proszę podać szczegóły nowego spotkania. affirm(cancel_meeting) & request(meeting) -user Spotkanie z Jan Kowalski inform(meeting='Spotkanie z Jan Kowalski') +user Spotkanie z Jan Kowalski inform(participant='Jan Kowalski') user Restauracja xyz inform(place='Restauracja xyz') system Proszę potwierdzić utworzenie spotkania: Data: Środa 31.03.2021 12:00-15:30 Miejsce: Restauracja xyz Spotkanie z: Jan Kowalski confirm-domain() -user Potwierdzam confirm(create_meeting) +user Potwierdzam confirm() system Spotkanie zostało dodane do kalendarza. Czy mogę pomóc w czymś jeszcze? affirm(create_meeting) & reqmore() user To wszystko, dziękuję bye() & thankyou() \ No newline at end of file diff --git a/data/dialog-11-08-01.tsv b/data/dialog-11-08-01.tsv index dbf35d5..8eed4ff 100644 --- a/data/dialog-11-08-01.tsv +++ b/data/dialog-11-08-01.tsv @@ -1,22 +1,22 @@ Interlocutor Text Acts -user Dzień dobry, chciałbym sprawdzić dzisiejsze spotkania hello() & request(meeting_list) & inform(date='dzisiaj') +user Dzień dobry, chciałbym sprawdzić dzisiejsze spotkania hello() & meeting_list(date='dzisiaj') system Data: Wtorek 30.03.2021 12:00-15:30 Miejsce: Restauracja ABC Spotkanie z: Jan Kowalski --- Data: Wtorek 30.03.2021 19:00-20:30 Miejsce: Firma ABC Spotkanie z: Adam Nowak inform(meeting_list) -user Chciałbym przełożyć spotkanie z 12:00 request(update_meeting) & inform(date='dzisiaj', time=12:00) +user Chciałbym przełożyć spotkanie z 12:00 update_meeting(date='dzisiaj', time=12:00) system Na jaki dzień chciałbyś przełożyć to spotkanie? request(date) user Na środę na 13:00 inform(date='środa', time='13:00') system Proszę potwierdzić zmianę spotkania: Data: Środa 31.03.2021 13:00-16:30 Miejsce: Restauracja ABC Spotkanie z: Jan Kowalski confirm-domain() -user Potwierdzam. confirm(update_meeting) +user Potwierdzam. confirm() system Spotkanie zostało zmienione. Czy mogę pomóc w czymś jeszcze? affirm(update_meeting) && reqmore() -user Tak, chciałbym umówić nowe spotkanie request(create_meeting) +user Tak, chciałbym umówić nowe spotkanie create_meeting() system Na jaki dzień chciałbyś umówić nowe spotkanie? request(date) user Na wtorek inform(date='wtorek') system Proszę podać godzinę spotkania. request(time) user 12:45 inform(time='12:45') system Czy chcesz podać miejsce spotkania? request(place) user tak, gabinet dentystyczny SuperDent inform(place='gabinet dentystyczny SuperDent') -system Czy chciałbyś dodać uczestników spotkania? request(participants) -user tak, doktor Krzysztof Ząb inform(participants=['doktor Krzysztof Ząb']) +system Czy chciałbyś dodać uczestników spotkania? request(participant) +user tak, doktor Krzysztof Ząb inform(participant='Krzysztof Ząb') system Proszę potwierdzić utworzenie spotkania: Data: Wtorek 30.03.2021 12:45-13:45 Miejsce: gabinet dentystyczny SuperDent Spotkanie z: doktor Krzysztof Ząb confirm-domain() -user Zatwierdzam confirm(create_meeting) +user Zatwierdzam confirm() system Spotkanie zostało dodane do kalendarza. Czy mogę pomóc w czymś jeszcze? affirm(create_meeting) && reqmore() user To będzie wszystko bye() \ No newline at end of file diff --git a/data/dialog-11-10-01.tsv b/data/dialog-11-10-01.tsv index a75ea92..fd93d7f 100644 --- a/data/dialog-11-10-01.tsv +++ b/data/dialog-11-10-01.tsv @@ -1,13 +1,13 @@ Interlocutor Text Acts user Cześć hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Proszę dodać spotkanie na dziś na godzinę 9 w parku Cytadela request(create_meeting) & inform(date='dzisiaj', time='9:00', place='park Cytadela') +user Proszę dodać spotkanie na dziś na godzinę 9 w parku Cytadela create_meeting(date='dziś',time='9',place='park Cytadela') system Czy chcesz podać czas trwania spotkania? request(duration) -user Nie, proszę dopisać opis: Opis ..... negate() & inform(description='Opis .....') -system Czy chcesz dodać z kim ma być spotkanie? request(participants) +user Nie, proszę dopisać opis: Opis ..... negate() & inform(description='Opis') +system Czy chcesz dodać z kim ma być spotkanie? request(participant) user Nie negate() system Proszę potwierdzić utworzenie spotkania: Data: Wtorek 30.03.2021 09:00 Miejsce: Cytadela Opis: Opis ..... confirm-domain() -user Tak confirm(create_meeting) -user zgadza się confirm(create_meeting) +user Tak confirm() +user zgadza się confirm() system Spotkanie zostało dodane do kalendarza. Czy mogę pomóc w czymś jeszcze? affirm(create_meeting) && reqmore() user Nie, dziękuję za rozmowę bye() & thankyou() \ No newline at end of file diff --git a/data/dialog-11-12-01.tsv b/data/dialog-11-12-01.tsv index 59338d5..78263b0 100644 --- a/data/dialog-11-12-01.tsv +++ b/data/dialog-11-12-01.tsv @@ -1,10 +1,10 @@ Interlocutor Text Acts user Witam. hello() system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Czy mam obecnie jakieś zaplanowane spotkania? request(meeting_list) +user Czy mam obecnie jakieś zaplanowane spotkania? meeting_list() system Data: Wtorek 30.03.2021 19:00-20:30 Miejsce: Restauracja ABC Spotkanie z: Jan Kowalski --- Data: Środa 31.03.2021 12:00-15:30 Miejsce: Firma ABC Spotkanie z: Adam Nowak inform(meeting_list) -user Chciałbym przesunąć pierwsze spotkanie na za tydzień. request(update_meeting) & inform(meeting='pierwsze spotkanie', date_add='tydzień') +user Chciałbym przesunąć pierwsze spotkanie na za tydzień. update_meeting() system Proszę potwierdzić zmianę spotkania:\nData: Wtorek 06.04.2021 19:00-20:30\nMiejsce: Restauracja ABC\nSpotkanie z: Jan Kowalski confirm-domain() -user Potwierdzam confirm(update_meeting) +user Potwierdzam confirm() system Spotkanie zostało zmienione. Czy mogę pomóc w czymś jeszcze? affirm(update_meeting) && reqmore() user Nie, dziękuję za pomoc - to wszystko : ). bye() & thankyou() \ No newline at end of file diff --git a/data/dialog-11-14-01.tsv b/data/dialog-11-14-01.tsv index 07ca568..d8c95c1 100644 --- a/data/dialog-11-14-01.tsv +++ b/data/dialog-11-14-01.tsv @@ -1,13 +1,13 @@ Interlocutor Text Acts system Witam w twoim prywatnym asystencie kalendarza spotkań. welcomemsg() -user Jakie spotkania mam zaplanowane w najbliższy czwartek? request(meeting_list) & inform(date='najbliższy czwartek') +user Jakie spotkania mam zaplanowane w najbliższy czwartek? meeting_list(date='najbliższy czwartek') system Brak zaplanowanych spotkań na dzień 01.04.2021 inform(meeting_list) -user To chciałbym zaplanować spotkanie tego dnia o godzinie 17. request(create_meeting) & inform(date='tego dnia', time='17:00') +user To chciałbym zaplanować spotkanie tego dnia o godzinie 17. create_meeting(date='tego dnia', time='17') system Czy mam zapisać miejsce spotkania? request(place) user Tak, Centrum Handlowe ABC inform(place='Centrum Handlowe ABC') -system Czy mam z zapisać z kim ma być spotkanie? request(participants) -user Tak, spotkanie będzie z Januszem Kowalskim inform(participants=['Januszem Kowalskim']) +system Czy mam z zapisać z kim ma być spotkanie? request(participant) +user Tak, spotkanie będzie z Januszem Kowalskim inform(participant='Januszem Kowalskim') system Proszę potwierdzić utworzenie spotkania: Data: Czwartek 01.01.2021 17:00-18:00 Miejsce: Centrum Handlowe ABC Spotkanie z: Janusz Kowalski confirm-domain() -user Potwierdzam confirm(create_meeting) +user Potwierdzam confirm() system Spotkanie zostało dodane do kalendarza. Czy mogę pomóc w czymś jeszcze? affirm(create_meeting) && reqmore() user Dziękuję, to wszystko. bye() & thankyou() \ No newline at end of file diff --git a/data/train.conllu b/data/train.conllu new file mode 100644 index 0000000..26d8ff0 --- /dev/null +++ b/data/train.conllu @@ -0,0 +1,856 @@ +# text: dzień dobry +# intent: hello +# slots: +1 dzień hello NoLabel +2 dobry hello NoLabel + +# text: dobry wieczór +# intent: hello +# slots: +1 dobry hello NoLabel +2 wieczór hello NoLabel + +# text: witam +# intent: hello +# slots: +1 witam hello NoLabel + +# text: siema +# intent: hello +# slots: +1 siema hello NoLabel + +# text: cześć +# intent: hello +# slots: +1 siema hello NoLabel + +# text: do widzenia +# intent: bye +# slots: +1 do bye NoLabel +2 widzenia bye NoLabel + +# text: miłego dnia +# intent: bye +# slots: +1 miłego bye NoLabel +2 dnia bye NoLabel + +# text: to będzie wszystko +# intent: bye +# slots: +1 to bye NoLabel +2 będzie bye NoLabel +3 wszystko bye NoLabel + +# text: koniec zapisu +# intent: bye +# slots: +1 koniec bye NoLabel +2 zapisu bye NoLabel + +# text: w takim razie to wszystko +# intent: bye +# slots: +1 w bye NoLabel +2 takim bye NoLabel +3 razie bye NoLabel +4 to bye NoLabel +1 wszystko bye NoLabel + +# text: potwierdzam +# intent: confirm +# slots: +1 potwierdzam confirm NoLabel + +# text: ok może być +# intent: confirm +# slots: +1 ok confirm NoLabel +2 może confirm NoLabel +3 być confirm NoLabel + +# text: akceptuję +# intent: confirm +# slots: +1 akceptuję confirm NoLabel + +# text: tak +# intent: confirm +# slots: +1 tak confirm NoLabel + +# text: zgadza się +# intent: confirm +# slots: +1 zgadza confirm NoLabel +2 się confirm NoLabel + +# text: zatwierdzam +# intent: confirm +# slots: +1 zgadza confirm NoLabel +2 się confirm NoLabel + +# text: nie +# intent: negate +# slots: +1 nie negate NoLabel + +# text: bez +# intent: negate +# slots: +1 bez negate NoLabel + +# text: zaprzeczam +# intent: negate +# slots: +1 zaprzeczam negate NoLabel + +# text: bardzo dziękuję +# intent: thankyou +# slots: +1 bardzo thankyou NoLabel +2 dziękuję thankyou NoLabel + +# text: dziękuję +# intent: thankyou +# slots: +1 dziękuję thankyou NoLabel + +# text: dziękuję za informację +# intent: thankyou +# slots: +1 dziękuję thankyou NoLabel + +# text: 05.04.2021 +# intent: inform/date +# slots: +1 05.04.2021 inform/date B-date + +# text: 01.11.2023 +# intent: inform/date +# slots: +1 01.11.2023 inform/date B-date + +# text: 11 grudnia +# intent: inform/date +# slots: +1 11 inform/date B-date +2 grudnia inform/date I-date + +# text: 28 lutego +# intent: inform/date +# slots: +1 28 inform/date B-date +2 lutego inform/date I-date + +# text: spotkanie odbędzie się 3 maja +# intent: inform/date +# slots: +1 spotkanie inform/date NoLabel +2 odbędzie inform/date NoLabel +3 się inform/date NoLabel +4 3 inform/date B-date +5 maja inform/date I-date + +# text: spotkanie w piątek +# intent: inform/date +# slots: +1 spotkanie inform/date NoLabel +2 w inform/date NoLabel +3 piątek inform/date B-date + +# text: pierwszy kwietnia +# intent: inform/date +# slots: +1 pierwszy inform/date B-date +2 kwietnia inform/date I-date + +# text: jutro +# intent: inform/date +# slots: +1 jutro inform/date B-date + +# text: pojutrze +# intent: inform/date +# slots: +1 pojutrze inform/date B-date + +# text: czwartek +# intent: inform/date +# slots: +1 czwartek inform/date B-date + +# text: wtorek +# intent: inform/date +# slots: +1 wtorek inform/date B-date + +# text: data to 11.11.2011 +# intent: inform/date +# slots: +1 data inform/date NoLabel +1 to inform/date NoLabel +1 11.11.2011 inform/date B-date + +# text: spotkanie odbędzie się pojutrze +# intent: inform/date +# slots: +1 spotkanie inform/date NoLabel +2 odbędzie inform/date NoLabel +3 się inform/date NoLabel +4 pojutrze inform/date B-date + +# text: spotkanie będzie w środę +# intent: inform/date +# slots: +1 spotkanie inform/date NoLabel +2 będzie inform/date NoLabel +3 w inform/date NoLabel +4 środę inform/date B-date + +# text: ustaw datę tego spotkania na najbliższy poniedziałek +# intent: inform/date +# slots: +1 ustaw inform/date NoLabel +2 datę inform/date NoLabel +3 tego inform/date NoLabel +3 spotkania inform/date NoLabel +3 na inform/date NoLabel +3 najbliższy inform/date B-date +3 poniedziałek inform/date I-date + +# text: spotkanie będzie o godzinie 19:30 +# intent: inform/time +# slots: +1 spotkanie inform/time NoLabel +2 będzie inform/time NoLabel +3 o inform/time NoLabel +4 godzinie inform/time NoLabel +5 19:30 inform/time B-time + +# text: spotkanie zacznie się o godzinie 21 +# intent: inform/time +# slots: +1 spotkanie inform/time NoLabel +2 zacznie inform/time NoLabel +3 się inform/time NoLabel +4 o inform/time NoLabel +5 godzinie inform/time NoLabel +6 21 inform/time B-time + +# text: spotkanie będzie o 11 +# intent: inform/time +# slots: +1 spotkanie inform/time NoLabel +2 będzie inform/time NoLabel +3 o inform/time NoLabel +4 11 inform/time B-time + +# text: 12:30 +# intent: inform/time +# slots: +1 12:30 inform/time B-time + +# text: godzina 18:30 +# intent: inform/time +# slots: +1 godzina inform/time NoLabel +2 18:30 inform/time B-time + +# text: spotkanie rozpocznie się o 12:00 +# intent: inform/time +# slots: +1 spotkanie inform/time NoLabel +2 rozpocznie inform/time NoLabel +3 się inform/time NoLabel +4 o inform/time NoLabel +5 12:00 inform/time B-time + +# text: godzina tego spotkania to 7:00 +# intent: inform/time +# slots: +1 godzina inform/time NoLabel +2 tego inform/time NoLabel +3 spotkania inform/time NoLabel +4 to inform/time NoLabel +5 7:00 inform/time B-time + +# text: Restauracja ABC +# intent: inform/place +# slots: +1 Restauracja inform/place B-place +2 ABC inform/place I-place + +# text: Kawiarnia MCafe przy ulicy Grunwaldzkiej +# intent: inform/place +# slots: +1 Kawiarnia inform/place B-place +2 MCafe inform/place I-place +3 przy inform/place I-place +4 ulicy inform/place I-place +5 Grunwaldzkiej inform/place I-place + +# text: Restauracja w hotelu Anderisa +# intent: inform/place +# slots: +1 Restauracja inform/place B-place +2 w inform/place I-place +3 hotelu inform/place I-place +4 Anderisa inform/place I-place + +# text: Miejsce spotkania to Kawiarnia JKL +# intent: inform/place +# slots: +1 Miejsce inform/place NoLabel +2 spotkania inform/place NoLabel +3 to inform/place NoLabel +4 Kawiarnia inform/place B-place +5 JKL inform/place I-place + +# text: Cytadela Poznań +# intent: inform/place +# slots: +1 Cytadela inform/place B-place +2 Poznań inform/place I-place + +# text: spotkanie będzie w Jeżyckich Ogrodach +# intent: inform/place +# slots: +1 spotkanie inform/place NoLabel +2 będzie inform/place NoLabel +3 w inform/place NoLabel +4 Jeżyckich inform/place B-place +5 Ogrodach inform/place I-place + +# text: gabinet dentystyczny SuperDent +# intent: inform/place +# slots: +1 gabinet inform/place B-place +2 dentystyczny inform/place I-place +3 SuperDent inform/place I-place + +# text: proszę dodać restaurację Bankcook w Poznaniu jako miejsce spotkania +# intent: inform/place +# slots: +1 proszę inform/place NoLabel +2 dodać inform/place NoLabel +3 restaurację inform/place B-place +4 Bankcook inform/place I-place +5 w inform/place I-place +6 Poznaniu inform/place I-place +7 jako inform/place NoLabel +8 miejsce inform/place NoLabel +9 spotkania inform/place NoLabel + +# text: w przychodni przy ulicy dialogowej +# intent: inform/place +# slots: +1 w inform/place NoLabel +2 przychodni inform/place B-place +3 przy inform/place I-place +4 ulicy inform/place I-place +5 dialogowej inform/place I-place + +# text: Jan Kowalski +# intent: inform/participant +# slots: +1 Jan inform/participant B-participant +2 Kowalski inform/participant I-participant + +# text: proszę dodać Jan Nowak do spotkania +# intent: inform/participant +# slots: +1 proszę inform/participant NoLabel +2 dodać inform/participant NoLabel +3 Jan inform/participant B-participant +4 Nowak inform/participant I-participant +5 do inform/participant NoLabel +6 spotkania inform/participant NoLabel + +# text: Hanna Kowalska +# intent: inform/participant +# slots: +1 Hanna inform/participant B-participant +2 Kowalska inform/participant I-participant + +# text: tak doktor Krzysztof Ząb +# intent: inform/participant +# slots: +1 tak inform/participant NoLabel +2 doktor inform/participant NoLabel +3 Krzysztof inform/participant B-participant +4 Ząb inform/participant I-participant + +# text: Spotkanie będzie z Janem Nowakiem +# intent: inform/participant +# slots: +1 Spotkanie inform/participant NoLabel +2 będzie inform/participant NoLabel +3 z inform/participant NoLabel +4 Janem inform/participant B-participant +5 Nowakiem inform/participant I-participant + +# text: proszę zaprosić Jan Nowak Grażyna Kowalska i Hubert Noga +# intent: inform/participant +# slots: +1 proszę inform/participant NoLabel +2 zaprosić inform/participant NoLabel +3 Jan inform/participant B-participant +4 Nowak inform/participant I-participant +5 Grażyna inform/participant B-participant +6 Kowalska inform/participant I-participant +7 i inform/participant NoLabel +8 Hubert inform/participant B-participant +9 Noga inform/participant I-participant + +# text: spotkanie będzie z Cezarym Pazurą oraz Janem Fryczem +# intent: inform/participant +# slots: +1 spotkanie inform/participant NoLabel +2 będzie inform/participant NoLabel +3 z inform/participant B-participant +4 Cezarym inform/participant B-participant +5 Pazurą inform/participant I-participant +6 oraz inform/participant NoLabel +7 Janem inform/participant B-participant +8 Fryczem inform/participant I-participant + +# text: Marian Paździoch i Ferdynand Kiepski +# intent: inform/participant +# slots: +1 Marian inform/participant B-participant +2 Paździoch inform/participant I-participant +3 i inform/participant NoLabel +4 Ferdynand inform/participant B-participant +5 Kiepski inform/participant I-participant + +# text: Spotkanie rekreacyjne +# intent: inform/description +# slots: +1 Spotkanie inform/description B-description +2 rekreacyjne inform/description I-description + +# text: opis to Omówienie zakupu akcji firmy GameStop +# intent: inform/description +# slots: +1 opis inform/description NoLabel +2 to inform/description NoLabel +3 Omówienie inform/description B-description +4 zakupu inform/description I-description +5 akcji inform/description I-description +6 firmy inform/description I-description +7 GameStop inform/description I-description + +# text: proszę dodać opis Omówienie projektu XYZ +# intent: inform/description +# slots: +1 proszę inform/description NoLabel +2 dodać inform/description NoLabel +3 opis inform/description NoLabel +4 Omówienie inform/description B-description +5 projektu inform/description I-description +6 XYZ inform/description I-description + +# text: nowoczesna impreza w remizie +# intent: inform/description +# slots: +1 nowoczesna inform/description B-description +2 impreza inform/description I-description +3 w inform/description I-description +4 remizie inform/description I-description + +# text: Intensywne rozmowy o przyrodzie przy Yerbie +# intent: inform/description +# slots: +1 Intensywne inform/description B-description +2 rozmowy inform/description I-description +3 o inform/description I-description +4 przyrodzie inform/description I-description +5 przy inform/description I-description +6 Yerbie inform/description I-description + +# text: Spotkanie z kierownikiem zespołu w sprawie prac projektowych +# intent: inform/description +# slots: +1 Spotkanie inform/description NoLabel +2 z inform/description NoLabel +3 kierownikiem inform/description NoLabel +4 zespołu inform/description NoLabel +5 w inform/description B-description +6 sprawie inform/description I-description +7 prac inform/description I-description +8 projektowych inform/description I-description + +# text: Spotkanie będzie dotyczyło omówienia strategii biznesowej +# intent: inform/description +# slots: +1 Spotkanie inform/description NoLabel +2 będzie inform/description NoLabel +3 dotyczyło inform/description NoLabel +4 omówienia inform/description B-description +5 strategii inform/description I-description +6 biznesowej inform/description I-description + +# text: proszę dopisać opis Opis spotkania +# intent: inform/description +# slots: +1 proszę inform/description NoLabel +2 dopisać inform/description NoLabel +3 opis inform/description NoLabel +4 Opis inform/description B-description +5 spotkania inform/description I-description + +# text: chciałabym anulować spotkanie +# intent: meeting/cancel +# slots: +1 chciałabym meeting/cancel NoLabel +2 anulować meeting/cancel NoLabel +3 spotkanie meeting/cancel NoLabel + +# text: chciałbym usunać spotkanie +# intent: meeting/cancel +# slots: +1 chciałabym meeting/cancel NoLabel +2 usunać meeting/cancel NoLabel +3 spotkanie meeting/cancel NoLabel + +# text: proszę odwołać spotkanie +# intent: meeting/cancel +# slots: +1 proszę meeting/cancel NoLabel +2 odwołać meeting/cancel NoLabel +3 spotkanie meeting/cancel NoLabel + +# text: chciałbym odwołać to spotkanie +# intent: meeting/cancel +# slots: +1 chciałbym meeting/cancel NoLabel +2 odwołać meeting/cancel NoLabel +3 to meeting/cancel NoLabel +4 spotkanie meeting/cancel NoLabel + +# text: chcę wyrzucić spotkanie z mojego kalendarza +# intent: meeting/cancel +# slots: +1 chcę meeting/cancel NoLabel +2 wyrzucić meeting/cancel NoLabel +3 spotkanie meeting/cancel NoLabel +4 z meeting/cancel NoLabel +5 mojego meeting/cancel NoLabel +6 kalendarza meeting/cancel NoLabel + +# text: chciałbym przesunąć spotkanie +# intent: meeting/update +# slots: +1 chciałbym meeting/update NoLabel +2 przesunąć meeting/update NoLabel +3 spotkanie meeting/update NoLabel + +# text: chciałbym edytować spotkanie +# intent: meeting/update +# slots: +1 chciałbym meeting/update NoLabel +2 edytować meeting/update NoLabel +3 spotkanie meeting/update NoLabel + +# text: chciałbym zmienić datę spotkania +# intent: meeting/update +# slots: +1 chciałbym meeting/update NoLabel +2 zmienić meeting/update NoLabel +3 datę meeting/update NoLabel +4 spotkania meeting/update NoLabel + +# text: czy moge przesunąć to spotkanie +# intent: meeting/update +# slots: +1 czy meeting/update NoLabel +2 moge meeting/update NoLabel +3 przesunąć meeting/update NoLabel +4 to meeting/update NoLabel +5 spotkanie meeting/update NoLabel + +# text: chciałbym dodać nową osobę do tego spotkania +# intent: meeting/update +# slots: +1 chciałbym meeting/update NoLabel +2 dodać meeting/update NoLabel +3 nową meeting/update NoLabel +4 osobę meeting/update NoLabel +5 do meeting/update NoLabel +6 tego meeting/update NoLabel +7 spotkania meeting/update NoLabel + +# text: zmień proszę godzinę tego spotkania na 17:30 +# intent: meeting/update +# slots: +1 zmień meeting/update NoLabel +2 proszę meeting/update NoLabel +3 godzinę meeting/update NoLabel +4 tego meeting/update NoLabel +5 spotkania meeting/update NoLabel +6 na meeting/update NoLabel +7 17:30 meeting/update B-time + +# text: chciałbym zapisać spotkanie +# intent: meeting/create +# slots: +1 chciałbym meeting/create NoLabel +2 zapisać meeting/create NoLabel +3 spotkanie meeting/create NoLabel + +# text: chciałbym dodać nowe spotkanie +# intent: meeting/create +# slots: +1 chciałbym meeting/create NoLabel +2 dodać meeting/create NoLabel +3 nowe meeting/create NoLabel +4 spotkanie meeting/create NoLabel + +# text: proszę wpisać nowe spotkanie na ten termin: Wyjście do Kina z Tomkiem +# intent: meeting/create +# slots: +1 proszę meeting/create NoLabel +2 wpisać meeting/create NoLabel +3 nowe meeting/create NoLabel +4 spotkanie meeting/create NoLabel +5 na meeting/create NoLabel +6 ten meeting/create NoLabel +7 termin meeting/create NoLabel +8 Wyjście meeting/create B-description +9 do meeting/create I-description +10 Kina meeting/create I-description +11 z meeting/create NoLabel +12 Tomkiem meeting/create B-participant + +# text: proszę wpisać spotkanie na piątek godzinę 9:00 Podsumowanie miesiąca salka A +# intent: meeting/create +# slots: +1 proszę meeting/create NoLabel +2 wpisać meeting/create NoLabel +3 spotkanie meeting/create NoLabel +4 na meeting/create NoLabel +5 piątek meeting/create B-date +6 godzinę meeting/create NoLabel +7 9:00 meeting/create B-time +8 Podsumowanie meeting/create B-description +9 miesiąca meeting/create I-description +10 salka meeting/create B-place +11 A meeting/create I-place + +# text: chciałbym umówić spotkanie dzisiaj o godzinie 17.00 +# intent: meeting/create +# slots: +1 chciałbym meeting/create NoLabel +2 umówić meeting/create NoLabel +3 spotkanie meeting/create NoLabel +4 dzisiaj meeting/create B-date +5 o meeting/create B-date +6 godzinie meeting/create NoLabel +7 17:00 meeting/create B-time + +# text: zapisz mi proszę spotkanie z 3 marca o 17 wizyta u lekarza +# intent: meeting/create +# slots: +1 zapisz meeting/create NoLabel +2 mi meeting/create NoLabel +3 proszę meeting/create NoLabel +4 spotkanie meeting/create NoLabel +5 z meeting/create NoLabel +6 3 meeting/create B-date +7 marca meeting/create I-date +8 o meeting/create NoLabel +9 17 meeting/create B-time +10 wizyta meeting/create B-description +11 u meeting/create I-description +12 lekarza meeting/create I-description + +# text: proszę wpisać na 02.04.2021 o godzinie 19:00 Wyjście do kina ze znajomą +# intent: meeting/create +# slots: +1 proszę meeting/create NoLabel +2 wpisać meeting/create NoLabel +3 na meeting/create NoLabel +4 02.04.2021 meeting/create B-date +5 o meeting/create NoLabel +6 godzinie meeting/create NoLabel +7 19:00 meeting/create B-time +8 Wyjście meeting/create B-description +9 do meeting/create I-description +10 kina meeting/create I-description +11 ze meeting/create I-description +12 znajomą meeting/create I-description + +# text: chciałabym umówić spotkanie +# intent: meeting/create +# slots: +1 chciałabym meeting/create NoLabel +2 umówić meeting/create NoLabel +3 spotkanie meeting/create NoLabel + +# text: chciałabym dodać spotkanie do kalendarza +# intent: meeting/create +# slots: +1 chciałabym meeting/create NoLabel +2 dodać meeting/create NoLabel +3 spotkanie meeting/create NoLabel +4 do meeting/create NoLabel +5 kalendarza meeting/create NoLabel + +# text: proszę o dodanie spotkania biznesowego na dziś wieczór +# intent: meeting/create +# slots: +1 proszę meeting/create NoLabel +2 o meeting/create NoLabel +3 dodanie meeting/create NoLabel +4 spotkania meeting/create NoLabel +5 biznesowego meeting/create NoLabel +6 na meeting/create NoLabel +7 dziś meeting/create B-date +8 wieczór meeting/create NoLabel + +# text: dodaj pozycję jutro na 17.30 Lunch z księgową w miejscu Cafe Teria +# intent: meeting/create +# slots: +1 dodaj meeting/create NoLabel +2 pozycję meeting/create NoLabel +3 jutro meeting/create B-date +4 na meeting/create NoLabel +5 17.30 meeting/create B-time +6 Lunch meeting/create B-description +7 z meeting/create I-description +8 księgową meeting/create I-description +9 w meeting/create NoLabel +10 miejscu meeting/create NoLabel +11 Cafe meeting/create B-place +12 Teria meeting/create I-place + +# text: chciałabym zobaczyć podsumowanie spotkań z ostatniego miesiąca +# intent: meeting/list +# slots: +1 chciałabym meeting/list NoLabel +2 zobaczyć meeting/list NoLabel +3 podsumowanie meeting/list NoLabel +4 spotkań meeting/list NoLabel +5 z meeting/list NoLabel +6 ostatniego meeting/list B-date +7 miesiąca meeting/list I-date + +# text: jakie mam spotkania jutro +# intent: meeting/list +# slots: +1 jakie meeting/list NoLabel +2 mam meeting/list NoLabel +3 spotkania meeting/list NoLabel +4 jutro meeting/list B-date + +# text: proszę o rozpiskę spotkań na następny tydzień +# intent: meeting/list +# slots: +1 proszę meeting/list NoLabel +2 o meeting/list NoLabel +3 rozpiskę meeting/list NoLabel +4 spotkań meeting/list NoLabel +5 na meeting/list NoLabel +6 następny meeting/list B-date +7 tydzień meeting/list I-date + +# text: podaj mi proszę moje spotkania na najbliższy tydzień +# intent: meeting/list +# slots: +1 podaj meeting/list NoLabel +2 mi meeting/list NoLabel +3 proszę meeting/list NoLabel +4 moje meeting/list NoLabel +5 spotkania meeting/list NoLabel +6 na meeting/list NoLabel +7 najbliższy meeting/list B-date +8 tydzień meeting/list I-date + +# text: jakie mam nadchodzące wydarzenia w tym tygodniu +# intent: meeting/list +# slots: +1 jakie meeting/list NoLabel +2 mam meeting/list NoLabel +3 nadchodzące meeting/list NoLabel +4 wydarzenia meeting/list NoLabel +5 w meeting/list NoLabel +6 tym meeting/list B-date +7 tygodniu meeting/list I-date + +# text: jakie spotkania mam w przyszłym tygodniu +# intent: meeting/list +# slots: +1 jakie meeting/list NoLabel +2 spotkania meeting/list NoLabel +3 mam meeting/list NoLabel +4 w meeting/list NoLabel +5 przyszłym meeting/list B-date +6 tygodniu meeting/list I-date + +# text: Czy mam jakieś spotkania w najbliższy piątek +# intent: meeting/list +# slots: +1 Czy meeting/list NoLabel +2 mam meeting/list NoLabel +3 jakieś meeting/list NoLabel +4 spotkania meeting/list NoLabel +5 w meeting/list NoLabel +6 najbliższy meeting/list B-date +7 piątek meeting/list I-date + +# text: chcialbym sprawdzic czy mam jakies spotkania w najblizszym tygodniu +# intent: meeting/list +# slots: +1 chcialbym meeting/list NoLabel +2 sprawdzic meeting/list NoLabel +3 czy meeting/list NoLabel +4 mam meeting/list NoLabel +5 jakies meeting/list NoLabel +6 spotkania meeting/list NoLabel +7 w meeting/list NoLabel +8 najblizszym meeting/list B-date +9 tygodniu meeting/list I-date + +# text: proszę o wyświetlenie jutrzejszego kalendarza +# intent: meeting/list +# slots: +1 proszę meeting/list NoLabel +2 o meeting/list NoLabel +3 wyświetlenie meeting/list NoLabel +4 jutrzejszego meeting/list B-date +5 kalendarza meeting/list NoLabel + +# text: proszę o rozpiskę spotkań w tym tygodniu +# intent: meeting/list +# slots: +1 proszę meeting/list NoLabel +2 o meeting/list NoLabel +3 rozpiskę meeting/list NoLabel +4 spotkań meeting/list NoLabel +5 w meeting/list NoLabel +6 tym meeting/list B-date +7 tygodniu meeting/list I-date + +# text: jakie mam wolne terminy w najbliższy piątek +# intent: meeting/free_time +# slots: +1 jakie meeting/free_time NoLabel +2 mam meeting/free_time NoLabel +3 wolne meeting/free_time NoLabel +4 terminy meeting/free_time NoLabel +5 w meeting/free_time NoLabel +6 najbliższy meeting/free_time B-date +7 piątek meeting/free_time I-date + +# text: czy mam jutro wolne terminy +# intent: meeting/free_time +# slots: +1 czy meeting/free_time NoLabel +2 mam meeting/free_time NoLabel +3 jutro meeting/free_time B-date +4 wolne meeting/free_time NoLabel +5 terminy meeting/free_time B-date \ No newline at end of file diff --git a/eval2.py b/eval2.py deleted file mode 100644 index 22ee566..0000000 --- a/eval2.py +++ /dev/null @@ -1,34 +0,0 @@ -from datetime import date -import jsgf -import pandas as pd -import numpy as np -import os -from NaturalLanguageUnderstanding import NLU - -nlu = NLU() - -gramar = jsgf.parse_grammar_file('book.jsgf') -print(gramar) - -rows = 0 -matches = 0 - -for f in os.listdir('data'): - dialog = pd.read_csv(f'data/{f}', sep='\t') - dialog = dialog.loc[dialog['Interlocutor'] == 'user'] - - for index, row in dialog.iterrows(): - rows += 1 - match = gramar.find_matching_rules(row['Text']) - if match: - acts = row['Acts'].split('&') - for act in acts: - - frame = nlu.parse_user_input(row['Text']) - frame_act_name = frame.getActType().name.lower() - if frame_act_name in act.strip(): - matches += 1 - - -print("Rows processed: " + str(rows)) -print("Accuracy: " + str(matches/rows*100)) diff --git a/evaluate.py b/evaluate.py index b3b87e1..f89f312 100644 --- a/evaluate.py +++ b/evaluate.py @@ -1,6 +1,5 @@ +from UserActType import UserActType import os -import re -import jsgf import pandas as pd import numpy as np from NaturalLanguageUnderstanding import NLU @@ -9,6 +8,7 @@ nlu = NLU() rows = 0 hits = 0 +hard_hits = 0 for file_name in os.listdir('data'): df = pd.read_csv(f'data/{file_name}', sep='\t', names=['interlocutor', 'sentence', 'acts']) @@ -16,15 +16,16 @@ for file_name in os.listdir('data'): data = np.array(df) for row in data: + rows += 1 sentence = row[1] - sentences = sentence.split(',') - for sentence in sentences: - acts = row[2].split('&') - for act in acts: - rows += 1 - frame = nlu.parse_user_input(sentence) - frame_act_name = frame.getActType().name.lower() - if frame_act_name in act.strip(): - hits += 1 + acts = row[2].split('&') + user_act = nlu.parse_user_input(sentence) + for act in acts: + if str(user_act) == act.strip(' '): + hard_hits += 1 + for act in acts: + if act.split('(')[0].strip(' ') == str(user_act).split('(')[0].strip(' '): + hits += 1 -print(f"Accuracy: {(hits / rows)*100}") +print(f"Accuracy (intent only): {(hits / rows)*100} ({hits}/{rows})") +print(f"Accuracy (intent with slots): {(hard_hits / rows)*100} ({hard_hits}/{rows})") diff --git a/main.py b/main.py index 35f5672..68ae437 100644 --- a/main.py +++ b/main.py @@ -14,11 +14,11 @@ if __name__ == "__main__": user_input = input("Wpisz tekst: ") user_frame = nlu.parse_user_input(user_input) - print(str(user_frame)) - dst.addFrame(user_frame) - system_act = dp.chooseTactic(dst.getFrames()) - text = nlg.toText(system_act) + print(user_frame) + #dst.addFrame(user_frame) + #system_act = dp.chooseTactic(dst.getFrames()) + #text = nlg.toText(system_act) - print(text) - if system_act.isDialogFinished(): - break + #print(text) + #if system_act.isDialogFinished(): + # break diff --git a/test_nlu.py b/test_nlu.py new file mode 100644 index 0000000..2987f16 --- /dev/null +++ b/test_nlu.py @@ -0,0 +1,43 @@ +import os +import pandas as pd +import numpy as np +from flair.data import Sentence, Token +from flair.datasets import SentenceDataset +from flair.models import SequenceTagger + +def conllu2flair(sentences, label=None): + fsentences = [] + for sentence in sentences: + fsentence = Sentence() + for token in sentence: + ftoken = Token(token['form']) + if label: + ftoken.add_tag(label, token[label]) + fsentence.add_token(ftoken) + fsentences.append(fsentence) + return SentenceDataset(fsentences) + +def predict(frame_model, sentence): + csentence = [{'form': word} for word in sentence.split()] + fsentence = conllu2flair([csentence])[0] + frame_model.predict(fsentence) + possible_intents = {} + for token in fsentence: + for intent in token.annotation_layers["frame"]: + if(intent.value in possible_intents): + possible_intents[intent.value] += intent.score + else: + possible_intents[intent.value] = intent.score + return max(possible_intents) + +frame_model = SequenceTagger.load('frame-model/final-model.pt') + +for file_name in os.listdir('data'): + df = pd.read_csv(f'data/{file_name}', sep='\t', names=['interlocutor', 'sentence', 'acts']) + df = df[df.interlocutor == 'user'] + data = np.array(df) + + for row in data: + sentence = row[1] + predicted_intent = predict(frame_model, sentence) + print(sentence, predicted_intent) diff --git a/train_frame_nlu.py b/train_frame_nlu.py new file mode 100644 index 0000000..bdea3d0 --- /dev/null +++ b/train_frame_nlu.py @@ -0,0 +1,62 @@ +from conllu import parse_incr +from tabulate import tabulate +from flair.data import Corpus, Sentence, Token +from flair.datasets import SentenceDataset +from flair.embeddings import StackedEmbeddings +from flair.embeddings import WordEmbeddings +from flair.embeddings import CharacterEmbeddings +from flair.embeddings import FlairEmbeddings +from flair.models import SequenceTagger +from flair.trainers import ModelTrainer + +# skrypt do trenowania modelu NLU dla intentów + +# determinizacja obliczeń +import random +import torch +random.seed(42) +torch.manual_seed(42) + +if torch.cuda.is_available(): + torch.cuda.manual_seed(0) + torch.cuda.manual_seed_all(0) + torch.backends.cudnn.enabled = False + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + +def nolabel2o(line, i): + return 'O' if line[i] == 'NoLabel' else line[i] + +def conllu2flair(sentences, label=None): + fsentences = [] + for sentence in sentences: + fsentence = Sentence() + for token in sentence: + ftoken = Token(token['form']) + if label: + ftoken.add_tag(label, token[label]) + fsentence.add_token(ftoken) + fsentences.append(fsentence) + return SentenceDataset(fsentences) + +fields = ['id', 'form', 'frame', 'slot'] + +with open('data/train.conllu', encoding='utf-8') as trainfile: + frame_trainset = list(parse_incr(trainfile, fields=fields, field_parsers={'frame': nolabel2o})) + +frame_corpus = Corpus(train=conllu2flair(frame_trainset, 'frame'), test=conllu2flair(frame_trainset, 'frame')) + +frame_tag_dictionary = frame_corpus.make_tag_dictionary(tag_type='frame') + +embedding_types = [ + WordEmbeddings('pl'), + FlairEmbeddings('pl-forward'), + FlairEmbeddings('pl-backward'), + CharacterEmbeddings(), +] + +embeddings = StackedEmbeddings(embeddings=embedding_types) +frame_tagger = SequenceTagger(hidden_size=256, embeddings=embeddings, tag_dictionary=frame_tag_dictionary, tag_type='frame', use_crf=True) + +frame_trainer = ModelTrainer(frame_tagger, frame_corpus) +frame_trainer.train('frame-model', learning_rate=0.1, mini_batch_size=24, max_epochs=100, train_with_dev=False) \ No newline at end of file diff --git a/train_slot_nlu.py b/train_slot_nlu.py new file mode 100644 index 0000000..0baa6e3 --- /dev/null +++ b/train_slot_nlu.py @@ -0,0 +1,62 @@ +from conllu import parse_incr +from tabulate import tabulate +from flair.data import Corpus, Sentence, Token +from flair.datasets import SentenceDataset +from flair.embeddings import StackedEmbeddings +from flair.embeddings import WordEmbeddings +from flair.embeddings import CharacterEmbeddings +from flair.embeddings import FlairEmbeddings +from flair.models import SequenceTagger +from flair.trainers import ModelTrainer + +# skrypt do trenowania modelu NLU dla slotów + +# determinizacja obliczeń +import random +import torch +random.seed(42) +torch.manual_seed(42) + +if torch.cuda.is_available(): + torch.cuda.manual_seed(0) + torch.cuda.manual_seed_all(0) + torch.backends.cudnn.enabled = False + torch.backends.cudnn.benchmark = False + torch.backends.cudnn.deterministic = True + +def nolabel2o(line, i): + return 'O' if line[i] == 'NoLabel' else line[i] + +def conllu2flair(sentences, label=None): + fsentences = [] + for sentence in sentences: + fsentence = Sentence() + for token in sentence: + ftoken = Token(token['form']) + if label: + ftoken.add_tag(label, token[label]) + fsentence.add_token(ftoken) + fsentences.append(fsentence) + return SentenceDataset(fsentences) + +fields = ['id', 'form', 'frame', 'slot'] + +with open('data/train.conllu', encoding='utf-8') as trainfile: + slot_trainset = list(parse_incr(trainfile, fields=fields, field_parsers={'slot': nolabel2o})) + +slot_corpus = Corpus(train=conllu2flair(slot_trainset, 'slot'), test=conllu2flair(slot_trainset, 'slot')) + +slot_tag_dictionary = slot_corpus.make_tag_dictionary(tag_type='slot') + +embedding_types = [ + WordEmbeddings('pl'), + FlairEmbeddings('pl-forward'), + FlairEmbeddings('pl-backward'), + CharacterEmbeddings(), +] + +embeddings = StackedEmbeddings(embeddings=embedding_types) +slot_tagger = SequenceTagger(hidden_size=256, embeddings=embeddings, tag_dictionary=slot_tag_dictionary, tag_type='slot', use_crf=True) + +slot_trainer = ModelTrainer(slot_tagger, slot_corpus) +slot_trainer.train('slot-model', learning_rate=0.1, mini_batch_size=24, max_epochs=100, train_with_dev=False) \ No newline at end of file