speechbrain.lm.ngram 模块

N-gram 语言模型查询接口

作者
  • Aku Rouhe 2020

摘要

BackoffNgramLM

用于回退 (backoff) N-gram 语言模型的查询接口

函数

ngram_evaluation_details

评估数据中每个句子的 N-gram 语言模型

ngram_perplexity

从个体句子评估列表中计算困惑度。

参考

class speechbrain.lm.ngram.BackoffNgramLM(ngrams, backoffs)[source]

基类:object

用于回退 (backoff) N-gram 语言模型的查询接口

ngrams 格式通过一个查询示例最容易解释:P( world | <s>, hello ),即三元模型,给定“<s> hello”时“world”的概率是:ngrams[2][("<s>", "hello")]["world"]

在顶层,ngrams 是一个包含不同历史长度的字典,每个阶数是一个字典,以上下文(元组)作为键,以(对数)分布(字典)作为值。

backoffs 格式稍微简单一些。在顶层,backoffs 是一个包含不同上下文阶数的列表,每个阶数是从回退上下文到回退(对数)权重的映射(字典)

参数:
  • ngrams (dict) – N-gram 对数概率。这是一个三层嵌套字典。第一层由 N-gram 阶数(整数)索引。第二层由上下文(token 元组)索引。第三层由 token 索引,并映射到对数概率。示例:log(P(fox|a quick red)) = -5.3 通过以下方式访问:ngrams[4][('a', 'quick', 'red')]['fox']

  • backoffs (dict) – 回退对数权重。这是一个两层嵌套字典。第一层由 N-gram 阶数(整数)索引。第二层由回退历史(token 元组)索引,即概率分布所依赖的上下文。这映射到对数权重。示例:如果 log(P(fox|a quick red)) 没有列出,我们查找 log(backoff(a quick red)) = -23.4,通过以下方式访问:backoffs[3][('a', 'quick', 'red')] 这个字典必须包含至少到 N-1 阶的条目(即使它们为空)。它也可能包含 N 阶的条目,尽管这些条目永远无法访问。

示例

>>> import math
>>> ngrams = {1: {tuple(): {'a': -0.6931, 'b': -0.6931}},
...           2: {('a',): {'a': -0.6931, 'b': -0.6931},
...               ('b',): {'a': -0.6931}}}
>>> backoffs = {1: {('b',): 0.}}
>>> lm = BackoffNgramLM(ngrams, backoffs)
>>> round(math.exp(lm.logprob('a', ('b',))), 1)
0.5
>>> round(math.exp(lm.logprob('b', ('b',))), 1)
0.5
logprob(token, context=())[source]

计算并应用回退对数权重。

speechbrain.lm.ngram.ngram_evaluation_details(data, LM)[source]

评估数据中每个句子的 N-gram 语言模型

调用 ngram_perplexity 并传入此函数的输出来计算困惑度。

参数:
  • data (iterator) – 句子的迭代器,其中每个句子应该是一个迭代器,如 speechbrain.lm.counting.ngrams_for_evaluation 所返回的迭代器。

  • LM (BackoffNgramLM) – 要评估的语言模型

返回:

`collections.Counter` 对象的列表,这些对象具有键“num_tokens”和“neglogprob”,分别表示每个句子的 token 数和对数概率(与数据顺序相同)。

返回类型:

list

注意

collections.Counter 无法添加负数。因此,使用负对数概率(始终 >=0)非常重要。

示例

>>> class MockLM:
...     def __init__(self):
...         self.top_order = 3
...     def logprob(self, token, context):
...         return -1.0
>>> LM = MockLM()
>>> data = [[("S", ("<s>",)),
...          ("p", ("<s>", "S")),
...          ("e", ("S", "p")),
...          ("e", ("p", "e")),
...          ("c", ("e", "e")),
...          ("h", ("e", "c")),
...          ("</s>", ("c", "h"))],
...         [("B", ("<s>",)),
...          ("r", ("<s>", "B")),
...          ("a", ("B", "r")),
...          ("i", ("r", "a")),
...          ("n", ("a", "i")),
...          ("</s>", ("i", "n"))]]
>>> sum(ngram_evaluation_details(data, LM), collections.Counter())
Counter({'num_tokens': 13, 'neglogprob': 13.0})
speechbrain.lm.ngram.ngram_perplexity(eval_details, logbase=10.0)[source]

从个体句子评估列表中计算困惑度。

参数:
  • eval_details (list) – 个体句子评估列表。如 ngram_evaluation_details 所返回的列表。

  • logbase (float) – 要使用的对数底数。

返回:

计算得到的困惑度。

返回类型:

float

示例

>>> eval_details = [
...     collections.Counter(neglogprob=5, num_tokens=5),
...     collections.Counter(neglogprob=15, num_tokens=15)]
>>> ngram_perplexity(eval_details)
10.0