in main.py [0:0]
def run_pipeline(entity_linking_method, entity_linking_threshold=None, is_BIO=False):
conversations = dict()
dialog_states = 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: {}}
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)
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[conver_id][intent].update(entity_values)
latest_intents[conver_id] = main_intents
else:
for intent in latest_intents[conver_id]:
dialog_states[conver_id][intent].update(entity_values)
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,
'dialog_states': copy.deepcopy(dialog_states[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'].items():
if intent is None:
continue
related_constraints = constraints_for_intent[intent]
for constraint in related_constraints:
is_applicable, violations = find_violations(constraint, state, distinct_slot_values)
if is_applicable and len(violations) > 0: # 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)
entity_linking_results = get_linking_results_of_method(test_data, conversations, distinct_slot_values, entity_linking_method, threshold=entity_linking_threshold)
pipeline_results = evaluation(test_data, conversations)
pipeline_results_no_intent = evaluation_no_intent(test_data, conversations)
return conversations, entity_linking_results, pipeline_results, pipeline_results_no_intent