speechbrain.utils.edit_distance 模块

编辑距离和WER计算。

Authors
  • 阿库·柔赫 2020

  • Salima Mdhaffar 2021

摘要

函数:

accumulatable_wer_stats

计算批次的单词错误率及相关计数。

alignment

从编辑操作表中获取编辑距离对齐。

count_ops

计算编辑操作表中最短编辑路径中的编辑操作数量。

op_table

a和b之间的编辑操作表。

top_wer_spks

找到单词错误率最高的K个说话者。

top_wer_utts

找到具有最高单词错误率的k个话语。

wer_details_by_speaker

按说话者分组计算单词错误率和其他显著信息。

wer_details_by_utterance

计算每个单独话语的财富WER信息。

wer_details_for_batch

方便的批处理接口,用于 wer_details_by_utterance

wer_summary

从details_by_utterance的输出中计算摘要统计信息

参考

speechbrain.utils.edit_distance.accumulatable_wer_stats(refs, hyps, stats={}, equality_comparator: ~typing.Callable[[str, str], bool] = <function _str_equals>)[source]

计算批处理的单词错误率及相关计数。

也可以通过将输出传递回函数以用于下一批次的调用来累积多个批次的计数。

Parameters:
  • refs (可迭代对象) – 参考序列的批次。

  • hyps (iterable) – 假设序列的批次。

  • stats (collections.Counter) – 运行统计信息。 将此函数的输出作为此参数传递回去以累积计数。最干净的方式可能是自己初始化统计信息;然后应该使用一个空的 collections.Counter()。

  • equality_comparator (Callable[[str, str], bool]) – 用于检查两个单词是否相等的函数。

Returns:

更新后的运行统计信息,包含以下键:

  • ”WER” - 单词错误率

  • ”insertions” - 插入次数

  • ”deletions” - 删除次数

  • ”substitutions” - 替换次数

  • ”num_ref_tokens” - 参考标记的数量

Return type:

collections.Counter

Example

>>> import collections
>>> batches = [[[[1,2,3],[4,5,6]], [[1,2,4],[5,6]]],
...             [[[7,8], [9]],     [[7,8],  [10]]]]
>>> stats = collections.Counter()
>>> for batch in batches:
...     refs, hyps = batch
...     stats = accumulatable_wer_stats(refs, hyps, stats)
>>> print("%WER {WER:.2f}, {num_ref_tokens} ref tokens".format(**stats))
%WER 33.33, 9 ref tokens
speechbrain.utils.edit_distance.op_table(a, b, equality_comparator: ~typing.Callable[[str, str], bool] = <function _str_equals>)[source]

a和b之间的编辑操作表。

解决编辑操作表的问题,主要用于计算单词错误率。该表的大小为[|a|+1, |b|+1],表中的每个点(i, j)都有一个编辑操作。可以确定地跟随编辑操作向后找到从a[:i-1] b[:j-1]的最短编辑路径。零索引(i=0j=0)对应于空序列。

该算法本身是众所周知的,参见

Levenshtein distance

请注意,在某些情况下,存在多个有效的编辑操作路径,这些路径都会导致相同的编辑距离最小值。

Parameters:
  • a (iterable) – 解决编辑操作的序列。

  • b (iterable) – 解决编辑操作的序列。

  • equality_comparator (Callable[[str, str], bool]) – 用于检查两个单词是否相等的函数。

Returns:

列表的列表,矩阵,编辑操作表。

Return type:

list

Example

>>> ref = [1,2,3]
>>> hyp = [1,2,4]
>>> for row in op_table(ref, hyp):
...     print(row)
['=', 'I', 'I', 'I']
['D', '=', 'I', 'I']
['D', 'D', '=', 'I']
['D', 'D', 'D', 'S']
speechbrain.utils.edit_distance.alignment(table)[source]

从编辑操作表中获取编辑距离对齐。

回退一个编辑操作表,该表通过调用table(a, b)生成, 并收集a到b的编辑距离对齐。对齐显示a中的哪个标记对应于b中的哪个标记。请注意,对齐是单调的,一对一或零对一。

Parameters:

表格 (列表) – 来自 op_table(a, b) 的编辑操作表格。

Returns:

模式: [(str , int-or-None , int-or-None ),] 编辑操作的列表,以及对应的a和b的索引。 请参阅EDIT_SYMBOLS字典以了解编辑操作。 i索引a,j索引b,索引可以为None,这意味着不对齐任何内容。

