From cf1e1ab684cabb3c3fc3b3929f5eaab25de4dd2f Mon Sep 17 00:00:00 2001 From: Kacper Date: Sun, 12 Jun 2022 14:41:21 +0200 Subject: [PATCH] system commands, time/turns tracking, redo nlg fixes --- dialogue_system.py | 41 +++++++++++++++++++++++------------ modules/NLG.py | 53 +++++++++++++++++++++++----------------------- 2 files changed, 54 insertions(+), 40 deletions(-) diff --git a/dialogue_system.py b/dialogue_system.py index 6c36f37..122b496 100644 --- a/dialogue_system.py +++ b/dialogue_system.py @@ -4,8 +4,11 @@ from modules.DST import DST from modules.NLG import NLG import json import re +import time -value_dict = json.load(open('value_dict.json')) + + +value_dict = json.load(open('modules/value_dict.json')) def format_prediction(prediction, intent): out_list = [] @@ -31,23 +34,29 @@ def main(): nlu.train_slot_model('data/train+test-pl.conllu', 'data/train+test-pl.conllu') nlu.train_intent_model('data/NLU_data_intent') - # nlu.load_slot_model('slot-model-pl') - # nlu.load_intent_model('intent-model-pl') + #nlu.load_slot_model('slot-model-pl') + #nlu.load_intent_model('intent-model-pl') + + start = time.time() + turns = 0 print('===========================================') print('### By otrzymać pomoc, wpisz /pomoc ###') print('### By zakończyć rozmowę, wpisz /koniec ###') + print('### By rozpocząć rozmowę od początku, wpisz /reset ###') + print('### By podejrzeć stan dialogu, wpisz /dst ###') print('Witaj, jestem Usher - system do rezerwacji biletów kinowych. W czym mogę Ci pomóc?') # WIP while True: + turns += 1 user_input = input('> ') user_input_lr = user_input.lower() flag = False slots = nlu.predict_slots(user_input) intent = nlu.predict_intent(user_input) formatted_prediction = format_prediction(slots, intent) - print(formatted_prediction) + #print(formatted_prediction) for slot in formatted_prediction: if slot[2]=='seat': if ',' in slot[3]: @@ -58,11 +67,19 @@ def main(): if user_input_lr == '/pomoc': - print('TEKST_POMOCY_WIP') + print('System Usher pozwala na:\n1. Rezerwację biletu\n2. Anulowanie rezerwacji biletu\n3. Zakup biletu\n4. Anulowanie zakupu biletu\n5. Sprawdzenie repertuaru\n6. Sprawdzenie dostępności miejsc') elif user_input_lr == '/koniec': print('Dziękuję za skorzystanie z moich usług. Miłego dnia!') break + + elif user_input_lr == '/dst': + print(dst.state) + + elif user_input_lr == '/reset': + dst = DST() + # dp = DP() ? + print('Witaj, jestem Usher - system do rezerwacji biletów kinowych. W czym mogę Ci pomóc?') elif 'rezerw' in user_input_lr: if 'anulo' in user_input_lr: @@ -106,7 +123,6 @@ def main(): else: dst.update([['inform', 'Cinema', 'task', 'buy']]) dst.update(formatted_prediction) - print(dst.state) for slot,value in dst.state['belief_state']['cinema']['book'].items(): if value == '': print(nlg.update([['cinema','request',slot,'']])) @@ -121,7 +137,6 @@ def main(): elif (('jak' or 'któr') and 'film') in user_input_lr or 'repertuar' in user_input_lr: dst.update([['inform', 'Cinema', 'task', 'show_movies']]) - print(dst.state) flag=False for slot in slots: if slot[0] in value_dict['train']['date'] or slot[0] in value_dict['train']['day'] or slot[0] in ['dziś','jutro','pojutrze']: @@ -132,7 +147,6 @@ def main(): elif (('czy' or 'jakie' or 'które') and ('dostęp' or 'woln' or 'zajęt') and 'miejsc') in user_input_lr: dst.update([['offer', 'Cinema', 'task', 'show_seats']]) - print(dst.state) flag=False for slot in slots: if slot[0] in value_dict['train']['seat']: @@ -145,9 +159,8 @@ def main(): print('Nie do końca zrozumiałem mógłbyś/mogłabyś powtórzyć? ') else: - print(formatted_prediction) # NLU output + # print(formatted_prediction) # NLU output dst.update(formatted_prediction) - print(dst.state) # DST output #DP for slot,value in dst.state['belief_state']['cinema']['book'].items(): if value == '': @@ -157,7 +170,7 @@ def main(): for slot,value in dst.state['belief_state']['cinema']['semi'].items(): if slot == 'payments' and value == '': print('Czy chciałbyś dokonać płatności online?') - input_user = input() + input_user = input('> ') if input_user.lower() == 'tak': print(nlg.update([['cinema','request',slot,'online']])) dst.update([['inform', 'Cinema', 'payments', 'online']]) @@ -169,12 +182,14 @@ def main(): break elif slot in ["cancel_book_status","cancel_buy_status"] and value =='': continue - + end = time.time() + print(f'### Czas konwersacji: {end - start} ###') + print(f'### Tury konwersacji: {turns} ###') if __name__ == '__main__': main() - \ No newline at end of file + diff --git a/modules/NLG.py b/modules/NLG.py index 2f50e23..a564f0e 100644 --- a/modules/NLG.py +++ b/modules/NLG.py @@ -1,8 +1,7 @@ import json from xml import dom -value_dict = json.load(open('value_dict.json')) +value_dict = json.load(open('modules/value_dict.json')) -# json.load(open('value_dict.json')) class NLG: def __init__(self): self.answer = '' @@ -12,93 +11,93 @@ class NLG: for domain, intent, slot, value in system_act: if domain == 'cinema' and intent == 'inform' and slot == 'seat': if value == '': - self.answer += f'Gdzie dokładnie chciałabyś/byś zarezezrwować miejsce. ' + self.answer += f'Gdzie dokładnie chciałbyś/chciałabyś zarezerwować miejsce? ' elif value == "top": - self.answer += f'Wolne miejsca na górze w rzędzie 10 miejsca od 5 do 10 i od 12 do 14. ' + self.answer += f'Wolne miejsca na górze w rzędzie 10: miejsca od 5 do 10 i od 12 do 14. ' elif value <= "bottom": - self.answer += f'Wolne miejsca na dole w rzędzie 1 miejsca od 2 do 10 i od 12 do 14. ' + self.answer += f'Wolne miejsca na dole w rzędzie 1: miejsca od 2 do 10 i od 12 do 14. ' elif value <= "middle": - self.answer += f'Wolne miejsca na środku w rzędzie 6 miejsca od 5 do 10. ' + self.answer += f'Wolne miejsca na środku w rzędzie 6: miejsca od 5 do 10. ' else: self.answer += f'Nie znalazłem miejsca. ' elif domain == 'cinema' and intent == 'inform' and slot == 'cancel_book': if len(value): - self.answer += f'Rezerwacja na maila: {value} została anulowana. ' + self.answer += f'Rezerwacja na adres e-mail: {value} została anulowana. ' elif value == '': - self.answer += f'Proszę podać e-mail na który była rezerwacja miejsce. ' + self.answer += f'Proszę podać e-mail na który dokonana została rezerwacja miejsce. ' else: self.answer += f'Rezerwacja nie została anulowana. ' elif domain == 'cinema' and intent == 'request' and slot == 'movie': if value == '': - self.answer += f'Na jaki film chciałbyś/abyś pójść. ' + self.answer += f'Na jaki film chciałbyś/chciałabyś pójść? ' elif domain == 'cinema' and intent == 'inform' and slot == 'movie': if value == '': self.answer += f'Nie znalazłem filmu. ' else: self.answer += f'Film {value} będzie wyświetlany jutro o godzinie 21:30. ' elif domain == 'cinema' and intent == 'offer' and slot == 'closestscreening': - if value in ['dziś','jutro','pojutrze']: + if value in ['Dziś','Jutro','Pojutrze']: self.answer += f'{value} prezentujemy Batmana o 18:30 i Ambulans o 21:00. ' elif value in value_dict['train']['day']: self.answer += f'W {value} prezentujemy Ambulans o 18:30 i To nie wypanda o 20:00. ' elif value in value_dict['train']['date']: self.answer += f'Dnia {value} prezentujemy Batmana o 18:00 i Sing 2 o 20:30. ' elif value == '': - self.answer += f'W naszym kinie polecamy obejrzeć seans Batmana który odbędzie się dziś o 18:30. ' + self.answer += f'W naszym kinie polecamy obejrzeć seans Batmana, który odbędzie się dzisiaj o 18:30. ' elif domain == 'cinema' and intent == 'request' and slot == 'e-mail': if value== '': - self.answer += 'Prosze podać e-mail. ' + self.answer += 'Proszę podać adres e-mail. ' elif domain == 'cinema' and intent == 'request' and slot == 'date': if value== '': - self.answer += 'Którego dnia chciałabyś/byś pani obejrzeć ten film. ' + self.answer += 'Którego dnia chciałbyś/chciałabyś obejrzeć ten film? ' elif domain == 'cinema' and intent == 'request' and slot == 'name': if value== '': - self.answer += 'Prosze podać imie i nazwisko. ' + self.answer += 'Proszę podać imię i nazwisko. ' elif domain == 'cinema' and intent == 'request' and slot == 'phone': if value== '': - self.answer += 'Prosze podać numer telefonu. ' + self.answer += 'Proszę podać numer telefonu. ' elif domain == 'cinema' and intent =='request' and slot == 'row': if value in value_dict['train']['seat_row']: self.answer += f'W rzędzie {value} są wolne miejsca od 1 do 4 i od 12 do 15. ' elif value == '': - self.answer += f'W jakim rzędzie chciałbyś/abyś zarezerwować miejsce. ' + self.answer += f'W jakim rzędzie chciałbyś/chciałabyś zarezerwować miejsce? ' else: self.answer += f'Nie ma wolnych miejsc w rzędzie {value}. ' elif domain == 'cinema' and intent =='request' and slot == 'seat_place': if value in value_dict['train']['seat_place']: self.answer += f'W rzędzie 4 jest wolne miejsce {value}. ' else: - self.answer += f'W rzędzie 4 nie ma wolnego miejsce {value}. ' + self.answer += f'W rzędzie 4 nie ma wolnego miejsca {value}. ' elif domain == 'cinema' and intent =='offer' and slot == 'seat': if value in value_dict['train']['seat']: - self.answer += 'Miejsce {value} jest wolne. ' - elif value =='': - self.answer += 'Sala jest obłożona w 15%. Głównie w rzędach 4, 5 i 6. ' + self.answer += f'Miejsce {value} jest wolne. ' + elif value == '': + self.answer += 'Sala jest obłożona w 15%. Głównie w rzędach 4, 5 i 6. ' elif domain == 'cinema' and intent =='request' and slot == 'seat': if value in value_dict['train']['seat']: self.answer += f'Miejsce {value} jest wolne. ' elif value == '': - self.answer += f'Jakie miejsce chciałbyś/abyś zarezerwować. ' + self.answer += f'Jakie miejsce chciałbyś/chciałabyś zarezerwować? ' else: self.answer += f'Miejsce {value} nie jest wolne. ' elif domain == 'cinema' and intent == 'inform' and slot == 'Location': - self.answer += 'Kino znajduję się na ulicy Jana Pawła 2/40. ' + self.answer += 'Kino znajduje się na ulicy Jana Pawła 2/40. ' elif domain == 'cinema' and intent == 'inform' and slot == 'cinema_name': self.answer += 'Kino nazywa sie Hellios' elif domain == 'cinema' and intent == 'offer' and slot == 'time': if value in ['15:00','12:00','18:00','18:30','19:00','20:00','20:30','21:00','21:30']: - self.answer += f'Dostępny jest seans na godzine {value}. ' + self.answer += f'Dostępny jest seans na godzinę {value}. ' else: self.answer += f'Nie mamy aktualnie seansu na taką godzinę. ' elif domain == 'cinema' and intent == 'request' and slot == 'tickettype': if value == '': - self.answer += 'Czy chciałabyś/byś bilet normalny czy ulgowy? ' + self.answer += 'Czy chciałbyś/chciałabyś bilet normalny czy ulgowy? ' elif domain == 'cinema' and intent == 'request' and slot == 'quantity': if value == '': - self.answer += 'Ile biletów chciałabyś/byś zarezerwować. ' + self.answer += 'Ile biletów chciałbyś/chciałabyś zarezerwować? ' elif domain == 'cinema' and intent == 'request' and slot == 'hour': if value == '': - self.answer += 'O jakiej godzinie chciałabyś/byś zobaczyć film. ' + self.answer += 'O jakiej godzinie chciałbyś/chciałabyś zobaczyć film? ' elif domain == 'cinema' and intent == 'request' and slot == 'payments': if value == 'online': self.answer += 'Proszę dokonać płatność online. Dziękujemy za skorzystanie z naszych usług. ' @@ -107,4 +106,4 @@ class NLG: return self.answer # nlg = NLG() -# print(nlg.update([['cinema','offer','seat','']])) +# print(nlg.update([['cinema', 'offer', 'seat', '']]))