当前位置:   article > 正文

语言模型简介和Ngram模型(1)

语言模型简介和Ngram模型(1)

语言模型

语言模型概念

概念: 语言模型用于计算文本的成句概率。

示例: P(今天天气不错) > P(今错不天天气)。

释义: 语言模型评价一句话是否“合理”或“是人话”。

语言模型应用-语音识别

流程图:
在这里插入图片描述

声纹特征提取

流程:

1.声音本质是一种波,将波按时间段切分很多帧,如25ms一段
2.之后进行声学特征提取,将每一帧转化成一个向量
3.经过经过声学模型,预测得到音素,音素与拼音类似

在这里插入图片描述

语言模型挑选成句

音素序列对应多条文本序列,由语言模型挑选出成句概率最高的序列
为了提高效率,会使用beam search或维特比的方式解码
在这里插入图片描述

语言模型应用-手写识别

在这里插入图片描述

识别模型将图片中文字转化为候选汉字(一般分定位和识别两步),再有语言模型挑选出成句概率最高的序列

比如识别到:

浙 江
淅 冮 (gang)

明显浙江是我们常用的词,下面的词都不知道有没有这个组合,语言模型则会挑选出来

语言模型应用-输入法

释义: 输入即为拼音序列,每个拼音自然的有多个候选汉字,根据语言模型挑选高概率序列

难点: 输入法是一个细节繁多的任务,在语言模型这一基础算法上,需要考虑打字手误,常见误读,拼音缩略,中英混杂,输出符号,用户习惯等能力

语言模型分类

按照复杂程度和发展分类:
1.统计语言模型 (SLM) S = Statistics
ngram语言模型等

2.神经语言模型(NLM) N = Neural
rnn语言模型等

3.预训练语言模型(PLM) P = Pre-train
Bert、GPT等

4.大语言模型(LLM) L = Large
ChatGPT等

预测的方向来分类:
1.自回归(auto regressive)语言模型
在训练时由上文预测下文(或反过来)
单向模型,仅使用单侧序列信息
代表:N-gram,ELMO, GPT

2.自编码(auto encoding)语言模型
在训练时预测序列中任意位置的字符
双向模型,吸收上下文信息
代表:BERT

语言模型评价指标-困惑度PPL

计算方式1:
在这里插入图片描述

计算公式2:
在这里插入图片描述

释义: 根据上面两种计算公式推导可以知道,PPL与成句概率成反比。

我们怎么通过PPL判断模型好坏呢? 因为我们知道,这是个相对的值;即我们输入一些正常的句子成句概率高,PPL小,输入一些糟糕的句子,成局概率小,PPL大;我们就说能够区别真句子和假句子,这个模型可以。

局限性分析: 我们知道,按照上面的计算方式,PPL的评判是有很大的局限的;

1.好的句子成句概率高,并不能说明模型很好
2.糟糕的句子只有在具体的场景中去验证,因为如果只是随机拼接的糟糕句子,实际在场景中也基本不会出现,验证没有价值;只有具体场景的具体情况进行分析和验证才行。

N-gram语言模型

计算成句概率:

用S代表句子,w代表单个字或词
S = w1w2w3w4w5…wn
P(S) = P(w1,w2,w3,w4,w5…wn)
即:S的概率为,组成其所有的词按照顺序出现的概率;词W1~Wn按顺序出现的概率

公式: P(w1,w2,w3,…,wn) = P(w1)P(w2|w1)P(w3|w1,w2)…P(wn|w1,…,wn-1)
理解: 就是首先在一个大的语料中,统计出w1出现的概率;然后统计在w1出现的次数中,后面出现w2的概率.…一直往下,就可以得到整个句子各个字或者词出现的概率,相乘的到成句概率。

举例:
P(今天) = Count(今天) / Count_total 语料总词数

P(天气|今天) = Count(今天 天气) / Count(今天)

P(不错|今天 天气) = Count(今天 天气 不错) / Count(今天 天气)

P(今天天气不错) = P(今天) P(天气|今天) P(不错|今天 天气)

n-gram
如果是统计两个词的成句概率,就叫2-gram;三个词就叫3-gram

二元组:今天 天气 2 gram
三元组:今天 天气 不错 3 gram

马尔科夫假设

起因: 上面Ngram我们可以看出,如果是10多个词甚至几十个词;我们要计算的数据就太大了,因为词的组合在每个语言中都太多了。那么超出所有的句子,并且计算出每一个词的条件概率,比较困难,无法枚举。

所以提出了马尔科夫假设,是为了简化计算。

假设: 假设第n个词出现的概率,只和它前面的有限个词有关,那么公式就可以简化为:

