常用分词算法总结(字典、统计、神经网络)

本文转载自公众号夕小瑶的卖萌屋,专业带逛互联网算法圈的神操作

-----》我是传送门

关注后,回复以下口令:

回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读)

回复【入群】:加入卖萌屋深度学习/NLP/CV/搜广推等方向的技术交流与内推社群(大V、顶会审稿人云集)

回复【0511】:领取算法岗面试手册(刷offer神器)

回复【0424】:领取刷论文神器(挖掘每日、每月必刷重磅论文)

分词(word tokenization),也叫切词,即通过某种方式将句子中的各个词语识别并分离开来,使得文本从“字序列”的表示升级为“词序列”表示。分词技术不仅仅适用于中文,对于英文、日文、韩文等语言也同样适用。

虽然英文中有天然的单词分隔符(空格),但是常有单词与其他标点黏滞的情况,比如"Hey, how are you."中的"Hey"和"you"是需要与身后的标点分隔开的

目录

  • 为什么需要分词?
  • 能不能不分词?
  • 中文分词难在哪?
  • 从古至今的分词算法:词典到预训练
  • 从中到外的分词工具

为什么需要分词?

对于中文来说,如果不进行分词,那么神经网络将直接基于原始的汉字序列进行处理和学习。然而我们知道一个字在不同的词语中可能含义迥然不同,比如“哈哈”与“哈士奇”中“哈”的含义相去甚远,如果模型在训练阶段没见过“哈士奇”,那么预测的时候就有可能以为“哈士奇”所在的句子在表达欢快的气氛了╮( ̄▽ ̄"")╭

显然,要解决上述问题的话,分词就是了,分词之后,最小的输入单位就不再是字了,而是词,由于“哈哈”与“哈士奇”是两个不同的词,自然就不会有前面这个问题啦。因此可以认为,分词缓解了“一字多义”的问题

除此之外,从特征(feature)与NLP任务的角度来说,字相比词来说,是更原始和低级的特征,往往与任务目标的关联比较小;而到了词级别后,往往与任务目标能发生很强的关联。比如对于情感分类任务,“我今天走狗屎运了”这句中的每个字都跟正向情感关系不大,甚至“狗”这个字还往往跟负面情感密切相关,但是“狗屎运”这个词却表达了“幸运”、“开心”、“惊喜”的正向情感,因此,分词可以看作是给模型提供了更high-level、更直接的feature,丢给模型后自然容易获得更佳的表现。

能不能不分词?

答案是,当然可以。从前面分词的目的可以看出,只要模型本身能够学习到字的多义性,并且自己学到由字组词的规律,那么就相当于隐含的内置了一个分词器在模型内部,这时候这个内置的分词器是与解决目标任务的网络部分一起“端到端训练”的,因此甚至可能获得更佳的性能。

然而,从上面这段的描述也能看出,要满足这个条件,是很难得的。这需要训练语料非常丰富,且模型足够大(可以有额外容量来内置一个隐含的分词模型),才有可能获得比“分词器+词级模型“更好的表现。这也是为什么BERT等大型预训练模型往往是字级别的,完全不需要使用分词器。

此外,分词也并不是百利而无一害的,一旦分词器的精度不够高,或者语料本身就噪声很大(错字多、句式杂乱、各种不规范用语),这时强行分词反而容易使得模型更难学习。比如模型终于学会了“哈士奇”这个词,却有人把哈士奇打成了“蛤士奇”,结果分词器没认出来,把它分成了“蛤”、“士”、“奇”这三个字,这样我们这个已经训练好的“word level模型”就看不到“哈士奇”了(毕竟模型训练的时候,“哈士奇”是基本单位)。

中文分词难在哪?

1 歧义问题

首先,前面提到分词可以缓解“一字多义”的问题,但是分词本身又会面临“切分歧义”的问题。例如,切分书名《无线电法国别研究》

v2-a5d8d3c1924a631d6bae5793b9f27338_b.jpg

