趋近智
词错率(WER)的计算公式虽然简单明了,但确定替换错误数()、删除错误数()和插入错误数()的过程需要一种精确的方法。你不能简单地计算单词差异,而是必须找到将模型输出(假设文本)转换为正确文本(参考文本)所需的最少编辑次数。这是一个典型的序列对齐问题,可以通过计算莱文斯坦距离的算法来解决。
莱文斯坦距离衡量两个序列之间的差异。在我们的例子中,这些序列是参考文本和假设文本中的单词。该距离定义为将一个序列转换为另一个序列所需的最少单词编辑次数。这些编辑就是我们计算词错率所需的三种错误类型:
一种算法(通常基于动态规划)能找到两个词序列之间的最佳对齐,从而使这三种错误的总数达到最低。让我们通过一个例子来阐明这一点。
假设我们的参考文本和假设文本如下:
the quick brown foxthe fast brown fox jumped为获得 、 和 的值,我们对它们进行对齐,以使编辑距离最小化:
对齐过程将假设文本中的词语映射到参考文本,以识别错误。在此例中,“quick”被“fast”替换,“jumped”被插入。
根据这种对齐方式,我们可以计算错误数:
quick转录为fast)。jumped)。参考文本中的词语总数()为4。现在我们可以计算词错率:
这表明词错率为50%。
需注意,词错率可能超过1.0,即100%。当错误总数大于参考文本中的词数时,就会发生这种情况。如果模型产生的输出明显长于参考文本,导致大量插入,就可能出现此情形。例如,如果参考文本是start recording(),而假设文本是start recording start recording start recording,则词错率为(0S + 0D + 4I) / 2 = 2.0,即200%。
jiwer在Python中计算词错率手动实现对齐算法没有必要,因为有成熟的库可以为您处理。jiwer库是用于此目的的一种常用且高效的工具。
首先,您需要安装它:
pip install jiwer
接着,您可以使用其compute_measures函数来获取错误的全面细分以及最终的词错率分数。该函数接受参考文本和假设文本字符串作为输入,并返回一个包含所有相关指标的字典。
import jiwer
# 真实文本
reference = "the quick brown fox"
# ASR模型的输出
hypothesis = "the fast brown fox jumped"
# 计算所有指标
error_report = jiwer.compute_measures(reference, hypothesis)
# 提取各项组成
wer = error_report['wer']
substitutions = error_report['substitutions']
deletions = error_report['deletions']
insertions = error_report['insertions']
hits = error_report['hits'] # 正确转录的词语
print(f"Reference: '{reference}'")
print(f"Hypothesis: '{hypothesis}'\n")
print(f"Word Error Rate (WER): {wer:.2%}")
print(f"Substitutions: {substitutions}")
print(f"Deletions: {deletions}")
print(f"Insertions: {insertions}")
print(f"Correct Words (Hits): {hits}")
运行此代码将产生以下输出,与我们的手动计算结果相符:
参考文本: 'the quick brown fox'
假设文本: 'the fast brown fox jumped'
词错率 (WER): 50.00%
替换: 1
删除: 0
插入: 1
正确词语 (命中): 3
使用jiwer这样的库可确保您的计算结果一致、准确,并遵循标准对齐算法。在评估模型时,通常会在整个测试数据集上计算平均词错率,而不仅仅是单个句子,以获得系统整体性能的可靠衡量标准。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造