Return type:

list

Example

>>> # table for a=[1,2,3], b=[1,2,4]:
>>> table = [['I', 'I', 'I', 'I'],
...          ['D', '=', 'I', 'I'],
...          ['D', 'D', '=', 'I'],
...          ['D', 'D', 'D', 'S']]
>>> print(alignment(table))
[('=', 0, 0), ('=', 1, 1), ('S', 2, 2)]
speechbrain.utils.edit_distance.count_ops(table)[source]

计算编辑操作表中最短编辑路径中的编辑操作次数。

回退由table(a, b)生成的编辑操作表,并计算最短编辑路径中的插入、删除和替换次数。这些信息通常用于语音识别中,以分别报告不同类型的错误数量。

Parameters:

表格 (列表) – 从 op_table(a, b) 编辑操作表格。

Returns:

编辑操作的计数,包含以下键:

  • “insertions”

  • “deletions”

  • “substitutions”

注意:并非所有键都会显式出现在输出中, 但对于缺失的键,计数器将返回0。

Return type:

collections.Counter

Example

>>> table = [['I', 'I', 'I', 'I'],
...          ['D', '=', 'I', 'I'],
...          ['D', 'D', '=', 'I'],
...          ['D', 'D', 'D', 'S']]
>>> print(count_ops(table))
Counter({'substitutions': 1})
speechbrain.utils.edit_distance.wer_details_for_batch(ids, refs, hyps, compute_alignments=False, equality_comparator: ~typing.Callable[[str, str], bool] = <function _str_equals>)[source]

wer_details_by_utterance提供的便捷批量接口。

wer_details_by_utterance 可以处理缺失的假设,但有时(例如使用贪婪解码的CTC训练)它们并不需要,在这种情况下这是一个方便的接口。

Parameters:
  • ids (list, torch.tensor) – 批次的语音ID。

  • refs (list, torch.tensor) – 参考序列。

  • hyps (list, torch.tensor) – 假设序列。

  • compute_alignments (bool, 可选) – 是否计算对齐。如果计算,详细信息也将存储参考和假设。(默认: False)

  • equality_comparator (Callable[[str, str], bool]) – 用于检查两个单词是否相等的函数。

Returns:

参见 wer_details_by_utterance

Return type:

list

Example

>>> ids = [['utt1'], ['utt2']]
>>> refs = [[['a','b','c']], [['d','e']]]
>>> hyps = [[['a','b','d']], [['d','e']]]
>>> wer_details = []
>>> for ids_batch, refs_batch, hyps_batch in zip(ids, refs, hyps):
...     details = wer_details_for_batch(ids_batch, refs_batch, hyps_batch)
...     wer_details.extend(details)
>>> print(wer_details[0]['key'], ":",
...     "{:.2f}".format(wer_details[0]['WER']))
utt1 : 33.33
speechbrain.utils.edit_distance.wer_details_by_utterance(ref_dict, hyp_dict, compute_alignments=False, scoring_mode='strict', equality_comparator: ~typing.Callable[[str, str], bool] = <function _str_equals>)[source]

计算每个单独话语的财富WER信息。

这些信息可以用于计算摘要细节(WER, SER)。

Parameters:
  • ref_dict (dict) – 应该可以通过话语ID进行索引,并返回每个话语ID的参考标记作为可迭代对象

  • hyp_dict (dict) – 应该可以通过话语ID进行索引,并返回每个话语ID的假设标记作为可迭代对象

  • compute_alignments (bool) – 是否也应保存对齐信息。 这也会保存标记本身,因为它们可能是打印对齐信息所必需的。

  • scoring_mode ({'strict', 'all', 'present'}) –

    如何处理缺失的假设(在hyp_dict中未找到参考话语ID)。

    • ’strict’: 对缺失的假设抛出错误。

    • ’all’: 将缺失的假设评分为空。

    • ’present’: 仅对存在的假设进行评分。

  • equality_comparator (Callable[[str, str], bool]) – 用于检查两个单词是否相等的函数。

Returns:

