前言

《NPL基于词典分词(一)》中我们实现了块儿不准的词典分词,词典分词无法消歧。给定两种分词结果“商品 和服 务”以及“商品 和 服务”,词典分词不知道哪种更加合理。但生为人类的我们知道“商品 和 服务”更加合理,只因为我们从小到大接触的都是第二种分词,出现的次数多,所以我们判定第二种是正确地选择。这就是利用了统计自然语言处理

语言模型

模型指的是对事物的数学抽象,那么语言模型指的就是对语言现象的数学抽象。准确的讲,给定一个句子 w,语言模型就是计算句子的出现概率 p(w) 的模型。假设构建如下的小型语料库(也可以是人民日报或者其它上面文章):

商品 和 服务
商品 和服 物美价廉
服务 和 货币

每个句子出现的概率p(w)都是 1/3,这就是语言模型。然而 p(w) 的计算非常难:句子数量无穷无尽,无法枚举。即便是大型语料库,也只能“枚举”有限的数百万个句子。实际遇到的句子大部分都在语料库之外,意味着它们的概率都被当作0,这种现象被称为数据稀疏

然而随着句子长度的增大,语言模型会遇到如下两个问题。

  • 数据稀疏,指的是长度越大的句子越难出现,可能统计不到频次,导致
    p ( w t ) = p ( w t ∣ w 0 w 1 . . . w t − 1 ) = 0 p(w_t) = p(w_t|w_0w_1...w_{t-1})=0 p(wt​)=p(wt​∣w0​w1​...wt−1​)=0比如 p(商品 和 货币)=0。
  • 计算代价大,k 越大,需要存储的 p 就越多,即便用上字典树索引,依然代价不菲。

马尔可夫链与二元语法

为了解决以上两个问题,需要使用马尔可夫假设来简化语言模型,给定时间线上有一串事件顺序发生,假设每个事件的发生概率只取决于前一个事件,那么这串事件构成的因果链被称作马尔可夫链
在语言模型中,第 t 个事件指的是 Wt 作为第 t 个单词出现。也就是说,每个单词出现的概率只取决于前一个单词:
p ( w t ) = p ( w t ∣ w 0 w 1 . . . w t − 1 ) = p ( w t ∣ w t − 1 ) p(w_t) = p(w_t|w_0w_1...w_{t-1})=p(w_t|w_{t-1}) p(wt​)=p(wt​∣w0​w1​...wt−1​)=p(wt​∣wt−1​)
基于此假设,式子一下子变短了不少,此时的语言模型称为二元语法模型:



p ( 商 品 和 服 务 ) = p ( 商 品 ∣ B O S ) p ( 和 ∣ 商 品 ) p ( 服 务 ∣ 和 ) p ( E O S ∣ 服 务 ) = 2 / 3 ∗ 1 / 2 ∗ 1 / 2 ∗ 1 / 2 = 1 / 12 p(商品和服务) = p(商品|BOS)p(和|商品)p(服务|和)p(EOS|服务)= 2/3 * 1/2 *1/2 * 1/2 = 1/12 p(商品和服务)=p(商品∣BOS)p(和∣商品)p(服务∣和)p(EOS∣服务)=2/3∗1/2∗1/2∗1/2=1/12

p ( 商 品 和 货 币 ) = p ( 商 品 ∣ B O S ) p ( 和 ∣ 商 品 ) p ( 货 币 ∣ 和 ) p ( E O S ∣ 货 币 ) = 2 / 3 ∗ 1 / 2 ∗ 1 / 2 ∗ 1 / 1 = 1 / 6 p(商品 和 货币) = p(商品|BOS)p(和|商品)p(货币|和)p(EOS|货币)= 2/3 * 1/2 *1/2 * 1/1 = 1/6 p(商品和货币)=p(商品∣BOS)p(和∣商品)p(货币∣和)p(EOS∣货币)=2/3∗1/2∗1/2∗1/1=1/6
不在语料库中的句子,因此也终于不是0了。

n元语法

利用类似的思路,可以得到n元语法的定义:每个单词的概率仅取决于该单词之前的 n 个单词:
p ( w ) = ∏ t = 1 k + n − 1 p ( w t ∣ w t − n + 1 . . . w t − 1 ) p(w)=\prod_{t=1}^{k+n-1}p(w_t|w_{t-n +1}...w_{t-1}) p(w)=t=1∏k+n−1​p(wt​∣wt−n+1​...wt−1​)
特别地,当 n=1 时的 n 元语法称为一元语法 ( unigram);当 n=3 时的 n 元语法称为三元语法(tigam); n≥4时数据稀疏和计算代价又变得显著起来,实际工程中几乎不使用。

数据稀疏与平滑策略

