Added functional state_monitor
This commit is contained in:
parent
a34bb9d5f5
commit
60c68015f7
@ -1,20 +1,64 @@
|
|||||||
dialogue_state = []
|
dialogue_state = {
|
||||||
iterator = 1
|
# current context should be set to an act that is currently taking place
|
||||||
|
'current_context' : None,
|
||||||
|
# topics will be an array of dicts structured similar to this
|
||||||
|
# {'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]}
|
||||||
|
'topics': [],
|
||||||
|
'counter': 0
|
||||||
|
}
|
||||||
|
|
||||||
#todo uporzadkować
|
|
||||||
def monitor_stanu_dialogowego(frame, questions):
|
def monitor_stanu_dialogowego(frame):
|
||||||
global iterator
|
global dialogue_state
|
||||||
# Some frames can reset the dialogue state, like saying hello.
|
# Some frames can reset the dialogue state, like saying hello.
|
||||||
reset_state_if_needed(frame)
|
|
||||||
singleState = {
|
incr_counter(dialogue_state)
|
||||||
"iteration": iterator,
|
|
||||||
"frame": frame,
|
# Discarding acts that were not identified properly, but lets keep increasing the counter
|
||||||
"questions": questions
|
if frame['act'] == 'null':
|
||||||
}
|
|
||||||
dialogue_state.append(singleState)
|
|
||||||
iterator += 1
|
|
||||||
return dialogue_state
|
return dialogue_state
|
||||||
|
|
||||||
|
reset_state_if_needed(frame)
|
||||||
|
|
||||||
|
dialogue_state['current_context'] = frame['act']
|
||||||
|
append_or_merge_frame(frame, dialogue_state)
|
||||||
|
|
||||||
|
return dialogue_state
|
||||||
|
|
||||||
|
|
||||||
|
def append_or_merge_frame(frame, dialogue_state):
|
||||||
|
act = frame['act']
|
||||||
|
|
||||||
|
act_from_state = list(filter(lambda x: x['act'] == act, dialogue_state['topics']))
|
||||||
|
if len(act_from_state) > 0:
|
||||||
|
append_or_merge_slots(frame['slots'], act_from_state[0]['slots'])
|
||||||
|
else:
|
||||||
|
dialogue_state['topics'].append(frame)
|
||||||
|
|
||||||
|
|
||||||
|
def append_or_merge_slots(frame_slots, state_slots):
|
||||||
|
"""
|
||||||
|
This function expects both parameters to be an array
|
||||||
|
of tuples (slot_name, slot_value), and will merge
|
||||||
|
frame slots into state_slots (on unique slot names).
|
||||||
|
"""
|
||||||
|
for frame_slot in frame_slots:
|
||||||
|
merged = False
|
||||||
|
for i in range(len(state_slots)):
|
||||||
|
if state_slots[i][0] == frame_slot[0]:
|
||||||
|
merged = True
|
||||||
|
# Do not merge empty incomming slots
|
||||||
|
if frame_slot[1] is not None and not len(frame_slot[1]) == 0:
|
||||||
|
state_slots[i] = frame_slot
|
||||||
|
break
|
||||||
|
|
||||||
|
if not merged:
|
||||||
|
state_slots.append(frame_slot)
|
||||||
|
|
||||||
|
|
||||||
|
def incr_counter(dialogue_state):
|
||||||
|
current_val = dialogue_state['counter']
|
||||||
|
dialogue_state['counter'] = current_val + 1
|
||||||
|
|
||||||
def reset_state_if_needed(frame):
|
def reset_state_if_needed(frame):
|
||||||
global iterator
|
global iterator
|
||||||
|
@ -13,9 +13,9 @@ def main():
|
|||||||
frame = analizator_jezyka_naturalnego(text)
|
frame = analizator_jezyka_naturalnego(text)
|
||||||
#{'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]}
|
#{'act': 'notifications', 'slots': [('time_when', None), ('liczba', ''), ('timeunit', None)]}
|
||||||
|
|
||||||
questions = taktyka_dialogu(frame) # todo dodac stan
|
state = monitor_stanu_dialogowego(frame)
|
||||||
|
|
||||||
state = monitor_stanu_dialogowego(frame, questions)
|
questions = taktyka_dialogu(frame) # todo dodac stan
|
||||||
|
|
||||||
generator_jezyka_nautalnego(frame, questions, state)
|
generator_jezyka_nautalnego(frame, questions, state)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user