system commands, time/turns tracking, redo nlg fixes
This commit is contained in:
parent
3a9503bee7
commit
cf1e1ab684
@ -4,8 +4,11 @@ from modules.DST import DST
|
|||||||
from modules.NLG import NLG
|
from modules.NLG import NLG
|
||||||
import json
|
import json
|
||||||
import re
|
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):
|
def format_prediction(prediction, intent):
|
||||||
out_list = []
|
out_list = []
|
||||||
@ -31,23 +34,29 @@ def main():
|
|||||||
|
|
||||||
nlu.train_slot_model('data/train+test-pl.conllu', 'data/train+test-pl.conllu')
|
nlu.train_slot_model('data/train+test-pl.conllu', 'data/train+test-pl.conllu')
|
||||||
nlu.train_intent_model('data/NLU_data_intent')
|
nlu.train_intent_model('data/NLU_data_intent')
|
||||||
# nlu.load_slot_model('slot-model-pl')
|
#nlu.load_slot_model('slot-model-pl')
|
||||||
# nlu.load_intent_model('intent-model-pl')
|
#nlu.load_intent_model('intent-model-pl')
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
turns = 0
|
||||||
|
|
||||||
print('===========================================')
|
print('===========================================')
|
||||||
print('### By otrzymać pomoc, wpisz /pomoc ###')
|
print('### By otrzymać pomoc, wpisz /pomoc ###')
|
||||||
print('### By zakończyć rozmowę, wpisz /koniec ###')
|
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?')
|
print('Witaj, jestem Usher - system do rezerwacji biletów kinowych. W czym mogę Ci pomóc?')
|
||||||
|
|
||||||
# WIP
|
# WIP
|
||||||
while True:
|
while True:
|
||||||
|
turns += 1
|
||||||
user_input = input('> ')
|
user_input = input('> ')
|
||||||
user_input_lr = user_input.lower()
|
user_input_lr = user_input.lower()
|
||||||
flag = False
|
flag = False
|
||||||
slots = nlu.predict_slots(user_input)
|
slots = nlu.predict_slots(user_input)
|
||||||
intent = nlu.predict_intent(user_input)
|
intent = nlu.predict_intent(user_input)
|
||||||
formatted_prediction = format_prediction(slots, intent)
|
formatted_prediction = format_prediction(slots, intent)
|
||||||
print(formatted_prediction)
|
#print(formatted_prediction)
|
||||||
for slot in formatted_prediction:
|
for slot in formatted_prediction:
|
||||||
if slot[2]=='seat':
|
if slot[2]=='seat':
|
||||||
if ',' in slot[3]:
|
if ',' in slot[3]:
|
||||||
@ -58,11 +67,19 @@ def main():
|
|||||||
|
|
||||||
|
|
||||||
if user_input_lr == '/pomoc':
|
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':
|
elif user_input_lr == '/koniec':
|
||||||
print('Dziękuję za skorzystanie z moich usług. Miłego dnia!')
|
print('Dziękuję za skorzystanie z moich usług. Miłego dnia!')
|
||||||
break
|
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:
|
elif 'rezerw' in user_input_lr:
|
||||||
if 'anulo' in user_input_lr:
|
if 'anulo' in user_input_lr:
|
||||||
@ -106,7 +123,6 @@ def main():
|
|||||||
else:
|
else:
|
||||||
dst.update([['inform', 'Cinema', 'task', 'buy']])
|
dst.update([['inform', 'Cinema', 'task', 'buy']])
|
||||||
dst.update(formatted_prediction)
|
dst.update(formatted_prediction)
|
||||||
print(dst.state)
|
|
||||||
for slot,value in dst.state['belief_state']['cinema']['book'].items():
|
for slot,value in dst.state['belief_state']['cinema']['book'].items():
|
||||||
if value == '':
|
if value == '':
|
||||||
print(nlg.update([['cinema','request',slot,'']]))
|
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:
|
elif (('jak' or 'któr') and 'film') in user_input_lr or 'repertuar' in user_input_lr:
|
||||||
dst.update([['inform', 'Cinema', 'task', 'show_movies']])
|
dst.update([['inform', 'Cinema', 'task', 'show_movies']])
|
||||||
print(dst.state)
|
|
||||||
flag=False
|
flag=False
|
||||||
for slot in slots:
|
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']:
|
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:
|
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']])
|
dst.update([['offer', 'Cinema', 'task', 'show_seats']])
|
||||||
print(dst.state)
|
|
||||||
flag=False
|
flag=False
|
||||||
for slot in slots:
|
for slot in slots:
|
||||||
if slot[0] in value_dict['train']['seat']:
|
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ć? ')
|
print('Nie do końca zrozumiałem mógłbyś/mogłabyś powtórzyć? ')
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print(formatted_prediction) # NLU output
|
# print(formatted_prediction) # NLU output
|
||||||
dst.update(formatted_prediction)
|
dst.update(formatted_prediction)
|
||||||
print(dst.state) # DST output
|
|
||||||
#DP
|
#DP
|
||||||
for slot,value in dst.state['belief_state']['cinema']['book'].items():
|
for slot,value in dst.state['belief_state']['cinema']['book'].items():
|
||||||
if value == '':
|
if value == '':
|
||||||
@ -157,7 +170,7 @@ def main():
|
|||||||
for slot,value in dst.state['belief_state']['cinema']['semi'].items():
|
for slot,value in dst.state['belief_state']['cinema']['semi'].items():
|
||||||
if slot == 'payments' and value == '':
|
if slot == 'payments' and value == '':
|
||||||
print('Czy chciałbyś dokonać płatności online?')
|
print('Czy chciałbyś dokonać płatności online?')
|
||||||
input_user = input()
|
input_user = input('> ')
|
||||||
if input_user.lower() == 'tak':
|
if input_user.lower() == 'tak':
|
||||||
print(nlg.update([['cinema','request',slot,'online']]))
|
print(nlg.update([['cinema','request',slot,'online']]))
|
||||||
dst.update([['inform', 'Cinema', 'payments', 'online']])
|
dst.update([['inform', 'Cinema', 'payments', 'online']])
|
||||||
@ -169,12 +182,14 @@ def main():
|
|||||||
break
|
break
|
||||||
elif slot in ["cancel_book_status","cancel_buy_status"] and value =='':
|
elif slot in ["cancel_book_status","cancel_buy_status"] and value =='':
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
||||||
|
end = time.time()
|
||||||
|
print(f'### Czas konwersacji: {end - start} ###')
|
||||||
|
print(f'### Tury konwersacji: {turns} ###')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import json
|
import json
|
||||||
from xml import dom
|
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:
|
class NLG:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.answer = ''
|
self.answer = ''
|
||||||
@ -12,93 +11,93 @@ class NLG:
|
|||||||
for domain, intent, slot, value in system_act:
|
for domain, intent, slot, value in system_act:
|
||||||
if domain == 'cinema' and intent == 'inform' and slot == 'seat':
|
if domain == 'cinema' and intent == 'inform' and slot == 'seat':
|
||||||
if value == '':
|
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":
|
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":
|
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":
|
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:
|
else:
|
||||||
self.answer += f'Nie znalazłem miejsca. '
|
self.answer += f'Nie znalazłem miejsca. '
|
||||||
elif domain == 'cinema' and intent == 'inform' and slot == 'cancel_book':
|
elif domain == 'cinema' and intent == 'inform' and slot == 'cancel_book':
|
||||||
if len(value):
|
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 == '':
|
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:
|
else:
|
||||||
self.answer += f'Rezerwacja nie została anulowana. '
|
self.answer += f'Rezerwacja nie została anulowana. '
|
||||||
elif domain == 'cinema' and intent == 'request' and slot == 'movie':
|
elif domain == 'cinema' and intent == 'request' and slot == 'movie':
|
||||||
if value == '':
|
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':
|
elif domain == 'cinema' and intent == 'inform' and slot == 'movie':
|
||||||
if value == '':
|
if value == '':
|
||||||
self.answer += f'Nie znalazłem filmu. '
|
self.answer += f'Nie znalazłem filmu. '
|
||||||
else:
|
else:
|
||||||
self.answer += f'Film {value} będzie wyświetlany jutro o godzinie 21:30. '
|
self.answer += f'Film {value} będzie wyświetlany jutro o godzinie 21:30. '
|
||||||
elif domain == 'cinema' and intent == 'offer' and slot == 'closestscreening':
|
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. '
|
self.answer += f'{value} prezentujemy Batmana o 18:30 i Ambulans o 21:00. '
|
||||||
elif value in value_dict['train']['day']:
|
elif value in value_dict['train']['day']:
|
||||||
self.answer += f'W {value} prezentujemy Ambulans o 18:30 i To nie wypanda o 20:00. '
|
self.answer += f'W {value} prezentujemy Ambulans o 18:30 i To nie wypanda o 20:00. '
|
||||||
elif value in value_dict['train']['date']:
|
elif value in value_dict['train']['date']:
|
||||||
self.answer += f'Dnia {value} prezentujemy Batmana o 18:00 i Sing 2 o 20:30. '
|
self.answer += f'Dnia {value} prezentujemy Batmana o 18:00 i Sing 2 o 20:30. '
|
||||||
elif value == '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'e-mail':
|
||||||
if value== '':
|
if value== '':
|
||||||
self.answer += 'Prosze podać e-mail. '
|
self.answer += 'Proszę podać adres e-mail. '
|
||||||
elif domain == 'cinema' and intent == 'request' and slot == 'date':
|
elif domain == 'cinema' and intent == 'request' and slot == 'date':
|
||||||
if value== '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'name':
|
||||||
if value== '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'phone':
|
||||||
if value== '':
|
if value== '':
|
||||||
self.answer += 'Prosze podać numer telefonu. '
|
self.answer += 'Proszę podać numer telefonu. '
|
||||||
elif domain == 'cinema' and intent =='request' and slot == 'row':
|
elif domain == 'cinema' and intent =='request' and slot == 'row':
|
||||||
if value in value_dict['train']['seat_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. '
|
self.answer += f'W rzędzie {value} są wolne miejsca od 1 do 4 i od 12 do 15. '
|
||||||
elif value == '':
|
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:
|
else:
|
||||||
self.answer += f'Nie ma wolnych miejsc w rzędzie {value}. '
|
self.answer += f'Nie ma wolnych miejsc w rzędzie {value}. '
|
||||||
elif domain == 'cinema' and intent =='request' and slot == 'seat_place':
|
elif domain == 'cinema' and intent =='request' and slot == 'seat_place':
|
||||||
if value in value_dict['train']['seat_place']:
|
if value in value_dict['train']['seat_place']:
|
||||||
self.answer += f'W rzędzie 4 jest wolne miejsce {value}. '
|
self.answer += f'W rzędzie 4 jest wolne miejsce {value}. '
|
||||||
else:
|
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':
|
elif domain == 'cinema' and intent =='offer' and slot == 'seat':
|
||||||
if value in value_dict['train']['seat']:
|
if value in value_dict['train']['seat']:
|
||||||
self.answer += 'Miejsce {value} jest wolne. '
|
self.answer += f'Miejsce {value} jest wolne. '
|
||||||
elif value =='':
|
elif value == '':
|
||||||
self.answer += 'Sala jest obłożona w 15%. Głównie w rzędach 4, 5 i 6. '
|
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':
|
elif domain == 'cinema' and intent =='request' and slot == 'seat':
|
||||||
if value in value_dict['train']['seat']:
|
if value in value_dict['train']['seat']:
|
||||||
self.answer += f'Miejsce {value} jest wolne. '
|
self.answer += f'Miejsce {value} jest wolne. '
|
||||||
elif value == '':
|
elif value == '':
|
||||||
self.answer += f'Jakie miejsce chciałbyś/abyś zarezerwować. '
|
self.answer += f'Jakie miejsce chciałbyś/chciałabyś zarezerwować? '
|
||||||
else:
|
else:
|
||||||
self.answer += f'Miejsce {value} nie jest wolne. '
|
self.answer += f'Miejsce {value} nie jest wolne. '
|
||||||
elif domain == 'cinema' and intent == 'inform' and slot == 'Location':
|
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':
|
elif domain == 'cinema' and intent == 'inform' and slot == 'cinema_name':
|
||||||
self.answer += 'Kino nazywa sie Hellios'
|
self.answer += 'Kino nazywa sie Hellios'
|
||||||
elif domain == 'cinema' and intent == 'offer' and slot == 'time':
|
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']:
|
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:
|
else:
|
||||||
self.answer += f'Nie mamy aktualnie seansu na taką godzinę. '
|
self.answer += f'Nie mamy aktualnie seansu na taką godzinę. '
|
||||||
elif domain == 'cinema' and intent == 'request' and slot == 'tickettype':
|
elif domain == 'cinema' and intent == 'request' and slot == 'tickettype':
|
||||||
if value == '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'quantity':
|
||||||
if value == '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'hour':
|
||||||
if value == '':
|
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':
|
elif domain == 'cinema' and intent == 'request' and slot == 'payments':
|
||||||
if value == 'online':
|
if value == 'online':
|
||||||
self.answer += 'Proszę dokonać płatność online. Dziękujemy za skorzystanie z naszych usług. '
|
self.answer += 'Proszę dokonać płatność online. Dziękujemy za skorzystanie z naszych usług. '
|
||||||
@ -107,4 +106,4 @@ class NLG:
|
|||||||
return self.answer
|
return self.answer
|
||||||
|
|
||||||
# nlg = NLG()
|
# nlg = NLG()
|
||||||
# print(nlg.update([['cinema','offer','seat','']]))
|
# print(nlg.update([['cinema', 'offer', 'seat', '']]))
|
||||||
|
Loading…
Reference in New Issue
Block a user