虽然切分成《无线电/法国/别/研究》看起来没毛病,但是考虑到这是个书名,显然正解《无线电法/国别/研究》对分词器来说太南了(。 ́︿ ̀。)而如果不告诉你这是一个书名,显然两种切分方式看起来都没毛病。

2 未登录词问题

此外,中文词典也是与时俱进的,例如“青青草原”、“累觉不爱”等网络词在10年前是没有的,今天训练的分词器也一定会在不久的将来遇到不认识的词(即“未登录词”,out-of-vocabulary word),那个时候分词器很容易因为“落伍”而出现切分错误。

3 规范问题

最后,分词时的切分边界也一直没有一个确定的规范。尽管在 1992 年国家颁布了《信息处理用现代词汉语分词规范》,但是这种规范很容易受主观因素影响,在实际场景中也难免遇到有所不及的问题。

算法篇

1 基于词典

对于中文分词问题,最简单的算法就是基于词典直接进行greedy匹配

比如,我们可以直接从句子开头的第一个字开始查字典,找出字典中以该字开头的最长的单词,然后就得到了第一个切分好的词。比如这句“夕小瑶正在讲NLP”,查字典发现“夕小瑶”是最长的词了,于是得到

夕小瑶/ 正在讲NLP

然后从下一个词的开头开始继续匹配字典,发现“正在”就是最长的词了,于是

夕小瑶/正在/ 讲NLP

依此类推,最终得到

夕小瑶/正在/讲/NLP

这种简单的算法即为前向最大匹配法(FMM)

虽然做法很朴素,但是名字听起来还有点高端╮(╯▽╰)╭

不过,由于中文句子本身具有重要信息后置的特点,从后往前匹配的分词正确率往往要高于从前往后,于是就有了反向进行的“后向最大匹配法(BMM)”。当然了,无论是FMM还是BMM,都一定存在不少切分错误,因此一种考虑更周到的方法是“双向最大匹配”

双向最大匹配算法是指对待切分句子分别使用FMM和RMM进行分词,然后对切分结果不重合的歧义句进行进一步的处理。通常可对两种方法得到的词汇数目进行比较,根据数目的相同与否采取相应的措施,以此来降低歧义句的分词错误率.

2 基于统计

2.1 基于语言模型

基于词典的方法虽然简单,但是明显能看出来太!不!智!能!了!稍微复杂一些的句子,例如“没关系,除夕小瑶在家做饭。”,这时候如果使用后向最大匹配法,就会切分成“没关系/,/除/夕小瑶/在家/做饭/。”,这明显错的很不可原谅。

犯这种错误的根本原因在于,基于词典的方法在切分时是没有考虑词语所在的上下文的,没有从全局出发找最优解。其实上面这个句子无非就是在纠结两种切分方式:

a. 没关系/,/除/夕小瑶/在家/做饭/。
b. 没关系/,/除夕/小瑶/在家/做饭/。

我们日常说话中很少会有人说出“没关系/,/除/xxxx/做饭/。”这种句子,而第二个句子出现的频率则会非常高,比如里面的“小瑶”可以替换成“我”、“老王”等。显然给定一个句子,各种切分组合是数量有限的,如果有一个东西可以评估出任何一个组合的存在合理性的分值,那么不就找到了最佳的分词组合嘛!

所以,这种方法的本质就是在各种切词组合中找出那个最合理的组合,这个过程就可以看作在切分词图中找出一条概率最大的路径

v2-cc1049256def5b8d1cbcaa9ea3b78c3f_b.jpg

而这个可以给词序列存在合理性打分的东西就叫做“语言模型”(language model)。这种利用语言模型来评估各种切分组合的方法是不是就显得智能多啦╮(╯▽╰)╭给定一个句子分词后得到的单词序列{w1,w2...wm},语言模型就能计算出这个句子(或者说词序列)存在的可能性:

这个表达式可通过链式法则进行展开:

v2-8d5813bc2ba423436bb0dda718e309b0_b.png

显然,当m取值稍微一大,乘法链的后面几项会变得非常难计算(估计出这几项的概率需要依赖极其庞大的语料才能保证估计误差可接受)。计算困难怎么办?当然是用合理的假设来简化计算,比如我们可以假设当前位置取什么词仅取决于相邻的前面n个位置,即

v2-be3d1226dffab7d59f39c9fbeb2ef2ab_b.png

这种简化的语言模型就称为n-gram语言模型。这样乘法链中的每个乘子都可以在已经完成人工标注的分词语料中计算得到啦。当然了,在实际计算中可能还会引入一些平滑技巧,来弥补分词语料规模有限导致的估计误差,这里就不展开讲啦。

2.2 基于统计机器学习

NLP是一门跟机器学习强绑定的学科,分词问题自然也不例外。中文分词同样可以建模成一个“序列标注”问题,即一个考虑上下文的字分类问题。因此可以先通过带标签的分词语料来训练一个序列标注模型,再用这个模型对无标签的语料进行分词。

样本标签

一般用{B:begin, M:middle, E:end, S:single}这4个类别来描述一个分词样本中每个字所属的类别。它们代表的是该字在词语中的位置。其中,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词。

一个样本如下所示:

人/b 们/e 常/s 说/s 生/b 活/e 是/s 一/s 部/s 教/b 科/m 书/e

之后我们就可以直接套用统计机器学习模型来训练出一个分词器啦。统计序列标注模型的代表就是生成式模型的代表——隐马尔可夫模型(HMM),和判别式模型的代表——(线性链)条件随机场(CRF)。已经对这两个模型很熟悉的小伙伴可以跳过。

隐马尔可夫模型(HMM)

HMM模型的详细介绍见

《如果你跟夕小瑶恋爱了... (上)》 / 《下》

在了解了HMM模型的基本概念之后,我们来看看HMM模型是如何进行分词的吧~基本思路:将分词问题转换为给每个位置的字进行分类的问题,即序列标注问题。其中,类别有4个(前面讲到的B、M、E、S)。给所有的位置分类完成后,便可以根据类别序列得到分词结果啦。

举个栗子!

我们的输入是一个句子:

        小Q硕士毕业于中国科学院

通过算法,我们成功预测出各个字位对应的分词标签:

        BEBEBMEBEBME

根据这个状态序列我们可以进行切词:

        BE/BE/BME/BE/BME

所以切词结果如下:

        小Q/硕士/毕业于/中国/科学院

那么问题又来了,假如一个完美的HMM分词模型给你了,那么如何用这个模型对输入的字序列进行序列标注呢?首先看下HMM模型中的两个核心概念:观测序列状态序列。

观测序列就是我可以直接看到的序列,也就是“小Q硕士毕业于中国科学院”这个字序列,而状态序列则是不能通过肉眼直接观察到的内在序列,也就是上面这句话所对应的标注结果“BEBEBMEBEBME”,而我们的HMM模型,就可以帮助我们完成从观测序列->状态序列的华丽变身!

条件随机场 (CRF)

HMM隐马模型有一个非常大的缺点,就是其存在输出独立性假设,导致其不能将上下文纳入特征设计,大大限制了特征的可用范围。CRF则没有这个限制,它不对单独的节点进行归一化,而是对所有特征进行全局归一化,进而全局的最优值。因此,在分词问题上,显然作为判别式模型的CRF相比HMM更具优越性。

关于CRF的详细介绍可以看小夕之前写的这篇推文:

《逻辑回归到条件随机场》这里再来简单回顾一下。

HMM模型围绕的是一个关于序列X和Y的联合概率分布𝑃(𝑋,𝑌),而条件随机场则围绕条件概率分布模型𝑃(𝑌|𝑋)展开。

v2-ba35914d34ba26b4c4409e9f560dfe63_b.jpg