对于 n 元语法模型,n 越大,数据稀疏问题越严峻。比如上述语料库中“商品 货币”的频次就为0。一个自然而然的解决方案就是利用低阶 n 元语法平滑高阶 n 元语法,所谓平滑,就是字面上的意思:使 n 元语法频次的折线平滑为曲线。最简单的一种是线性插值法

y − y 0 y 1 − y 0 = α = x − x 0 x 1 − x 0 {y-y_0 \above{1pt} y_1- y_0} = \alpha = {x-x_0 \above{1pt} x_1- x_0} y1​−y0​y−y0​​=α=x1​−x0​x−x0​​
y = α y 1 + ( 1 − α ) y 0 y=\alpha y_1 + (1-\alpha)y_0 y=αy1​+(1−α)y0​
定义新的二元式语法为
p ( w t ∣ w t − 1 ) = α P m l ( w t ∣ w t − 1 ) + ( 1 − α ) p ( w t ) p(w_t|w_{t-1}) = \alpha P_{ml}(w_t|w_{t-1}) + (1-\alpha)p(w_t) p(wt​∣wt−1​)=αPml​(wt​∣wt−1​)+(1−α)p(wt​)

二元式中, y0表示第一位p(w_t|BOS) = p(w_t); y1表示最后一位用Pml表示

定义新的一元式语法为
p ( w t ) = α P m l ( w t ) + ( 1 − α ) 1 N p(w_t) = \alpha P_{ml}(w_t) + (1-\alpha) \cfrac1N p(wt​)=αPml​(wt​)+(1−α)N1​

实战训练

训练指的是统计二元语法频次以及一元语法频次,有了频次,通过极大似然估计以及平滑策略,我们就可以估计任意句子的概率分布,即得到了语言模型。这里以二元语法为例:

  1. 加载简单语料库文件(语料标注)