一个列表,每个参考话语对应一个条目。每个条目是一个字典,包含以下键:

  • ”key”: 话语ID

  • ”scored”: (bool) 话语是否被评分。

  • ”hyp_absent”: (bool) 如果未找到假设,则为True。

  • ”hyp_empty”: (bool) 如果假设被认为是空的(要么是因为它是空的,要么是因为未找到且模式为‘all’),则为True。

  • ”num_edits”: (int) 总编辑次数。

  • ”num_ref_tokens”: (int) 参考中的标记数量。

  • ”WER”: (float) 话语的词错误率。

  • ”insertions”: (int) 插入次数。

  • ”deletions”: (int) 删除次数。

  • ”substitutions”: (int) 替换次数。

  • ”alignment”: 如果compute_alignments为True,则对齐为列表,参见speechbrain.utils.edit_distance.alignment。如果compute_alignments为False,则为None。

  • ”ref_tokens”: (iterable) 参考标记,仅在计算对齐时保存,否则为None。

  • ”hyp_tokens”: (iterable) 假设标记,仅在计算对齐时保存,否则为None。

Return type:

list

Raises:

KeyError – 如果评分模式为‘strict’且未找到假设。

speechbrain.utils.edit_distance.wer_summary(details_by_utterance)[source]

从details_by_utterance的输出中计算摘要统计信息

像WER这样的汇总统计

Parameters:

details_by_utterance (list) – 查看 wer_details_by_utterance 的输出

Returns:

包含以下键的字典:

  • ”WER”: (float) 词错误率。

  • ”SER”: (float) 句子错误率(至少有一个错误的语句的百分比)。

  • ”num_edits”: (int) 总编辑次数。

  • ”num_scored_tokens”: (int) 评分参考语句中的总标记数(缺失的假设可能仍以‘all’评分模式进行评分)。

  • ”num_erroneous_sents”: (int) 至少有一个错误的总语句数。

  • ”num_scored_sents”: (int) 被评分的总语句数。

  • ”num_absent_sents”: (int) 未找到的假设数。

  • ”num_ref_sents”: (int) 所有参考语句的数量。

  • ”insertions”: (int) 总插入次数。

  • ”deletions”: (int) 总删除次数。

  • ”substitutions”: (int) 总替换次数。

注意:某些情况下会导致插入、删除和替换次数的歧义。我们旨在复制Kaldi的compute_wer数值。

Return type:

dict

speechbrain.utils.edit_distance.wer_details_by_speaker(details_by_utterance, utt2spk)[source]

计算单词错误率和其他按说话者分组的重要信息。

Parameters:
  • details_by_utterance (list) – 查看 wer_details_by_utterance 的输出

  • utt2spk (dict) – 从话语ID到说话者ID的映射

Returns:

将说话者ID映射到统计信息的字典,键包括:

  • “speaker”: 说话者ID,

  • “num_edits”: (int) 该说话者的总编辑次数。

  • “insertions”: (int) 该说话者的插入次数。

  • “dels”: (int) 该说话者的删除次数。

  • “subs”: (int) 该说话者的替换次数。

  • “num_scored_tokens”: (int) 该说话者的评分参考标记数量(在“all”评分模式下,即使假设缺失,仍可能被评分)。

  • “num_scored_sents”: (int) 该说话者的评分话语数量。

  • “num_erroneous_sents”: (int) 该说话者至少有一个错误的话语数量。

  • “num_absent_sents”: (int) 该说话者未找到假设的话语数量。

  • “num_ref_sents”: (int) 该说话者的总话语数量。

Return type:

dict

speechbrain.utils.edit_distance.top_wer_utts(details_by_utterance, top_k=20)[source]

找到单词错误率最高的k个话语。

用于诊断目的,查看系统在哪些地方犯的错误最多。 返回非空的utterances结果,即必须存在于假设中,并产生了输出。

Parameters:
  • details_by_utterance (list) – 参见 wer_details_by_utterance 的输出。

  • top_k (int) – 要返回的话语数量。

Returns:

最多K个话语的列表, 具有最高的单词错误率,且不为空。 话语字典具有与 details_by_utterance相同的键。

Return type:

list

speechbrain.utils.edit_distance.top_wer_spks(details_by_speaker, top_k=10)[source]

找到单词错误率最高的K个说话者。

用于诊断目的。

Parameters:
  • details_by_speaker (list) – 参见 wer_details_by_speaker 的输出。

  • top_k (int) – 返回的说话者数量。

Returns:

最多K个字典的列表(与details_by_speaker具有相同的键),按WER排序的说话者。

Return type:

list