【NLP.TM】

本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注。

往期回顾

  • NLP.TM[32] | 浅谈文本增强技术

  • NLP.TM[33] | 纠错:pycorrector的错误检测

  • NLP.TM[34] | 纠错:pycorrector的候选召回

  • NLP.TM[35] | 纠错:pycorrector的候选排序

  • ML&DEV[18] | 入职一周年:夯实基础,持续深入

不知道现在大家学NLP还有没有从n-gram语言模型开始学起了。但是n-gram语言模型应该是当前所有高端的bert、gpt之类的飞机大炮的绝对根基,我们来看看,最经典的n元语法到底是什么操作的。当然,本文篇章有限,文末给了不少参考文献,大家可以根据文章进行深入学习和尝试。

n元语法——条件概率的盛宴

n元语法,最初就来源于简单的条件概率,来看看吧。

对一个长为的句子,按照这些词汇构成句子的概率记作,按照、条件概率概念,可以得到:

  • 第一行,其实就是形容整个句子按照顺序出现的概率。

  • 第二行,按照条件概率,就能够拆分成,条件概率的连乘,这种连乘其实就能理解为,“每一个词的出现依赖于前面所有词的出现”,这就是根据历史的条件概率。

  • 第三行,就是简单的抽象连乘。

那么我们需要估计的,其实就是上面第二行的每个p,但问题来了,这么多的词汇组合,要估计出所有来,几乎是不可能的,因此我们对他进行了简化,我们只考虑n个词,如n=1(即1-gram),则只考虑当前词,n=2(即2-gram),则考虑该词汇和前一位的词,在这种假设下,上面的(1)式可以简化为

如果考虑句子的开头和结尾,则是这样的:

在随机过程的视角看其实就是“一阶马尔科夫性”,第一位提出的应该是对条件概率和状态转移的理解非常深了。

平滑——没出现不代表不可能

问题继续来,在绝大部分情况下,我们的语料一直是不足的,NLP里面有一个特色,我把这种现象成为“尖峰厚尾性”,概念取自于时间序列领域,但在NLP里是适用的,一个NLP的语言模型要尽可能覆盖所有情况,长尾的场景次数虽少但不至于不出现,甚至相对频次会更高,而高频的内容会更少但是频次会更高,因此整个词频的分布就应该是高频词汇的词频会更高但是这样的词汇会更少,低频的词汇词频没有那么低,和传统地正态分布相比,就是尖峰厚尾了。

说的有一些玄乎,直接举个例子吧。我们常见的句子都是ABC,ADC之类的组合,但是有没有AEC的可能?再具体点,我想吃西瓜,我想吃苹果,我想吃XX,这里有很多可能,我们训练样本有限,不能遍历每一种情况,假设我们的样本里没有“我想是叉烧”,那条件概率就会出现0的情况,那整个句子就不可能出现了吗?答案当然是否定的,因此,这里就要用到——平滑。

我们仍然以2-gram为例来分析,先把条件概率拆分,看看没平滑参数估计是怎么做的:

其实就是简单的计数,然后我们就要在这里去做平滑,其实就是减少“0”的出现。

最简单的一种平滑就是加性平滑,也被称为拉普拉斯平滑:

一般地,取,表示词典库的大小。

kenlm——语言模型的实现

说完了基本的原理,我们就要看看怎么去实现。这块实现其实已经有非常成熟的包来做了,可惜不是python,而是一个c++的,就是kenlm,这个虽然有Python的API接口,但是接口里没有训练的,训练只能用c++打成的二进制文件才可用。

linux环境下把项目拉下来:https://github.com/kpu/kenlm,按照教程进行编译(cmake),当然过程中需要配置对应的包(boost、zlib等),

编译完成后,还需要对语料进行处理,这个训练过程本身不涉及具体任务,因此只需要语料即可,但对于中文,需要注意下面几个细节:

  • 标点符号去掉。

  • 繁简体转化、大小写转化、

  • 分词或者单字都需要用空格分开。

然后就可以开始训练了。

bin/lmplz -o 3 --verbose header --text train_corpus.txt --arpa lm_model_20200816.arpa

训练以后,如果是python,其实可以转化为二进制,这样加载更快:

bin/build_binary -s lm_model_20200816.arpa lm_model_20200816.bin

这样就可以python执行了:

import kenlm
model = kenlm.Model('lm_model_20200816.arpa')
print(model.score('我 有 一 只 小 毛 驴 我 从 来 也 不 骑'))

有了语言模型,我们是可以评判句子出现的概率,从而可以用在判全、纠错等方面,虽然后续语言模型在持续发展,但是这种比较基础的细节的领域,n-gram语言模型还是有一定的优势。

