in main.py [0:0]
def run_pipeline_probabilistic(entity_linking_method, entity_linking_threshold = None, softmaxtemp = 0.1):
conversations = dict()
dialog_states = dict()
dialog_states_slots = dict()
dialog_states_probs = dict()
latest_intents = dict()
for ids, output in zip(test_ids, nlu_result):
if not is_BIO:
conver_id, turn_id, sentence_id = ids[0], ids[1], ids[2]
else:
conver_id, turn_id = ids[0], ids[1]
if conver_id not in conversations:
conversations[conver_id] = []
dialog_states[conver_id] = {None:{}}
dialog_states_slots[conver_id] = {None:{}}
dialog_states_probs[conver_id] = {None:{}}
latest_intents[conver_id] = [None]
predicted_intents, texts = output.split('->')
intents = predicted_intents[1:-2].split('<div>')
tokens = texts.strip().split(' ')
word_list = []
label_list = []
for t in tokens:
if t.startswith('[') and t.endswith(']') and ':' in t:
colon_idx = t.rindex(':')
word_list.append(t[1:colon_idx])
the_label = t[colon_idx+1:-1]
# assert the_label in bot_definition['slots']
label_list.append(the_label)
else:
word_list.append(t)
label_list.append('O')
if is_BIO:
slot_values = get_slot_values_BIO(word_list, label_list)
else:
slot_values = get_slot_values(word_list, label_list)
entity_values = entity_linking_list(slot_values, distinct_slot_values, method = entity_linking_method, threshold = entity_linking_threshold)
entity_probs = entity_linking_list_probs(slot_values, distinct_slot_values, softmaxtemp, method = entity_linking_method, threshold = entity_linking_threshold)
main_intents = [intent for intent in intents if intent in bot_definition['main_intents']]
# Update dialog states
if main_intents != []:
for intent in main_intents:
if intent not in dialog_states[conver_id]:
dialog_states[conver_id][intent] = dict()
dialog_states_slots[conver_id][intent] = dict()
dialog_states_probs[conver_id][intent] = dict()
dialog_states[conver_id][intent].update(entity_values)
dialog_states_slots[conver_id][intent].update(slot_values)
dialog_states_probs[conver_id][intent].update(entity_probs)
latest_intents[conver_id] = main_intents
else:
for intent in latest_intents[conver_id]:
dialog_states[conver_id][intent].update(entity_values)
dialog_states_slots[conver_id][intent].update(slot_values)
dialog_states_probs[conver_id][intent].update(entity_probs)
sentence_object = {
'conversationId': conver_id,
'turnNumber': turn_id,
'utterance': ' '.join(word_list),
'intents': predicted_intents[1:-2],
'main_intents': main_intents,
'slot_values': slot_values,
'entity_values': entity_values,
'entity_probs': entity_probs,
'dialog_states': copy.deepcopy(dialog_states[conver_id]),
'dialog_states_slots': copy.deepcopy(dialog_states_slots[conver_id]),
'dialog_states_probs': copy.deepcopy(dialog_states_probs[conver_id])
}
if not is_BIO:
sentence_object['sentenceNumber'] = sentence_id
sentence_object['utteranceId'] = f'<CONV>{conver_id}<TURN>{turn_id}<SENT>{sentence_id}'
else:
sentence_object['utteranceId'] = f'<CONV>{conver_id}<TURN>{turn_id}'
# Violation detection
violations_all = set()
violation_details = []
for intent, state in sentence_object['dialog_states_probs'].items():
if intent is None:
continue
related_constraints = constraints_for_intent[intent]
for constraint in related_constraints:
is_applicable, violations = find_violations_probs(constraint, state, distinct_slot_values)
if is_applicable and any(v >= 0.5 for v in violations): # No violations
violations_all.add((intent,constraint['name']))
violation_details.append({'intent': intent, 'constraint': constraint['name'], 'violations': violations})
sentence_object['violations'] = list(violations_all)
sentence_object['violation_details'] = violation_details
conversations[conver_id].append(sentence_object)
pipeline_results = evaluation(test_data, conversations)
pipeline_results_no_intent = evaluation_no_intent(test_data, conversations)
return conversations, None, pipeline_results, pipeline_results_no_intent