N-Gram是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为N的滑动窗口操作,形成了长度是N的字节片段序列。
每一个字节片段称为gram,对所有gram的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键gram列表,也就是这个文本的向量特征空间,列表中的每一种gram就是一个特征向量维度。
例子
比如我们现在使用单元Unigram、二元的Bi-gram和三元的Tri-gram模型来对进行特征提取。
我们的训练样本为:
1)我去了北京天安门
2)我是中国人
那么我们对每一个样本进行单元Unigram、二元的Bi-gram和三元的Tri-gram模型提取。
单元Unigram来说
对于:“我去了北京天安门”
抽取 我 去了 北京 天安门
对于:“我是中国人”
抽取 我 是 中国人
二元Bi-gram
对于:“我去了北京天安门”
抽取 我 去了/ 去了 北京/ 北京 天安门/
对于:“我是中国人”
抽取 我 是 / 是 中国人/
三元Tri-gram
对于:“我去了北京天安门”
抽取 我 去了 北京/ 去了 北京 天安门/
对于:“我是中国人”
抽取 我 是 中国人/
那么从上面可以得出,我们的特征向量包含我在训练数据中利用单元Unigram,二元Bi-gram,以及三元Tri-gram抽取出的不同特征,组成我的特征向量维度。
然后以后对应一句话,直接进行Unigram,Bi-gram,Tri-gram进行抽取特征,出现哪个特征,就统计它的频数,最后填在特征向量中即可。
比如上面的特征向量我列举一下顺序如:
我、是、中国人、去了、北京、天安门、我 是、是 中国人、我 去了、去了 北京、北京 天安门、我 去了 北京、去了 北京 天安门、 我 是 中国人、
抽取特征过程
那么对于一句话“我是中国人”进行N-gram特征抽取的方法是。
单元Unigram来说
对于:“我是中国人”
抽取 我 是 中国人
二元Bi-gram
对于:“我是中国人”
抽取 我 是 / 是 中国人/
三元Tri-gram
对于:“我是中国人”
抽取 我 是 中国人/
于是我们就在出现的词语维度赋值为1,其余没有出现过的特征赋值为0,相当于one-hot特征。得到特征向量如下:
[1,1,1,0,0,0,1,1,0,0,0,0,0,0,1]
得到的上面这个特征向量就是我们使用N-gram提取特征方法提取出来的特征。
N-gram 算法采用固定长度为 N 的滑动窗口进行切分,目前常用 N-gram 模型是二元的 Bi-gram 和三元的 Tri-gram 模型。对两种模型的切分方法进行比较,比如 “北京 欢迎 你的 到来”,Bi-gram 切分就是 “北京欢迎 欢迎你的 你的到来”,Tri-gram 切分就是 “北京欢迎你的 欢迎你的到来”。这里说明一下为什么北京欢迎你的到来 的Bigram不是 北京 京欢 欢迎 迎你 你的 的到 到来,因为切分是以词为单位,这里一定要注意。
总结
如果我们使用N-gram提取特征,使用unigram,bigram,trigram提取特征的情况,在词汇表大小为V的时候,特征向量维度长度为[V(unigram)+V^2(bigram)+V^3(trigram)]