一、背景

  近期研究了一下语言模型,同事推荐了一个比较好用的工具包kenlm,记录下使用过程。

二、使用kenlm训练 n-gram

  1.工具介绍:http://kheafield.com/code/kenlm/

  2.工具包的下载地址:http://kheafield.com/code/kenlm.tar.gz

  3.解压后运行,./bjam 进行编译

  4.使用如下命令进行训练:bin/lmplz -o 5 --verbose_header --text data/chat_log.txt --arpa result/log.arpa --vocab_file result/log.vocab

  备注:4.1 文件必须是分词以后的文件。

     4.2 -o后面的5表示的是5-gram,一般取到3即可,但可以结合自己实际情况判断。

  

三、使用kenlm判断一句话概率

  使用kenlm主要就是对arpa文件内容的运行,下面解析下该文件的内容。

  1.arpa文件

  

\1-grams:
-6.5514092 <unk> 0
0 <s> -2.9842114
-1.8586434 </s> 0
-2.88382 ! -2.38764
-2.94351 world -0.514311
-2.94351 hello -0.514311
-6.09691 guys -0.15553 \2-grams:
-3.91009 world ! -0.351469
-3.91257 hello world -0.24
-3.87582 hello guys -0.0312 \3-grams:
-0.00108858 hello world !
-0.000271867 , hi hello ! \end\

  1.1 介绍该文件需要引入一个新的概念,back_pro.  超详细的介绍见 --> http://blog.csdn.net/visionfans/article/details/50131397

       三个字段分别是:Pro  word  back_pro (注:arpa文件中给出的数值都是以10为底取对数后的结果)

1.2 需要特别介绍三个特殊字符。<s>、</s>和<unk>

    一看便知,<s>和</s>结对使用,模型在计算概率时对每句话都进行了处理,将该对标记加在一句话的起始和结尾。这样就把开头和结尾的位置信息也考虑进来。

    如“我 喜欢 吃 苹果” --> "<s> 我 喜欢 吃 苹果 </s>"。

    <unk>表示unknown的词语,对于oov的单词可以用它的值进行替换。

  2.n-gram概率计算

  2.1 一元组w1

    直接在arpa文件中查找,如果有则直接返回它的pro,否则返回<unk>的pro。

  2.2 二元组w1w2

    直接在arpa文件中查找,有则直接返回它的pro,否则返回back_pro(w1)*pro(w2)的结果。当然此处都去过log,直接加减即可。

  2.3 三元组w1w2w3

    这个说起来比较麻烦,画个图。

    

    其中有一点大家可能会比较疑惑。为什么文件中存在二元组w1w2,要输出 back_pro(w1w2)*pro(w2w3),而没有w1w2,则可以直接输出pro(w2w3)。因为直观理解,有w1w2出现,概率pro(w1w2w3)的数值应该更大些。其实此处是用pro(w2w3)来近似代替pro(w1w2w3)的值。

    我在arpa文件中选了前2000个一元组的pro和back_pro画出下图,由图我们可知,一个单词或者词组的pro和back_pro是负相关的。所以当二元组w1w2没有出现时,我们认为pro(w1w2)的特别小,相应地back_pro的值就会变大,而取完log以后的结果就为0,在加法中可以直接忽略该项。

  

  3. sentence pro计算

    句子的计算就不需我多说了,一般情况下都只用到三元组。

  4.衡量指标

  4.1 衡量的指标暂时只考虑了困惑度(perplexity),定义如下:

    

    取完对数后计算超级方便,对数运算真乃利器也!!!

  

    

语言模型kenlm的训练及使用的更多相关文章

  1. 预训练语言模型整理(ELMo/GPT/BERT...)

    目录 简介 预训练任务简介 自回归语言模型 自编码语言模型 预训练模型的简介与对比 ELMo 细节 ELMo的下游使用 GPT/GPT2 GPT 细节 微调 GPT2 优缺点 BERT BERT的预训 ...

  2. 学习AI之NLP后对预训练语言模型——心得体会总结

    一.学习NLP背景介绍:      从2019年4月份开始跟着华为云ModelArts实战营同学们一起进行了6期关于图像深度学习的学习,初步了解了关于图像标注.图像分类.物体检测,图像都目标物体检测等 ...

  3. 预训练语言模型的前世今生 - 从Word Embedding到BERT

    预训练语言模型的前世今生 - 从Word Embedding到BERT 本篇文章共 24619 个词,一个字一个字手码的不容易,转载请标明出处:预训练语言模型的前世今生 - 从Word Embeddi ...

  4. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史(转载)

    转载 https://zhuanlan.zhihu.com/p/49271699 首发于深度学习前沿笔记 写文章   从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史 张 ...

  5. [转] 如何用kaldi训练好的模型做特定任务的在线识别

    转自:http://blog.csdn.net/inger_h/article/details/52789339 在已经训练好模型的情况下,需要针对一个新任务做在线识别应该怎么做呢? 一种情况是,用已 ...

  6. 【中文版 | 论文原文】BERT:语言理解的深度双向变换器预训练

    BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding 谷歌AI语言组论文<BERT:语言 ...

  7. BERT总结:最先进的NLP预训练技术

    BERT(Bidirectional Encoder Representations from Transformers)是谷歌AI研究人员最近发表的一篇论文:BERT: Pre-training o ...

  8. 语言模型预训练方法(ELMo、GPT和BERT)——自然语言处理(NLP)

    1. 引言 在介绍论文之前,我将先简单介绍一些相关背景知识.首先是语言模型(Language Model),语言模型简单来说就是一串词序列的概率分布.具体来说,语言模型的作用是为一个长度为m的文本确定 ...

  9. 自然语言处理中的语言模型预训练方法(ELMo、GPT和BERT)

    自然语言处理中的语言模型预训练方法(ELMo.GPT和BERT) 最近,在自然语言处理(NLP)领域中,使用语言模型预训练方法在多项NLP任务上都获得了不错的提升,广泛受到了各界的关注.就此,我将最近 ...

随机推荐

  1. 版本控制-Git服务器搭建和常用命令使用

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  2. SPI基础知识

    Serial Peripheral Interface 是摩托罗拉公司提出的一种总线协议,主要应用在EEPROM,FLASH,实时时钟,A/D转换,以及数字信号处理和数字信号解码器中 是一种高速,全双 ...

  3. hdu4059 The Boss on Mars(差分+容斥原理)

    题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设  则    为一阶差分. 二阶差分: n阶差分:     且可推出    性质: 1. ...

  4. [LeetCode] Remove Invalid Parentheses 移除非法括号

    Remove the minimum number of invalid parentheses in order to make the input string valid. Return all ...

  5. [LeetCode] Linked List Cycle 单链表中的环

    Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without using ex ...

  6. 「post中文参数问题」以及「验证码自动识别备忘」

    前言 之前搞过几次模拟登录,都是模拟 post 后取到 cookie,之后便能用这个 cookie 愉快玩耍.这次碰到了验证码,其实只需手动登录一次,手动取到 cookie 后也能玩耍,不过 cook ...

  7. jQuery遍历checkbox

    $("input[type='checkbox']").each(function(){ var value = $(this).val(); //获得值 $(this).attr ...

  8. C# 在数组中判断是否存在某个数组值

    (1) 第一种方法: ,,}; ); // 这里的1就是你要查找的值 ) // 不存在 else // 存在 (2) 第二种方法: string[] strArr = {"a",& ...

  9. c# 读取mck码

    private List<string> GetMac() { List<string> macs = new List<string>(); try { var ...

  10. JSP和Servlet的中文乱码处理

    JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...