def _get_wer()

in vizseq/scorers/_wer.py [0:0]


def _get_wer(r: List[str], h: List[str]) -> WerScore:
    len_r, len_h = len(r), len(h)
    edits = [[0 for _ in range(len_h + 1)] for _ in range(len_r + 1)]
    pt = [
        [OperationType.correct for _ in range(len_h + 1)]
        for _ in range(len_r + 1)
    ]

    for i in range(1, len_r + 1):
        edits[i][0] = i
        pt[i][0] = OperationType.deletion
    for j in range(1, len_h + 1):
        edits[0][j] = j
        pt[0][j] = OperationType.insertion
    for i in range(1, len_r + 1):
        for j in range(1, len_h + 1):
            if r[i - 1] == h[j - 1]:
                edits[i][j] = edits[i - 1][j - 1]
                pt[i][j] = OperationType.correct
            else:
                edits[i][j] = edits[i - 1][j - 1] + 1
                pt[i][j] = OperationType.substitution

            if edits[i][j - 1] + 1 < edits[i][j]:
                edits[i][j] = edits[i][j - 1] + 1
                pt[i][j] = OperationType.insertion

            if edits[i - 1][j] + 1 < edits[i][j]:
                edits[i][j] = edits[i - 1][j] + 1
                pt[i][j] = OperationType.deletion

    i, j = len_r, len_h
    n_sub, n_del, n_ins = 0, 0, 0
    while i > 0 or j > 0:
        if pt[i][j] == OperationType.correct:
            i -= 1
            j -= 1
        elif pt[i][j] == OperationType.substitution:
            n_sub += 1
            i -= 1
            j -= 1
        elif pt[i][j] == OperationType.insertion:
            n_ins += 1
            j -= 1
        elif pt[i][j] == OperationType.deletion:
            n_del += 1
            i -= 1

    return WerScore(
        wer=100. * (n_sub + n_del + n_ins) / len_r, len_r=len_r, deletion=n_del,
        substitution=n_sub, insertion=n_ins
    )