从图中我们可以看出模型之间的递进关系,CRF是一个概率无向图模型,它和HMM很类似,但是CRF没有隐变量,并且是一个判别模型。使用CRF计算序列中的每个字位𝑥𝑖 对应的分词标签𝑦𝑖 时,都可以看做是一次考虑上下文依赖关系的分类。

CRF通过定义条件概率P(YX) 来描述模型。

v2-12901336a61c2a8356de0bbf7537b1f3_b.jpg

Z(x)就是概率图模型中的配分函数,目的就是提供一个归一化因子,将各个类别的值求和,为计算每个类别的概率提供一个分母,对这个思想还不清楚的小伙伴请移步本节开头的推荐文章哦,这里不再赘述其背后的数学思想了。K为设计的特征(函数)的数量,w_k为每个特征函数待学习的权重。

而这里的f_k就是能够帮助CRF完成分词的特征啦,确切的说是特征函数。特征函数可以看作一个比较复杂的特征,特征值取决于多个输入变量的取值。当然啦,这里只给出了简化形式,特征函数又分为转移特征和状态特征,其中转移特征会考虑历史时刻的输出,而状态特征仅考虑当前时刻。

举个特征函数的栗子:

f(y_1, x_1, x) = {1 if y_1 == 'I' and x_1 == '小' and x=='瑶'; else 0}

这里即表示如果当前位置的字(观测值)是‘瑶’,且上个位置的字是‘小’,且上个位置的预测标签是类别‘I’,那么该特征函数会输出1,也就是说该特征的特征值为1,其余情况均为0。显然这个特征一旦取值为1,则是一个很强的特征来指示‘瑶’这个字的位置的预测标签为‘E’。

与HMM一样,训练CRF中的参数依然是通过万能的极大似然估计,具体算法形式如梯度下降法、IIS、拟牛顿法等。训练好CRF分词模型后,跟HMM一样, 可以通过Viterbi算法来进行全局的推理,从而得到最优的分词序列。这里同样不展开讲啦。总结一下,与HMM比,使用CRF进行分词有以下优点:

  • CRF可以使用输入文本的全局特征,而HMM只能看到输入文本在当前位置的局部特征
  • CRF是判别式模型,直接对序列标注建模;HMM则引入了不必要的先验信息

3 基于神经网络


众所周知,深度学习已经成功占领NLP,席卷了NLP中的分类、序列标注和生成问题。如前所述,分词也可以建模为序列标注问题,那么擅长处理序列数据的LSTM(长短时记忆网络)和最近超级火的预训练模型同样可以用于中文分词。

3.1 基于(Bi-)LSTM

对LSTM模型还不熟悉的小伙伴见小夕以前写的这篇的《step-by-step to LSTM》,本文对lstm的基本理论不再赘述啦。

如前面语言模型一节中所述,字的上下文信息对于排解切分歧义来说非常重要,能考虑的上下文越长,自然排解歧义的能力就越强。而前面的n-gram语言模型也只能做到考虑一定距离的上下文,那么有没有在理论上能考虑无限长上下文距离的分词模型呢?答案就是基于LSTM来做。当然啦,LSTM是有方向的,为了让每个位置的字分类时既能考虑全部历史信息(左边的所有的字),又能考虑全部未来信息(右边所有的字),我们可以使用双向LSTM(Bi-LSTM)来充当序列标注的骨架模型,如图

v2-870d31eae4b629a3d9ce92719ed9fa90_b.jpg

LSTM完成对每个位置的上下文信息的编码后,最终通过softmax分类层完成对每个位置的分类,从而跟HMM和CRF一样完成了基于序列标注的中文分词。

3.2 基于预训练模型+知识蒸馏

最近的一年多的时间里,BERT、ERNIE、XLNet等大型预训练席卷了NLP的绝大部分领域,在分词问题上也有显著的优越性。

v2-34a39e7e1d7a13966784668340ff2b5b_b.jpg

