语言模型-Ngram

   总结工作中用到和学习的知识,也算自己的一个笔记。

  • 语言模型

        语言模型简单来讲,就是计算一个句子的概率,更确切的说是计算组成这个句子一系列词语的概率。

        举个简单的例子,我们知道“武松打死了老虎”相比于“老虎了死武松打”,更像是一句正常的话,这是因为前者出现的概率更高。对一句话而言,它的概率

        举个简单的邮件分类例子,对于垃圾邮件中的一句话“我司可办理正规发票保真增值税发票点数优惠”,这句话发生的概率P = P(“我”,“司”,“可”,“办理”,“正规发票”,“保真”,“增值税”,“发票”,“点数”,“优惠”),如果要按照上面的联合概率链规则公式,我们只考虑一个词语对上一个词语的依赖关系,而与再之前的词没有关系,我们把它叫做二元语法(bigram,2-gram)。

        如果把依赖词长度再拉长一点,考虑一个词对前两个词的依赖关系,就叫做三元语法(trigram,3-gram) 如果我们再考虑长一点,考虑n个词语之间的关系,这就是n-gram的由来。

        引出著名的马尔科夫假设(Markov Assumption):下一个词的出现仅依赖于它前面的一个或几个词。这相对于联合概率链规则,其实是一个有点粗糙的简化,不过很好地体现了就近思路,离得较远和关系比较弱的词语就被简化和省略了。实际应用中,这些简化后的n-gram语法比独立性假设还是强很多的。其实可以把独立性假设理解成为1-gram。

  •     N的选择

        选择依赖词的个数“n”主要与计算条件概率有关。理论上,只要有足够大的语料,n越大越好,毕竟这样考虑的信息更多嘛。条件概率很好算,统计一下各个元组出现的次数就可以,比如:

?(“优惠”|“发票”,“点数”)=(“发票”,“点数”,“优惠”)出现的次数/(“发票”,“点数”)出现的次数

P(“优惠”|“发票”,“点数”)=(“发票”,“点数”,“优惠”)出现的次数/(“发票”,“点数”)出现的次数

但我们实际情况往往是训练语料很有限,很容易产生数据稀疏,不满足大数定律,算出来的概率失真。比如(“发票”,“点数”,“优惠”)在训练集中竟没有出现,就会导致零概率问题。又比如在英文语料库IBM, Brown中,三四百兆的语料,其测试语料14.7%的trigram和2.2%的bigram在训练语料中竟未出现!

另一方面,如果n很大,参数空间过大,产生维数灾难,也无法实用。假设词表的大小为100000,那么n-gram模型的参数数量为100000^n。这么多的参数,估计内存就不够放了。

 那么,如何选择依赖词的个数n呢?

(1)经验上,trigram用的最多。尽管如此,原则上,能用bigram解决,绝不使用trigram。n取≥4的情况较少。

(2)当n更大时:对下一个词出现的约束信息更多,具有更大的辨别力;

(3)当n更小时:在训练语料库中出现的次数更多,具有更可靠的统计信息,具有更高的可靠性、实用性。

  • N-gram应用

(1)词性标注

(2)垃圾邮件识别,会比朴素贝叶斯好。因为这种方法考虑到了词语前面的一个词语的信息,同时也考虑到了部分语序信息,因此区分效果会比单纯用朴素贝叶斯方法更好。

(3)中文分词

(4)机器翻译,获得最好的顺序。

  • 平滑技术

    我们简单探讨一下平滑技术。为了解决零概率问题呢,我们需要给 “未出现的n-gram条件概率分布一个非零估计值,相应得需要降低已出现n-gram条件概率分布,且经数据平滑后一定保证概率和为1”。这就是平滑技术的基本思想。最简单的平滑技术是拉普拉斯平滑,是最古老的一种平滑方法,又称加一平滑法,其保证每个n-gram在训练语料中至少出现1次。

 

语言模型-Ngram_第1张图片

       在所有不重复的三元组的个数远大于(“发票”,“点数”)出现的次数时,即训练语料库中绝大部分n-gram都是未出现的情况(一般都是如此),拉普拉斯平滑有“喧宾夺主”的现象,效果不佳。

    公式在Typora上写好之后,在微信展现效果不是很好,有些公式就没有展示。

可以关注个人微信公众号,大家一起交流机器学习、深度学习、NLP领域知识。

 

语言模型-Ngram_第2张图片

 

你可能感兴趣的:(NLP)