编辑距离WER/CER计算的一种python实现

WER(word error rate)经常作为语音识别任务的性能评测指标,WER的计算公式,直接从网上粘贴过来了。
在这里插入图片描述
一些语音识别框架(如:Kaldi、ESPNet等)中,都会包含wer的计算方法,其中ESPNet的结果展示如下:
在这里插入图片描述
我们希望用python实现上面的效果,首先来看看wer是怎么计算的。
首先,随便写个例子,ref(reference)表示标注文本序列,hyp(hypothesis)表示预测文本序列,则可以计算 cer/wer = 3,其中一次替换错误(S),一次删除错误(D),一次插入错误(I)。
在这里插入图片描述
参考资料:https://martin-thoma.com/word-error-rate-calculation/
我们列出WER的计算公式如下,看似很绕,我们用图来画一下:
在这里插入图片描述
首先,横轴为ref(标注序列),我们列出来,最后加一个<b>作为占位,纵轴为hyp(预测序列),也列出来,同样最后加上<b>占位。
在这里插入图片描述
然后,中间的每个方格代表一个cost,什么是cost呢,就是到目前为止两个序列错了多少。如ref=b,hyp=b时,错误为1,因为此时的子序列 sub_ref=ab,sub_hyp=bb,所以只有一个替换错误(S)。
而前面公式中列出来的,就是计算递归计算cost的方法。也就是说当前位置ij的cost只与相邻的前面三个位置有关(上图中紫色部分),而且是三个紫色方块的最小值+1,翻译一下:
(1)对于位置 i、j,如果 hyp(i-1) == ref(j-i),则 cost(i,j)=cost(i-1,j-1);
(2)如果 hyp(i-1) != ref(j-i) ,也就是图中ij的位置,那么 cost(i,j) 就是三个紫色方块的最小值+1
而三个紫色方块代表的物理意义如下:(左上表示替换错误S,右上表示插入错误I,左下表示删除错误D)
在这里插入图片描述
一直迭代下去,直到所有cost都被计算出来之后,整个cost矩阵右下角的为的值就是你要的wer了(也就是<b>和<b>的位置),上上图中wer=3。

得到了wer,我们还想直到 I、D、S 到底各占多少,对齐的文本到底是什么样子的,这是我们要从右下角回溯。对于右下角的“3”,它的前三个值最小为3,说明没有发生错误。接下来(f,f)位置,前三个值为2、2、3,最小值为2,说明发生了错误,这时按照 substitution > insert > delete 的优先级,选择上方的方格,并记录一次插入错误。以此类推,直到遍历到左上角为止。如下图所示,我们就得到了所有的错误类型。
在这里插入图片描述
当然,优先级不同,回溯方法也不一样,如果优先级为:insert > delete > substitution,则结果如下:
在这里插入图片描述

下面看一个特殊情况,即句子开头有插入或者删除错误。
在这里插入图片描述
这时如果我们回溯整个矩阵发现,hyp先结束了,而ref还没有结束,为了得到所有的操作,我们必须要遍历的左上角才行,所以,强行从遍历结束的位置移动到左上角。那么,如果是hyp先结束,则所有移动都是删除错误(D),如果是ref先结束,那么所有错误都是插入错误(I)。
在这里插入图片描述
python的实现如下,供参考:

import numpy as np


def levenshtein_distance(hypothesis: list, reference: list):
    """编辑距离
    计算两个序列的levenshtein distance,可用于计算 WER/CER
    参考资料:
        https://www.cuelogic.com/blog/the-levenshtein-algorithm
        https://martin-thoma.com/word-error-rate-calculation/

    C: correct
    W: wrong
    I: insert
    D: delete
    S: substitution

    :param hypothesis: 预测序列
    :param reference: 真实序列
    :return: 1: 错误操作,所需要的 S,D,I 操作的次数;
             2: ref 与 hyp 的所有对齐下标
             3: 返回 C、W、S、D、I 各自的数量
    """
    len_hyp = len(hypothesis)
    len_ref = len(reference)
    cost_matrix = np.zeros((len_hyp +<
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值