一、背景

  近期研究了一下语言模型,同事推荐了一个比较好用的工具包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. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  2. Windows Server 2012 虚拟化实战:SCVMM的安装和部署

    本篇大概介绍一下在Windows Server 2012 R2上安装和部署SCVMM的过程及其注意事项.下图是我们数据中心SCVMM的基本架构,其中 SCVMM Database 是用于存储了所有配置 ...

  3. win10打开IL DASM步骤:

  4. win10用户文件夹重命名,启用administrator账户,删除文件夹时提示找不到该项目

    这一切都源自楼主洁癖一般的强迫症. 楼主在重置win10后的安装过程中用microsoft账户登录的电脑,发现用户文件夹名称怪怪的,于是想重命名一下.楼主发现重命名用户文件夹并不能简单地用F2搞定,于 ...

  5. USB Host的上拉下拉电阻

      关于USB的上下拉电阻,不是随便接个任意阻值的电阻就ok了. 当你的USB为主设备的时候,D+.D-上分别接一个15K的下拉电阻,这样可以使得在没有设备插入的时候,D+.D-上始终保持低电平:当为 ...

  6. Juniper SSG5 PPTP VPN 619错误解决

    公司分部的客户端需要使用PPTP VPN连接总部,将网关更换为Juniper SSG5后,客户端出现了每几个小时自动断开的现象,错误619. 解决:Security —— ALG —— 开启PPTP协 ...

  7. [转]ASP.NET Core--根据方案来限制身份

    本文转自:http://www.cnblogs.com/duyao/p/5980105.html 翻译如下: 在某些情况下,比如单页的应用程序,可以与多种认证来方式结合.例如,您的应用程序可能使用基于 ...

  8. [LeetCode] Number of Segments in a String 字符串中的分段数量

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  9. [LeetCode] Spiral Matrix 螺旋矩阵

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  10. 20170103简单解析MySQL查询优化器工作原理

    转自博客http://www.cnblogs.com/hellohell/p/5718238.html 感谢楼主的贡献 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL ...