def perform_eval(eid, data): global word_classifiers global relation_word_classifiers global results_outfile target_dist = Distribution(data['objects']) landmark_dist = Distribution(data['objects']) target = data['target'] increment_data = [] relation = None relation_is_negated = False inc = 1 prev_rank = len(data['objects']) for w,tags in [(w['word'],w['tags']) for w in data['speech']]: utt = {} word = None c_rank = None relation_dist = None prepare_word(utt, w, tags) objects = data['objects'] if 't' in utt: word = utt['t'][0] target_dist.update(logreg.classify(word, word_classifiers, objects)) if 'l' in utt: word = utt['l'][0] landmark_dist.update(logreg.classify(word, word_classifiers, objects)) if 'r' in utt: word = utt['r'][0] if relation is not None: relation += '_' + word else: relation = word if 'r-' in utt: word = utt['r-'][0] if relation is not None: relation += '_' + word else: relation = word relation_is_negated = True if relation is not None: # indent this with above for loop to make it incremental tdist = target_dist.copy() ldist = landmark_dist.copy() relation_dist = apply_relation(tdist, ldist, relation, relation_is_negated, objects) if relation_dist is not None: return relation_dist.rank(target) else: target_dist.normalise() return target_dist.rank(target)