Source code for evalmate.alignment.utils

import functools


[docs]@functools.total_ordering class LabelPair(object): """ Class to hold a pair of labels. Attributes: ref (Label): Reference label. hyp (Label): Hypothesis label. """ def __init__(self, ref, hyp): self.ref = ref self.hyp = hyp def __lt__(self, other): label_a = self.ref label_b = other.ref if label_a is None: label_a = self.hyp if label_b is None: label_b = other.hyp if label_a is None: return True if label_b is None: return False return label_a < label_b def __eq__(self, other): if self.ref is None: return other.ref is None if self.hyp is None: return other.hyp is None if other.ref is None: return self.ref is None if other.hyp is None: return self.hyp is None return self.ref == other.ref and self.hyp == other.hyp def __repr__(self) -> str: return 'LabelPair({}, {})'.format(self.ref, self.hyp)
[docs] def padded_ref_value(self): """ Return the reference value as string padded to the longer value of ref and hyp. """ length = self.max_length() value = '-' if self.ref is None else self.ref.value return value.rjust(length)
[docs] def padded_hyp_value(self): """ Return the hypothesis value as string padded to the longer value of ref and hyp. """ length = self.max_length() value = '-' if self.hyp is None else self.hyp.value return value.rjust(length)
[docs] def max_length(self): """ Return the length of the longer value from ref and hyp. """ length = 0 if self.ref is not None: length = max(length, len(self.ref.value)) else: length = max(length, len('None')) if self.hyp is not None: length = max(length, len(self.hyp.value)) else: length = max(length, len('None')) return length
[docs]class Segment: """ A class representing a segment within an alignment. Arguments: start (float): The start time in seconds. end (float): The end time in seconds. Attributes: ref (Label, list): List of or single reference label in the segment. hyp (Label, list): List of or single hypothesis label in the segment. """ def __init__(self, start, end, ref=None, hyp=None): self.start = start self.end = end self.ref = ref self.hyp = hyp @property def duration(self): return self.end - self.start def __lt__(self, other): if self.start != other.start: return self.start < other.start if self.end != other.end: return self.end < other.end if self.ref != other.ref: if self.ref is None: return True elif other.ref is None: return False else: return self.ref < other.ref if self.hyp != other.hyp: if self.hyp is None: return True elif other.hyp is None: return False else: return self.hyp < other.hyp return False def __eq__(self, other): return self.start == other.start and self.end == other.end and self.ref == other.ref and self.hyp == other.hyp def __repr__(self): return '{} - {} REF: {} HYP: {}'.format(self.start, self.end, self.ref, self.hyp)