二、N-Gram 算法

N-Gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成了长度为 N 的字节片段序列。 每一个字节片段称为 gram,对所有 gram 的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键 gram 列表,也就是这个文本的向量特征空间,列表中的每一种 gram就是一个特征向量维度。常用的是二元的 Bi-Gram 和三元的 Tri-Gram。
(一)Bi-Gram 词串生成过程 如果有一个由个词组成的序列(或者说一个句子),希望算得概率 ,根据链式规则,可得 这个概率显然并不好算,不妨利用马尔可夫链的假设,即当前这个词仅仅跟前面几个有限的词相关,因此也就不必追溯到最开始的那个词,这样便可以大幅缩减上述算式的长度,即
下面给出一元模型、二元模型、三元模型的定义: 当,一个一元模型(unigram model)即为 ,一个二元模型(bigram model)即为 ,一个三元模型(trigram model)即为
接下来的步骤是在给定的训练语料中,利用贝叶斯定理,将上述条件概率值都统计计算出来即可。下面给出具体例子讲解,其概率计算公式如下。 对于 bigram model 而言:
对于 N-gram model 而言: 计算过程为
例如,从网站付费下载几十首歌词,并且根据线上开放语料库建成一个简单的歌词语料库,表 2-9-6 给出的是基于 Bigram 模型进行计数的结果。 表 2-9-6 歌词语料库 Bigram 模型计数示例
例如,第一行、第二列表示给定前一个词是“当”时,当前词为“一艘船”的情况一共出现了 2 次。据此,便可以算得相应的频率分布,如表 2-9-7 所示。 表 2-9-7 歌词语料库 Bigram 模型计数示例概率分布表
以表 2-9-7 中的 p(一艘船|当)=0.003 6 这个概率值讲解,从表 2-9-6 中得出“当”一共出现了 21 次,而其后出现“一艘船”的次数一共有 2 次。。 据此,可以引出 N-gram 的应用,比如,搜索引擎(Google 或者 Baidu)、输入法猜想或者提示。当在搜索时,输入一个或几个词,搜索框通常会以下拉菜单的形式给出几个备选,这些备选其实是在猜想用户想要搜索的那个词串。 再者,当用输入法输入一个汉字的时候,输入法通常可以联系出一个完整的词,比如输入一个“刘”字,通常输入法会提示是否要输入的是“刘备”。通过上面的介绍,应该能够很敏锐地发觉,这其实是以 N-Gram 模型为基础来实现的。 按照以上思路,上述歌词库也可实现自动写词,只要不断加大歌词训练词库的量,就可以实现自动写歌词,下载及试用可扫描右侧的二维码。 自动谱曲软件也同此处理,也可下载Toolbar Image及试用。
(二)Bi-Gram 评判语句的合理性 假设现在有一个语料库,我们统计了一些词出现的数量,如表 2-9-8 所示。 表 2-9-8 一些词出现的数量 下面这些概率值作为已知条件: , p(english | want)=0.0011 p(food | english) =0.5 , p( </ s >| food)= 0.68 , p(want | <s> ) =0.25 ; 表 2-9-9 给出的是基于 Bigram 模型进行计数的结果。 表 2-9-9 Bigram 模型计数结果表 相应的频率分布表如表 2-9-10 所示。 表 2-9-10 Bigram 模型计数概率表
下面通过基于这个语料库来判断 =“<s> i want english food</s>”与 =“<s> want i english food</s>”哪个句子更合理。 首先判断 这里, 中的<s>是句头的意思,指如果是句头,出现的概率; 中 的</s>是句尾的意思,指如果是 food,句尾出现的概率。 再来求 通过比较可以明显发现 0.000 000 020 57<0.000 031,也就是说 =“i want english food</s>”更合理。