然而,众所周知,预训练模型太大了,过于消耗计算资源,如果要对海量的文本进行分词,哪怕用上8卡的32G Tesla V100都会显得力不从心,因此一种解决方案就是,将预训练模型中的分词知识通过知识蒸馏(Knowledge Distillation)来迁移到小模型(比如LSTM、GRU)上。近期Jieba分词器中就上线了这么一个用这种方法得到的先进分词模型(其实是个通用的词法分析模型),感兴趣的小伙伴可以自行了解一下。预训练模型和知识蒸馏的资料很多了,这里就不赘述啦。

本文转载自公众号夕小瑶的卖萌屋,专业带逛互联网算法圈的神操作

-----》我是传送门

关注后,回复以下口令:

回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读)

回复【入群】:加入卖萌屋深度学习/NLP/CV/搜广推等方向的技术交流与内推社群(大V、顶会审稿人云集)

回复【0511】:领取算法岗面试手册(刷offer神器)

回复【0424】:领取刷论文神器(挖掘每日、每月必刷重磅论文)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里架构师进阶23期精讲:Redis、Kafka、Dubbo、Docker等

史上最全Redis面试49题(含答案):哨兵复制事务集群持久化等 高并发架构系列:Redis缓存和MySQL数据一致性方案详解 Redis的高可用详解:Redis哨兵、复制、集群的设计原理,以及区别 高并发架构系列:Redis为…

论文浅尝 | 变分知识图谱推理:在KG中引入变分推理框架

本文转载自公众号:机器之心。推理知识图谱中缺失的连接已经吸引了研究界的广泛关注。在本论文中,加州大学圣塔芭芭拉分校的王威廉等研究者在知识图谱推理中引入了变分推理框架,并将路径搜索和路径推理紧密结合从而进行联合推理,这…

机器学习中的最优化算法总结

https://zhuanlan.zhihu.com/p/42689565 机器学习中的最优化算法总结对于几乎所有机器学习算法,无论是有监督学习、无监督学习,还是强化学习,最后一般都归结为求解最优化问题。因此,最优化方法在机器学习算法的推导与实现中占据中…

以jieba为首的主流分词工具总结

工具篇 下面列了几个较为主流的分词工具(排名不分先后,大家自行试用),相关的paper请在订阅号「夕小瑶的卖萌屋」后台回复【中文分词】领取。 1 Jieba 说到分词工具第一个想到的肯定是家喻户晓的“结巴”中文分词,主…

mikechen详谈架构师成长之3大步骤

本文作者:陈睿|mikechen,优知学院创始人 这是架构师系列的第二篇文章 前文谈到架构师核心技能架构设计的重要性,如果你对架构师这个职位从技能的角度有比较清晰的认识,本篇文章将为你继续揭示架构师这个职位的成长周期。 在国内…

论文浅尝 | 二维卷积知识图谱嵌入

链接:https://arxiv.org/pdf/1707.01476.pdf本文主要关注 KG Link prediction 问题,提出了一种多层卷积神经网络模型 ConvE,主要优点就是参数利用率高(相同表现下参数是 DistMult 的8分之一,R-GCN 的 17 分之一&#x…

如何成为架构师?3条有效的实战经验

“ 希望你看完这一篇,能充分认知和了解架构师,认知对了,事就好办了。 01 架构师的准确定义 架构师的职责应该是立足于技术和业务之间的中间角色或者平衡点, 在针对业务深刻理解的基础上,针对业务中存在诸多变数&am…

ArchSummit2016干货分享+美团:即时物流调度平台实践+一点资讯:兴趣引擎-深度融合搜索和推荐+阿里-智能问答系统的实践