商品 和 服务
商品 和服 物美价廉
服务 和 货币

  1. 根据语料库进行词频统计(训练模型

和@服务 1
和@货币 1
和服@物美价廉 1
商品@和 1
商品@和服 1
始##始@商品 2
始##始@服务 1
服务@和 1
服务@末##末 1
物美价廉@末##末 1
货币@末##末 1

  1. 对词频文件生成词网,以“商品 和 服务”为例子(预测分词结果)

0:[ ]
1:[商品]
2:[]
3:[和,和服]
4:[服务]
5:[务]
6:[ ]

其中收尾(行0和行6)分别对应起始和末尾,对应词图

  1. 节点间的距离计算 (预测分词结果)
    在线性插值法基础加上 极大似然估计(MLE)拉普拉斯平滑得到
    平滑因子(u和y) 属于(0,1)区间,再考虑到多个(0,1]之间的浮点数连续相乘之后会发生下溢出(为0),工程经常对概率取负对数

    根据hanlp 提供的MathUtility.calculateWeight数学工具类,算出weight

to: 1, from: 0, weight:04.60, word:始##始@商品
to: 2, from: 1, weight:00.80, word:商品@和
to: 3, from: 1, weight:00.80, word:商品@和服
to: 4, from: 2, weight:00.80, word:和@服务
to: 5, from: 3, weight:00.11, word:和服@务
to: 6, from: 4, weight:00.80, word:服务@末##末
to: 6, from: 5, weight:08.88, word:务@末##末

  1. 根据维特比算法,算出最短路径(预测分词结果)

HanLP分词与用户词典的集成

因为语料库的有限性,上述的词网中根本不可能出现OOV(词库以外的词),因此在处理OOV, 统计模型的消歧能力 + 用户自定义词典的方式。HanLP支持 2 档用户词典优先级:

  • 低优先级:分词器首先在不考虑用户词典的情况下由统计模型预测分词结果,最后将该结果按照用户词典合并。默认低优先级。
  • 高优先级:分词器优先考虑用户词典,但具体实现由分词器子类自行决定。采成干预词网生成的方式,通过用户提供的一元语法词频 再用程序“伪造”二元词频。

二元语法与词典分词比较

按照NLP任务的一般流程,我们已经完成了语料标注和模型训练,现在来比较一下二元语法和词典分词的评测:

算法 P R F1 R(oov) R(IV)
最长匹配 89.41 94.64 91.95 2.58 97.14
二元语法 92.38 96.70 94.49 2.58 99.26

相较于词典分词,二元语法在精确度、召回率及IV召回率上全面胜出,最终F1值提高了 2.5%,成绩的提高主要受惠于消歧能力的提高。然而 OOV 召回依然是 n 元语法模型的硬伤,我们需要更强大的统计模型。

主要参考

《线性插值法》
《理解极大似然估计(MLE)》
《理解朴素贝叶斯分类的拉普拉斯平滑》
《二元语法与中文分词》

NPL基于词典分词(二)相关推荐

  1. NPL基于词典分词(四)

    前言 <NPL基于词典分词(三)>介绍第一个基于序列标注的中文分词器-隐马尔可夫模型,然而效果并不理想.事实上,隐马尔可夫模型假设人们说的话仅仅取决于一个隐藏的{B.M,E,S序列,这个假 ...

  2. NPL基于词典分词(一)

    前言 自然数据处理里很重要的一环节就是中文分词,它指的是将一段文本拆分为一系列单词的过程,这些单词顺序拼接后等于原文本.而中文分词算法大致分为基于词典规则与基于机器学习这两大派. 什么是词 在基于词典 ...

  3. 基于词典的前缀扫描中文分词

    说明 中文分词是很多文本分析的基础.最近一个项目,输入一个地址,需要识别出地址中包含的省市区街道等单词.与以往的分词技术不同.jieba/hanlp等常用的分词技术,除了基于词典,还有基于隐马尔科夫/ ...

  4. 基于词典的逆向最大匹配中文分词算法,更好实现中英文数字混合分词

    基于词典的逆向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤.实际分词效果比正向分词效果好 publicclass RMM ...

  5. NLP-基础任务-中文分词算法(1)-基于词典: 机械分词(词典字符串匹配):前向最大匹配、后向最大匹配、双向最大匹配【OOV:基于现有词典,不能进行新词发现处理】

    分词与NLP关系:分词是中文自然语言处理的基础,没有中文分词,我们对语言很难量化,进而很能运用数学的知识去解决问题.对于拉丁语系是不需要分词的. 拉丁语系与亚系语言区别 拉丁语言系不需要分词,因为他们 ...

  6. NPL系列之分词和分词框架(二)

    如果要从事NPL的相关技术工作,那么最基础的工作就是分词工作,这个也是所有技术的第一步,当然 这里讨论的中文的分词,因为英文的分词技术是比较单一,基本上按照空格进行标准分词就可以了,但是中文就比较复杂 ...

  7. 基于词典规则的中文分词(C语言实现)

    0 引 言 自然语言处理(Natural Language Processing, NLP)是以语言为对象,利用计算机技术来分析.理解和处理自然语言的一门学科,即把计算机作为语言研究的强大工具,在计算 ...

  8. 基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词

    基于词典的正向最大匹配中文分词算法,能实现中英文数字混合分词.比如能分出这样的词:bb霜.3室.乐phone.touch4.mp3.T恤 第一次写中文分词程序,欢迎拍砖. publicclass MM ...

  9. 中文分词算法—— 基于词典的方法

    1.基于词典的方法(字符串匹配,机械分词方法) 定义:按照一定策略将待分析的汉字串与一个"大机器词典"中的词条进行匹配,若在词典中找到某个字符串,则匹配成功. 按照扫描方向的不同: ...

最新文章

  1. Altium Designer关闭板观察器,放大镜
  2. 自己实现的字符串处理函数
  3. LeetCode 637 二叉树的层平均值-简单
  4. 【渝粤题库】国家开放大学2021春2511幼儿园课程论题目
  5. 非printf形式的十六进制和二进制打印(雅虎面试题)
  6. 《工业元宇宙白皮书 2022年 》(附免费pdf下载地址)
  7. 《算法》第四版中文——学习资料
  8. wp文件转shp_【转载】将E00文件转换成shp文件
  9. 中国神话--学术性研究
  10. 虚拟机超线程性能分析深入浅出
  11. Zookeeper-Paxos-屁民的故事-内含视频讲解
  12. Assignment写作选题及诀窍怎么分析?
  13. C# Windows系统音量调节Demo源码
  14. mailgun php 邮件发送 实例
  15. Elasticsearch 7.2.0 搜索时报 all shards failed 错误
  16. RPGMAKER游戏引擎基于JavaScript的插件制作(三)——重写方法预备知识教学
  17. github国内镜像
  18. LLVM 之父 Chris Lattner:模块化设计决定 AI 前途,不服来辩
  19. python风控建模项目_像潘叔叔那样用半年时间学Python,有哪些书值得看?
  20. 让五个数都不相等的程序c语言,C语言程序设计课件第05讲.ppt

热门文章

  1. 常见tcp/ip网络攻击方式分析
  2. 阿里云服务器用SMTP的25号端口发送邮件问题
  3. D* Lite 介绍
  4. Java微信公众号开发之使用拦截器获取粉丝openID
  5. 常用计算机视觉库,各种常用计算机视觉库
  6. WmiPrvSE.exe是什么进程?WMI Provider Host占用很高CPU怎么办?
  7. python计算银行利息
  8. FFN -> GLU -> GAU
  9. 基于Gate Mechanism的激活单元GTU、GLU
  10. MySQL六十六问,两万字+五十图详解含(答案解析)