DP is kinda working for "appointment" and "prescription"
This commit is contained in:
parent
f58a1b47c7
commit
af7b8a8045
@ -28,9 +28,8 @@ class Janet:
|
||||
|
||||
def process(self, command):
|
||||
act = self.nlu_v2.test_nlu(command)
|
||||
self.dst.update(act)
|
||||
dest_act = self.dp.choose_tactic(self.dst.transfer())
|
||||
return self.nlg.change_to_text(dest_act)
|
||||
return self.dp.predict(self.dst.update(act))
|
||||
#return self.nlg.change_to_text(dest_act)
|
||||
|
||||
|
||||
def main():
|
||||
|
@ -1,4 +1,9 @@
|
||||
class DP:
|
||||
from collections import defaultdict
|
||||
import copy
|
||||
import json
|
||||
from copy import deepcopy
|
||||
|
||||
class DP():
|
||||
"""
|
||||
Moduł decydujący o wyborze kolejnego aktu, który ma podjąć system prowadząc rozmowę.
|
||||
|
||||
@ -6,12 +11,131 @@ class DP:
|
||||
|
||||
Wyjście: Akt systemu (rama)
|
||||
"""
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def choose_tactic(self, frame_list):
|
||||
"""
|
||||
Obieranie taktyki na podstawie aktów usera. Bardzo ważna jest kolejność dodawanych do frame_list wartości.
|
||||
"""
|
||||
act_vector = [0, 0]
|
||||
return act_vector
|
||||
|
||||
def predict(self, state):
|
||||
self.results = []
|
||||
system_action = defaultdict(list)
|
||||
user_action = defaultdict(list)
|
||||
|
||||
for intent, domain, slot, value in state['user_action']:
|
||||
user_action[(domain, intent)].append((slot, value))
|
||||
|
||||
for user_act in user_action:
|
||||
self.update_system_action(user_act, user_action, state, system_action)
|
||||
|
||||
|
||||
# # Reguła 3
|
||||
# if any(True for slots in user_action.values() for (slot, _) in slots if slot in ['Stay', 'Day', 'People']):
|
||||
# if self.results:
|
||||
# system_action = {('Booking', 'Book'): [["Ref", self.results[0].get('Ref', 'N/A')]]}
|
||||
|
||||
# system_acts = [[intent, domain, slot, value] for (domain, intent), slots in system_action.items() for slot, value in slots]
|
||||
# state['system_action'] = system_acts
|
||||
# return system_acts
|
||||
|
||||
def update_system_action(self, user_act, user_action, state, system_action):
|
||||
domain, intent = user_act
|
||||
constraints = [(slot, value) for slot, value in state['belief_state'][domain.lower()].items() if value != '']
|
||||
|
||||
print(domain)
|
||||
print(intent)
|
||||
print(constraints)
|
||||
|
||||
# Reguła 1
|
||||
|
||||
if domain == 'appointment':
|
||||
if len(constraints) == 0:
|
||||
system_action[(domain, 'NoOffer')] = []
|
||||
elif intent == 'appointment/create_appointment':
|
||||
for x in constraints:
|
||||
if(x[0] == 'doctor'):
|
||||
system_action[(domain, 'book_appointent')].append([x[0], x[1]])
|
||||
for y in constraints:
|
||||
if(y[0] == 'datetime'):
|
||||
system_action[(domain, 'book_appointent')].append([y[0], y[1]])
|
||||
elif intent == 'appointment/set_date':
|
||||
for y in constraints:
|
||||
if(y[0] == 'datetime'):
|
||||
system_action[(domain, 'set_appointment_date')].append([y[0], y[1]])
|
||||
|
||||
#################################################################################################
|
||||
# Reguła 2
|
||||
|
||||
if domain == 'request_information':
|
||||
if intent == 'request_information/available_dates':
|
||||
for x in constraints:
|
||||
if(x[0] == 'doctor'):
|
||||
system_action[(domain, 'date_info')].append([x[0], x[1]])
|
||||
for y in constraints:
|
||||
if(y[0] == 'datetime'):
|
||||
system_action[(domain, 'date_info')].append([y[0], y[1]])
|
||||
elif intent == 'request_information/doctors':
|
||||
system_action[(domain, 'Doctors_list')] = []
|
||||
elif intent == 'request_information/location':
|
||||
system_action[(domain, 'Location')] = []
|
||||
elif intent == 'request_information/cost':
|
||||
system_action[(domain, 'Cost')] = []
|
||||
elif intent == 'request_information/opening_hours':
|
||||
system_action[(domain, 'Opening_Hours')] = []
|
||||
elif len(constraints) == 0:
|
||||
system_action[(domain, 'NoOffer')] = []
|
||||
|
||||
#################################################################################################
|
||||
# Reguła 3
|
||||
if domain == 'end_conversation':
|
||||
system_action[(domain, 'End_Conversation')] = []
|
||||
|
||||
#################################################################################################
|
||||
# Reguła 4
|
||||
if domain == 'greeting':
|
||||
system_action[(domain, 'Greeting')] = []
|
||||
|
||||
#################################################################################################
|
||||
# Reguła 5
|
||||
if domain == 'prescription':
|
||||
if intent == 'prescription/request':
|
||||
for x in constraints:
|
||||
if(x[0] == 'prescription/type'):
|
||||
system_action[(domain, 'create_prescription')].append([x[0], x[1]])
|
||||
for y in constraints:
|
||||
if(y[0] == 'prescription/medicine'):
|
||||
system_action[(domain, 'create_prescription')].append([y[0], y[1]])
|
||||
elif intent == 'prescription/collect':
|
||||
for x in constraints:
|
||||
if(x[0] == 'prescription/type'):
|
||||
system_action[(domain, 'collect_prescription')].append([x[0], x[1]])
|
||||
elif intent == 'prescription/type':
|
||||
for x in constraints:
|
||||
if(x[0] == 'prescription/type_info'):
|
||||
system_action[(domain, 'prescription type')].append([x[0], x[1]])
|
||||
if len(constraints) == 0:
|
||||
system_action[(domain, 'NoOffer')] = []
|
||||
|
||||
print(system_action)
|
||||
|
||||
## Brakuje: Rejestracja, Login, Hasło, affirm, deny
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# if len(constraints) == 0:
|
||||
# system_action[(domain, 'NoOffer')] = []
|
||||
# else:
|
||||
# for slot in user_action[user_act]:
|
||||
# kb_slot_name = REF_SYS_DA[domain].get(slot[0], slot[0])
|
||||
|
||||
# if kb_slot_name in self.results[0]:
|
||||
# system_action[(domain, 'Inform')].append([slot[0], self.results[0].get(kb_slot_name, 'unknown')])
|
||||
|
||||
# # Reguła 2
|
||||
# elif intent == 'Inform':
|
||||
# if len(self.results) == 0:
|
||||
# system_action[(domain, 'NoOffer')] = []
|
||||
# else:
|
||||
# system_action[(domain, 'Inform')].append(['Choice', str(len(self.results))])
|
||||
# choice = self.results[0]
|
||||
|
||||
# if domain in ["Hotel", "Attraction", "Police", "Restaurant"]:
|
||||
# system_action[(domain, 'Recommend')].append(['Name', choice['name']])
|
@ -27,10 +27,20 @@ class Rules_DST(): #Dialogue State Tracker
|
||||
domain_dic = self.state['belief_state'][domain]
|
||||
if slot in domain_dic:
|
||||
self.state['belief_state'][domain][slot] = value
|
||||
else:
|
||||
print(slot)
|
||||
print(domain)
|
||||
|
||||
if 'prescription' in intent:
|
||||
if (slot == 'prescription'):
|
||||
continue
|
||||
|
||||
if(domain in slot):
|
||||
slot.replace(domain + "/", '')
|
||||
|
||||
domain_dic = self.state['belief_state'][domain]
|
||||
if slot in domain_dic:
|
||||
self.state['belief_state'][domain][slot] = value
|
||||
|
||||
elif intent == 'end_conversation':
|
||||
self.state = json.load(open('default_state.json'))
|
||||
|
||||
print(self.state)
|
||||
return self.state
|
||||
|
@ -69,7 +69,7 @@ slot_trainer = ModelTrainer(slot_tagger, slot_corpus)
|
||||
slot_trainer.train('slot-model',
|
||||
learning_rate=0.1,
|
||||
mini_batch_size=32,
|
||||
max_epochs=100,
|
||||
max_epochs=30,
|
||||
train_with_dev=False)
|
||||
|
||||
|
||||
@ -77,5 +77,5 @@ frame_trainer = ModelTrainer(frame_tagger, frame_corpus)
|
||||
frame_trainer.train('frame-model',
|
||||
learning_rate=0.1,
|
||||
mini_batch_size=32,
|
||||
max_epochs=100,
|
||||
max_epochs=30,
|
||||
train_with_dev=False)
|
44
Janet.conllu
44
Janet.conllu
@ -1,22 +1,22 @@
|
||||
# text: Chciałem prosić o wypisanie kolejnej recepty na lek X
|
||||
# intent: appointment/request_prescription
|
||||
# intent: prescription/request
|
||||
# slots:
|
||||
1 chciałem appointment/request_prescription NoLabel
|
||||
2 prosić appointment/request_prescription NoLabel
|
||||
3 o appointment/request_prescription NoLabel
|
||||
4 wypisanie appointment/request_prescription NoLabel
|
||||
5 kolejnej appointment/request_prescription NoLabel
|
||||
6 recepty appointment/request_prescription B-prescription
|
||||
7 na appointment/request_prescription NoLabel
|
||||
8 lek appointment/request_prescription B-prescription/type
|
||||
9 x appointment/request_prescription I-prescription/type
|
||||
1 chciałem prescription/request NoLabel
|
||||
2 prosić prescription/request NoLabel
|
||||
3 o prescription/request NoLabel
|
||||
4 wypisanie prescription/request NoLabel
|
||||
5 kolejnej prescription/request NoLabel
|
||||
6 recepty prescription/request B-prescription/type
|
||||
7 na prescription/request NoLabel
|
||||
8 lek prescription/request B-prescription/medicine
|
||||
9 x prescription/request I-prescription/medicine
|
||||
|
||||
# text: proszę o E-receptę
|
||||
# intent: appointment/request_prescription
|
||||
# intent: prescription/request
|
||||
# slots:
|
||||
1 proszę appointment/request_prescription NoLabel
|
||||
2 o appointment/request_prescription NoLabel
|
||||
3 ereceptę appointment/request_prescription B-prescription
|
||||
1 proszę prescription/request NoLabel
|
||||
2 o prescription/request NoLabel
|
||||
3 ereceptę prescription/request B-prescription/type
|
||||
|
||||
# text: dziękuję
|
||||
# intent: end_conversation
|
||||
@ -97,7 +97,7 @@
|
||||
# slots:
|
||||
1 jakie request_information/available_dates NoLabel
|
||||
2 są request_information/available_dates NoLabel
|
||||
3 dostępne rrequest_information/available_datesquest_information/available_dates NoLabel
|
||||
3 dostępne request_information/available_dates NoLabel
|
||||
4 terminy request_information/available_dates NoLabel
|
||||
5 wizyt request_information/available_dates B-appointment
|
||||
6 na request_information/available_dates NoLabel
|
||||
@ -117,8 +117,8 @@
|
||||
6 na appointment/create_appointment NoLabel
|
||||
7 12:00 appointment/create_appointment B-datetime
|
||||
8 dziękuję appointment/create_appointment B-end_conversation
|
||||
9 to appointment/create_appointment NoLabel I-end_conversation
|
||||
10 wszystko appointment/create_appointment NoLabel I-end_conversation
|
||||
9 to appointment/create_appointment I-end_conversation
|
||||
10 wszystko appointment/create_appointment I-end_conversation
|
||||
|
||||
# text: Witam Chciałbym zarezerwować wizytę u lekarza
|
||||
# intent: appointment/create_appointment
|
||||
@ -348,14 +348,14 @@
|
||||
# slots:
|
||||
1 chciałabym prescription/collect NoLabel
|
||||
2 odebrać prescription/collect NoLabel
|
||||
3 receptę prescription/collect B-prescription
|
||||
3 receptę prescription/collect B-prescription/type
|
||||
|
||||
# text: Chciałabym zamówić receptę
|
||||
# intent: prescription/request
|
||||
# slots:
|
||||
1 chciałabym prescription/request NoLabel
|
||||
2 zamówić prescription/request NoLabel
|
||||
3 receptę prescription/request B-prescription
|
||||
3 receptę prescription/request B-prescription/type
|
||||
|
||||
# text: Tak
|
||||
# intent: affirm
|
||||
@ -735,12 +735,12 @@
|
||||
# slots:
|
||||
1 chcialbym prescription/collect NoLabel
|
||||
2 odebrac prescription/collect NoLabel
|
||||
3 receptę prescription/collect B-prescription
|
||||
3 receptę prescription/collect B-prescription/type
|
||||
|
||||
# text: e-receptę
|
||||
# intent: prescription/type
|
||||
# intent: prescription/type_info
|
||||
# slots:
|
||||
1 e-receptę prescription/type B-prescription
|
||||
1 e-receptę prescription/type_info B-prescription/type
|
||||
|
||||
# text: Tak
|
||||
# intent: affirm
|
||||
|
@ -15,6 +15,10 @@
|
||||
"secondname": "",
|
||||
"username": "",
|
||||
"password": ""
|
||||
},
|
||||
"prescription": {
|
||||
"prescription/type": "",
|
||||
"prescription/medicine": ""
|
||||
}
|
||||
},
|
||||
"request_state": {},
|
||||
|
Loading…
Reference in New Issue
Block a user