指的注意的一个细节是,kenlm中使用的平滑方法,是Modified Kneser-ney smoothing方法(Heafield K, Pouzyrevsky I, Clark J H, et al. Scalable Modified Kneser-Ney Language Model Estimation[C]// Meeting of the Association for Computational Linguistics. 2013:690-696.),简单聊一聊他的思路,具体可以看看这篇论文:

  • 对于搭配比较固定的词,可能他的词频比较高但实际上只有一两个特定搭配,如new york中的york,这种应该给他的1-gram一个比较低的分数。

  • 将超高频的词的一些计数给到低频词,毕竟高频词其实已经有比较好的估计了。

  • 预测阶段的回退,衡量词汇后面接不同词的能力,针对没有出现的情况,可以将高阶的n-gram降级为低阶的n-gram。

小结

n-gram语言模型本身作为始祖级别的存在,已经被后浪打翻,但是他对词汇的出现的理解,还是非常具有参考意义,通知,在一些特定任务上,还是可以作为一个比较强的baseline,因此,仍然非常推荐大家学习和理解。

参考文献

语言模型的原理:

  • 统计自然语言处理。NLP经典书籍,没什么好说的。

  • https://blog.csdn.net/a635661820/article/details/43906731

kenlm的安装和使用,自己踩的坑比较多,根据这些基本能把坑都填了。

  • https://github.com/kpu/kenlm

  • https://www.cnblogs.com/zidiancao/p/6067147.html

  • https://blog.csdn.net/Nicholas_Wong/article/details/80013547

  • https://blog.csdn.net/benbenls/article/details/102898960

  • https://blog.csdn.net/bonjourdeutsch/article/details/107767307

有关kenlm下的原理讨论:

  • Heafield K, Pouzyrevsky I, Clark J H, et al. Scalable Modified Kneser-Ney Language Model Estimation[C]// Meeting of the Association for Computational Linguistics. 2013:690-696.

  • https://blog.csdn.net/visionfans/article/details/50131397

  • https://blog.csdn.net/a635661820/article/details/43906731

  • https://blog.csdn.net/xueyuxueyuxueyu/article/details/104207249

  • https://blog.csdn.net/asrgreek/article/details/81979194

NLP.TM[36] | NLP之源:n-gram语言模型相关推荐

  1. NLP.TM[38] | 对话系统经典:检索式对话

    [NLP.TM] 本人有关自然语言处理和文本挖掘方面的学习和笔记,欢迎大家关注. 往期回顾 NLP.TM[32] | 浅谈文本增强技术 NLP.TM[33] | 纠错:pycorrector的错误检测 ...

  2. 【NLP】 理解NLP中网红特征抽取器Tranformer

    本篇介绍目前NLP领域的"网红"特征抽取器Transformer.首先,作为引子,引入 Transformer是什么的问题:接着,详细介绍了Transformer的结构和其内部的机 ...

  3. 北京招聘 | 澜舟科技招聘NLP工程师、NLP研究员、产品项目经理

    合适的工作难找?最新的招聘信息也不知道? AI 求职为大家精选人工智能领域最新鲜的招聘信息,助你先人一步投递,快人一步入职! 澜舟科技 澜舟科技是一家认知智能公司,针对商业场景数字化转型.以自然语言处 ...

  4. NLP:《NLP Year in Review 2019NLP_2019_Highlights》2019年自然语言处理领域重要进展回顾及其解读

    NLP:<NLP Year in Review 2019&NLP_2019_Highlights>2019年自然语言处理领域重要进展回顾及其解读 导读:2019年是自然语言处理(N ...

  5. NLP.TM | GloVe模型及其Python实现

    在进行自然语言处理中,需要对文章的中的语义进行分析,于是迫切需要一些模型去描述词汇的含义,很多人可能都知道word2vector算法,诚然,word2vector是一个非常优秀的算法,并且被广泛运用, ...

  6. huggingface源码地址 各种NLP处理的BERT模型源码

    huggingface源码地址 https://github.com/huggingface/transformers

  7. 【NLP】NLP实战篇之bert源码阅读(run_classifier)

    本文主要会阅读bert源码 (https://github.com/google-research/bert )中run_classifier.py文件,已完成modeling.py.optimiza ...

  8. 【NLP】Words Normalization+PorterStemmer源码解析

    Words Normalization 目录 Words Normalization Stemming(词干提取) Lemmatisation(词形还原) PorterStemmer源码解析 1.de ...

  9. cs224n上完后会会获得证书吗_斯坦福NLP组-CS224n: NLP与深度学习-2019春全套资料分享...

    斯坦福自然语言处理小组2019年的最新课程<CS224n: NLP与深度学习>春季课程已经全部结束了,课程内容囊括了深度学习在各项NLP任务中应用的最新技术,非常值得一看.本文整理本期课程 ...

最新文章

  1. 实验一 查看CPU和内存 用机器指令和汇编指令编程
  2. IDEA工具实现反编译操作
  3. MAX13085E/MAX485 _中文翻译
  4. 您的浏览器由所属组织管理_FB频繁被封,关于多账号环境管理的知识你掌握了吗?...
  5. centos7设置输入密码三次错误锁定账号
  6. 因为计算机丢失user32.dll,user32dll丢失程序打不开|Win7系统开机提示Uxtheme.dll丢失如何解决?...
  7. SUMO交通流仿真实战
  8. 两种实现视频倍速播放的方法(视频播放器倍速1.5x/2x)
  9. 易语言源码翻译c,易语言编写翻译小工具源码
  10. 樱花树下的欢笑---2012春西安交大樱花节
  11. msl3等级烘烤时间_MSL 湿敏等级对应表
  12. 仙人掌真的会防辐射吗
  13. oracle unable to open file,ORA-27041:unable to open file
  14. MTP和MPO两种光纤有什么区别呢?
  15. Thinkpad 笔记本电源状态指示灯
  16. SQL AUTO INCREMENT
  17. find与grep组合命令
  18. day1 计算机基础以及python基础
  19. 全球最大空港北京大兴机场采用华为智能光伏
  20. 单机率公式计算机车日产量,货运机车平均日产量

热门文章

  1. Python处理高光谱数据#1 图像显示
  2. 司普沃浅谈西瓜软腐病防治技术与管理
  3. Hive 常用日期处理-昨天、本月、上月同期、去年同期、月初、月末等
  4. springboot安全之整合spring security
  5. uniapp微信小程序支付券或商家券插件
  6. [机器视觉]gocv图像水平投影和垂直投影
  7. Windows利用bat程序打开指定网址
  8. Drat语法概览(一)
  9. Nginx 学习日记2
  10. 递归函数与内置函数和函数式编程