N-Gram是一种基于统计语言模型的算法
N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
n元语法模型是基于(n-1)阶马尔可夫链的一种概率语言模型,通过n个语词出现的概率来推断语句的结构。
N-Gram: (linguistics) a contiguous sequence of n items from a given sequence of text or speech.
N-Gram 指文本中连续出现的n个语词。
一元语言模型
unigram (plural unigrams)
(linguistics) An n-gram consisting of a single item from a sequence
由序列中的单个Item组成的n-gram
一元语言模型中,我们的句子概率定义为:
我们应该如何得到每个参数实例的值。用的是极大似然估计法。
比如我们说我们的训练语料是下面这个简单的语料。
那么我们的字典为:“星期五早晨,我特意起了个大早为的就是看天空。” 22个不同词(字典中包含的词语,是去重之后的),每个词语的概率直接用极大似然估计法估计得到。
如:p(星)=1/27,p(期)=1/27,一直算到后面的空为1/27. (包含标点符号)
于是我们就需要存储我们学习得到的模型参数,一个向量,22维,每个维度保存着每个单词的概率值。
那么有同学就需要问了,来了一句话,我们应该怎么估计呢?下面我举一个简单的例子来模拟一下如何用语言模型估计一句话的概率,比如:
p(我看看早晨的天空)=p(我)*p(看)*p(看)*p(早)*p(晨)p(的)p(天)p(空)=1/271/271/27…*1/27就能够直接运算出来。
于是我们得出,只要将每句话拆开为每个单词然后用累积形式运算,这样我们就能算出每句话的概率来了。
但是这样是不是就解决我们所有的问题呢?并没有,下面我们介绍二元语言模型。
二元语言模型
介绍二元语言模型之前,我们首先来看两句话,he eats pizza与he drinks pizza,我们需要用语言模型来判断这两句话出现的概率。
好,那么我们现在用一元语言模型来分别计算这两个句子的概率大小。
p(he eats pizza) = p(he)*p(eats)*p(pizza)
p(he drinks pizza) = p(he)*p(drinks)*p(pizza)
我们可以看出,其实通过一元语言模型的计算公式,我们看不出上面两个句子的概率有多大差别,但是我们很明显知道第一句话比第二句话的概率要大的多,因为正确的表达应该就是吃披萨,而不是喝披萨。
但是由于我们用了一元语言模型,假设每个词都是条件无关的,这样的话就会导致我们考虑不到两个词之间的关系搭配,比如在这个例子中,很明显应该判断的是p(pizza|eats)与p(pizza|drinks)的概率大小比较。
这也就是二元语言模型需要考虑的问题。
我们需要计算p(