P(wn|w1,…,wn-1) ≈ P(wn|wn-3,wn-2,wn-1)

举例:
P(今天天气不错) = P(今)*P(天|今) *P(天|今天) *P(气|天天) *P(不|天气) *P(错|气不)

缺陷:

1.影响第n个词的因素可能出现在前面很远的地方
2.影响第n个词的因素可能出现在其后面 (动作的目标,比如我 * 球 ==》打)
3.影响第n个词的因素可能并不在文中 (和地点有关)
但是基于马尔科夫假设下依然可以得到非常有效的模型

平滑问题

引子:
问题: 如何给出语料中没出现过的词概率?
举例: P(今天 天气 糟糕) = P(今天)*P(天气|今天) *P(糟糕|天气)

释义:
如果语料中没有出现过糟糕在天气后面出现的情况,那么这句话的概率就为0;语言模型的目的是计算成句的概率;两句话如果都出现语料中的结构,那概率都为零,没法比较;并且不论出现什么情况,我们都不希望一句话的成句概率为零;第一次出现也只能说明它的概率为零

上述就是我们说的语言模型中出现的平滑问题

1.理论上说,任意的词组合成的句子,概率都不应当为零
2.如何给没见过的词或ngram分配概率即为平滑问题
3.也称折扣问题(discounting)

平滑问题解决一

解决办法:1.回退(backoff)

当三元组a b c不存在时,退而寻找b c二元组的概率
P(c | a b) = P(c | b) * Bow(ab)
Bow(ab)称为二元组a b的回退概率;和ab同时出现概率有关,如果ab同时出现的概率高,则说明是固定词的情况越大,后面跟C的概率越小
回退概率有很多计算方式,甚至可以设定为常数
回退可以迭代进行,如序列 a b c d
1.P(d | a b c) = P(d | b c) * Bow(abc)
2.P(d | bc) = P(d | c) * Bow(bc)
3.P(d | c ) = P(d) * Bow©

上述还是有个问题,即最后回退到单个字出现的概率P(d);如果都没有怎么处理呢?

解决办法:2.1加1平滑
问题: 即P(word)不存在如何处理。

两种情况:这个字或者词在我们的语料里面没有;它属于生僻字,在字典上可以找到;或者这个字或者词就从来没有出现过、

那么对这个没有出现的词的概率,我们可以用下面公式表示:
在这里插入图片描述
释义:

1.V代表我们词表的大小;既然之前没有出现过这个词,那我们就假设本次出现了这一次。但是原来是没有的,我们就假设所有的词表次都出现了一次
2.所以分母需要加上词表大小V

解决办法:2.2平滑
在这里插入图片描述

释义: c代表统计语料中出现的次数即count,Wi-1,Wi是一个词;Wi-1是词中的一个字。比如我们和我。

平滑问题解决二

1.将低频词替换为< UNK >
2.预测中遇到的未见过的词,也用< UNK >代替
3.一语成谶 -> 一语成< UNK >
4.P( < UNK > |一 语 成)
这是一种nlp处理未登录词(OOV)的常见方法;< UNK >是ngram模型中的一种特殊字符;这样就可以避免概率为零的情况出现

插值优化

释义: 受到回退平滑的启发,在计算高阶ngram概率是同时考虑低阶的ngram概率值,以插值给出最终结果
公式如下:

在这里插入图片描述
在这里插入图片描述
结论:
实践证明,这种方式效果有提升
λ 可以在验证集上调参确定

语言模型应用-文本纠错

举例:

我今天去了天暗门看人民英雄记念碑
我今天去了天门看人民英雄念碑

错误可能是同音字或形近字等

实现方案

步骤

1.对每一个字建立一个混淆字集合
2.计算整句话成句概率
3.用混淆字集合中的词替代原句中的字,重新计算概率
4.选取得分最高的一个候选句子,如果这个句子比原句的得分增长超过一定的阈值
5.对下一个字重复步骤3-4,直到句子末尾

如下:
在这里插入图片描述

缺陷:

1.无法解决多字少字问题
2.阈值的设置非常难把握,如果设置过大,达不到纠错效果;如果设置过小,造成大量替换,有可能改变句子的原意
3.混淆字字表难以完备
4.语言模型的领域性会影响修改结果
5.连续的错字会大幅提升纠错难度
例如:今天上午要过来办事 -> 今天商务要过来办事

解决办法:

限定一个修改白名单,只判断特定的字词是否要修改
如限定只对所有发音为shang wu的片段,计算是否修改为“商务”,其余一概不做处理
对于深度学习模型而言,错别字是可以容忍的,所以纠错本身的重要性在下降,一般只针对展示类任务

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/950362
推荐阅读
相关标签
  

闽ICP备14008679号