in is21_deep_bias/score.py [0:0]
def get_result(self, refs, hyps):
res = AlignmentResult(refs=deque(), hyps=deque(), codes=deque(), score=None)
num_rows, num_cols = len(self.scores_), len(self.scores_[0])
res.score = self.scores_[num_rows - 1][num_cols - 1]
curr_offset = coordinate_to_offset(num_rows - 1, num_cols - 1, num_cols)
while curr_offset != 0:
curr_row = offset_to_row(curr_offset, num_cols)
curr_col = offset_to_col(curr_offset, num_cols)
prev_offset = self.backtraces_[curr_row][curr_col]
prev_row = offset_to_row(prev_offset, num_cols)
prev_col = offset_to_col(prev_offset, num_cols)
res.refs.appendleft(curr_row - 1)
res.hyps.appendleft(curr_col - 1)
if curr_row - 1 == prev_row and curr_col == prev_col:
ref_str = refs[res.refs[0]]
deleted_word = ref_str
if deleted_word not in self.deleted_words_:
self.deleted_words_[deleted_word] = 1
else:
self.deleted_words_[deleted_word] += 1
res.codes.appendleft(Code.deletion)
elif curr_row == prev_row and curr_col - 1 == prev_col:
hyp_str = hyps[res.hyps[0]]
inserted_word = hyp_str
if inserted_word not in self.inserted_words_:
self.inserted_words_[inserted_word] = 1
else:
self.inserted_words_[inserted_word] += 1
res.codes.appendleft(Code.insertion)
else:
# assert(curr_row - 1 == prev_row and curr_col - 1 == prev_col)
ref_str = refs[res.refs[0]]
hyp_str = hyps[res.hyps[0]]
if ref_str == hyp_str:
res.codes.appendleft(Code.match)
else:
res.codes.appendleft(Code.substitution)
confusion_pair = "%s -> %s" % (ref_str, hyp_str)
if confusion_pair not in self.confusion_pairs_:
self.confusion_pairs_[confusion_pair] = 1
else:
self.confusion_pairs_[confusion_pair] += 1
curr_offset = prev_offset
return res