** 2015年7月 ** 加入滴滴打车3个半月,感觉遇到和解决的技术问题超过之前1年的。写在这里给大家分享。 滴滴这边负责所有策略算法设计的是“策略组”,大概有20几个员工。由于滴滴的业务线越来越多(出租车,专车,快车&…

论文浅尝 | 使用变分推理做KBQA

Yuyu Zhang, Hanjun Dai, Zornitsa Kozareva, Alexander J.Smola, and Le Song: Variational Reasoning for Question Answering with KnowledgeGraph. AAAI 2018链接:https://arxiv.org/abs/1709.04071本文提出了一个可端到端训练的 KBQA 框架,可以在模…

史上最全Git学习教程

Git是世界上最先进的分布式版本控制系统,没有之一。 —— Git爱好者 Git 是一个「分布式版本管理工具」,其具备太多的优点:更方便的 Merge、更方便的管理、更健壮的系统、对网络的依赖性更低、更少的“仓库污染” 等等,这使得Git…

阿里P8架构师谈:深入探讨HashMap的底层结构、原理、扩容机制

摘要 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。 随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文…

深入解析GBDT二分类算法(附代码实现)

目录: GBDT分类算法简介 GBDT二分类算法 2.1 逻辑回归的对数损失函数 2.2 GBDT二分类原理 GBDT二分类算法实例 手撕GBDT二分类算法 4.1 用Python3实现GBDT二分类算法 4.2 用sklearn实现GBDT二分类算法 GBDT分类任务常见的损失函数 总结 Reference 本文的主要…

论文浅尝 | 动态词嵌入

Citation: Bamler R, Mandt S. Dynamic word embeddings.InInternational Conference on Machine Learning 2017 Jul 17 (pp. 380-389).URL:http://proceedings.mlr.press/v70/bamler17a/bamler17a.pdf动机语言随着时间在不断演化,词语的意思也由于文化的…

滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型

国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共收录 293 篇,录取率不足 20%。其中滴滴共有四篇论文入选 KDD 2018,涵盖 ETA 预测 (预估到达时间) 、智能派单、大规模车流管理等…

Keyword-BERT——问答系统中语义匹配的杀手锏

引子 问&答 是人和人之间非常重要的沟通方式,其关键在于:我们要理解对方的问题,并给出他想要的答案。设想这样一个场景,当你的女朋友or老婆大人在七夕前一晚,含情脉脉地跟你说 亲爱的,七夕快到了&…

阿里P8架构师谈:Docker简介、组成架构、使用步骤、以及生态产品

Docker简介 Docker是DotCloud开源的、可以将任何应用包装在Linux container中运行的工具。 Docker基于Go语言开发,代码托管在Github上,目前超过10000次commit。 基于Docker的沙箱环境可以实现轻型隔离,多个容器间不会相互影响;D…

研讨会 | 知识图谱前沿技术课程暨学术研讨会(武汉大学站)

知识图谱作为大数据时代重要的知识表示方式之一,已经成为人工智能领域的一个重要支撑。4月28日,“武汉大学信息集成与应用实验室”与“复旦大学知识工场实验室”联合举办“知识图谱前沿技术课程暨学术研讨会”,将结合知识图谱学界研究与业界应…

LayerNorm是Transformer的最优解吗?

本文转载自公众号“夕小瑶的卖萌屋”,专业带逛互联网算法圈的神操作 -----》我是传送门 关注后,回复以下口令: 回复【789】 :领取深度学习全栈手册(含NLP、CV海量综述、必刷论文解读) 回复【入群】&#xf…

观点 | 滴滴 AI Labs 负责人叶杰平教授:深度强化学习在滴滴的探索与实践+关于滴滴智能调度的分析和思考+滴滴派单和Uber派单对比

AI 科技评论按:7 月 29 日,YOCSEF TDS《深度强化学习的理论、算法与应用》专题探索报告会于中科院自动化所成功举办,本文为报告会第一场演讲,讲者为滴滴副总裁、AI Labs 负责人叶杰平教授,演讲题为「深度强化学习在滴滴…

消息中间件系列(二):Kafka的原理、基础架构、以及使用场景

一:Kafka简介 Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统。 它最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、…