本系列原理涉及较少,多为学习过程中遇到并初步了解的相关知识,具有科普性。
从20世纪80年代或更早的时候起,学者们研究了很多的分词方法,这些方法大致可以分为三大类:
基于词表的分词方法 - 正向最大匹配法(forward maximum matching method, FMM) - 逆向最大匹配法(backward maximum matching method, BMM) - N-最短路径方法
基于统计模型的分词方法 - 基于N-gram语言模型的分词方法
基于序列标注的分词方法 - 基于HMM的分词方法 - 基于CRF的分词方法 - 基于词感知机的分词方法 - 基于深度学习的端到端的分词方法
本篇我们初步介绍一下N-gram语言模型。
首先,我们需要一些数学基础:
还有贝叶斯公式和全概率公式:
下面,我们就可以理解N-gram语言模型了。
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
该模型基于这样一种假设,第N个词的出现只与前面N-1个词相关,而与其它任何词都不相关,整句出现的概率就是各个词出现概率的乘积。(chatgpt也是基于这个原理)这些概率可以通过直接从语料中统计N个词同时出现的次数得到。常用的是二元的Bi-Gram和三元的Tri-Gram。
如果我们有一个由 m 个词组成的序列(或者说一个句子),我们希望算得概率 ,根据链式规则,可得:
这个概率显然并不好算,不妨利用马尔科夫链的假设,即当前这个词仅仅跟前面几个有限的词相关,因此也就不必追溯到最开始的那个词(靠后的词的概率一般与开始的词无关),这样便可以大幅缩减上述算式的长度,提高运行效率。
但是现实生活中,后面的词一般只与前面1,2,3个词有关,因此我们只考虑一元模型,二元模型,三元模型。
当 n=1, 一个一元模型(unigram model)即为 :
当 n=2, 一个二元模型(bigram model)即为
当 n=3, 一个三元模型(trigram model)即为
然后,利用贝叶斯定理,将上述的条件概率值统计出来:
数学推导过程如下:
这些模型计算的是某个句子出现的概率,也就是说这个句子像人话的可能性有多高,当这个概率越高,说明这个句子更像人话,更符合语言逻辑。
经过一些实体例子证明,二元模型Bi-gram的正确率比较高。
例:
假设我们现在有如下的一个语料库(一般包含很多句子,很多的词),其中是句首标记,是句尾标记(对于trigram来说,每个句子的第一个词之前要补两个开始标记,最后一个词之后要补两个结束标记。其他n-gram同理):
那么这个句子出现的概率是多少呢,也就是说这个句子是人话的可能性有多大呢?
首先要计算用到的一些概率
经计算,我们得到其概率为0.05.
也就是说,这个句子是人话的可能性是0.05,但有的时候句子很长,会出现大量的小数,这时候我们就该考虑取对数来处理了。
关于其应用,我们在生活中见到了很多,比如我们的搜索栏:
当你输入两个字时,网页会自动为你计算后面最可能出现的汉字。
除此之外,N-gram模型还应用于一些分词模型,比如jieba模型,我们后续再介绍相关知识。
参考博客[NLP:n-gram模型-CSDN博客] (https://blog.csdn.net/sinat_36226553/article/details/108731334)
参考知乎[自然语言处理中N-Gram模型介绍 - 知乎 (zhihu.com)] (https://zhuanlan.zhihu.com/p/32829048)
参考博客[自然语言处理 | (11) N-gram语言模型及其应用_3-gram-CSDN博客] (https://blog.csdn.net/sdu_hao/article/details/86893580)