N-gram语言模型以及kenlm(1)

N-gram语言模型

  • kenlm
  • N-gram

kenlm

  1. 安装kenlm,他是基于cmake的c++程序,在非root情况下需要指定几个参数,还需要下载几个安装包;安装教程见之后的博客,或者可查阅其它,教程很多。
  2. 安装完毕后,执行
    lmplz -o 2 --verbose_header --text test1.txt --arpa douban.arpa
    注:lmplz --help可以得到每一个参数的意义
  3. 语料库可以是多种语言,我在这里是根据具体任务对双语语料各自生成了语言模型,一般用三元语言模型。
    在这里插入图片描述

N-gram

  1. n元语言模型这个名词已经在很多博客和paper中见到了,基于统计概率的一种语言模型。之前面试中也碰到过深入介绍语言模型的问题,当时并没有很深入的理解透彻,所以来此总结一下。
  2. 以中文为例:(如果语料太少,可能会出现如下错误)
    在这里插入图片描述
    按照提示直接将以上执行命令改成:
    lmplz -o 3 --discount_fallback --verbose_header --text test1.txt --arpa douban.arpa
    原文本:
    滋 润 
    侧 重 保 湿 
    适 合 各 种 肤 质 
    调 节 肌 肤 水 平 衡 
    它 还 具 有 修 复 功 效 
    提 亮 肤 色 我 是 油 性 肤 质 
    味 道 淡 淡 的 还 很 好 闻 
    也 很 好 吸 收 
    质 地 清 爽 
    
    得到的arpa文件
    ngram 1=49
    ngram 2=61
    ngram 3=54
    1-gram
    -2.0272384	<unk>	0
    0	        <s>	  -0.30103
    -0.9357313	</s>	0
    -1.7547638-0.30103
    ......
    2-gram
    -0.2533855</s>	0
    -0.2533855	湿 </s>	0
    -0.5114849</s>	0
    ......
    3-gram
    -0.1084696	滋 润 </s>
    -0.1084696	保 湿 </s>
    -0.18443066	肤 质 </s>
    ......
    
    可以看出,原始文本在训练时自动在每一行加上了
    	<s>滋 润</s> 
    	<s>侧 重 保 湿</s> 
    	<s>适 合 各 种 肤 质</s> 
    	<s>调 节 肌 肤 水 平 衡 </s>
    	<s>它 还 具 有 修 复 功 效 </s>
    	<s>提 亮 肤 色 我 是 油 性 肤 质</s> 
    	<s>味 道 淡 淡 的 还 很 好 闻 </s>
    	<s>也 很 好 吸 收 </s>
    	<s>质 地 清 爽 </s>
    

3.counting(计数)以及调整计数
统计1-gram、2-gram、3-gram每个元素出现的频次 ,再调整计数。如果设定为3-gram,那么1-gram以及2-gram的计数就得调整,不按频次来计算,而是根据当前词前面出现多少种情况来计算,3-gram依旧使用频次。具体可以参考图解N-gram语言模型的原理–以kenlm为例。
4. 数据平滑(discount)
之前面试时有面试官提到过在3-gram训练中,如果在计算p(w3|w1,w2)没有这个概率值会怎么办?(数据稀疏导致的问题)
答:数据平滑,把在训练样本中出现过的事件的概率适当减小 ,把减小得到的概率密度分配给训练语料中没有出现过的事件。kenlm中用到的平滑技术是Modified Kneser-ney smoothing。也见图解N-gram语言模型的原理–以kenlm为例。

你可能感兴趣的:(算法)