speechbrain.lm.ngram 模块
N-gram 语言模型查询接口
- 作者
Aku Rouhe 2020
摘要
类
用于回退 (backoff) N-gram 语言模型的查询接口 |
函数
评估数据中每个句子的 N-gram 语言模型 |
|
从个体句子评估列表中计算困惑度。 |
参考
- 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
- 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 数和对数概率(与数据顺序相同)。
- 返回类型:
注意
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})