浅谈分词算法(1)分词中的基本问题

[TOC]

前言

分词或说切词是自然语言处理中一个经典且基础的问题,在平时的工作中也反复的接触到分词问题,用到了不同的模型,不同的方法应用在各个领域中,所以想对分词问题做一个系统的梳理。大多数分词问题主要是针对类似汉语、韩语、日语等,词语之间并没有天然的分割,而像英语等,句子中是带有天然的分割的。但是英语也会涉及到分词问题,比如实体识别、词性标注等内容。而本系列文章更多的是讨论汉语中的分词问题,首先我们从分词问题的基本出发,之后从传统的词典分词到将分词转为序列标注问题的分词,以及最新的结合深度学习的分词,基本按照时间顺序对分词模型可能用到的算法模型进行一步步尝试与介绍,所有代码我会放在自己的github上:xlturing

目录

浅谈分词算法(1)分词中的基本问题
浅谈分词算法(2)基于词典的分词方法
浅谈分词算法(3)基于字的分词方法(HMM)
浅谈分词算法(4)基于字的分词方法(CRF)
浅谈分词算法(5)基于字的分词方法(LSTM)

分词中的基本问题

简单的讲,汉语自动分词就是让计算机在汉语文本中的词与词之间自动加上空格或其他边界标记。分词中涉及到三个基本问题:分词规范、歧义切分和未登录词的识别。

分词规范

我们从小学习汉语开始,基本顺序就是汉字->词语->句子->段落->篇章,而其中词是什么,什么是词语,这个问题看似有些莫名其妙,但是如何界定一个词语却是分词中一个很重要的话题。有关专家的调查表明,在母语为汉语的被试者之间,对汉语文本中出现的词语的认同率只有大约70%,从计算的严格意义上说,自动分词是一个没有明确定义的问题[黄昌宁等,2003]。举个简单的例子:
“小明看到湖岸上的花草,一株不知名的小花引起了他的注意”

对于这句话中的“湖岸”、“花草”、“不知名”等,不同的词语界定方式就会出现不一样的分词结果,如我们可以切分成以下几种形式:

  1. “小明/看到/湖岸/上/的/花草/,一株/不知名/的/小花/引起/了/他的/注意”
  2. “小明/看到/湖/岸/上/的/花/草,一株/不/知名/的/小花/引起了/他的/注意”
  3. “小明/看到/湖岸/上的/花/草,一株/不知名的/小花/引起了/他的/注意”

我们可以看出不同的词语界定方式,可以组合出很多种分词结果,所以说分词可以看做是找寻一个没有明确定义问题的答案。所以当我们在衡量一个分词模型的好坏时,我们首先需要确定一个统一的标准,即所谓Golden Data,大家所有的模型都在统一的数据集上进行训练和评测,这样比较才会具有可参考性。

歧义切分

歧义字段在汉语中是普遍存在的,而歧义字段是汉语切分的一个重要难点。梁南元最早对歧义字段进行了两种基本的定义:

  • 交集型切分歧义:汉字串AJB称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分别为汉字串)。此时汉字串J称作交集串。如,大学生(大学/学生)、研究生物(研究生/生物)、结合成(结合/合成).
  • 组合型切分歧义:汉字串AB称作多义组合型切分歧义,如果满足A、B、AB同时为词。如,起身(他|站|起|身|来/明天|起身|去北京)、学生会(我在|学生会|帮忙/我的|
    学生|会来|帮忙)

我们可以看出歧义字段给我们的分词问题带来了极大的困扰,所以想要正确的做出切分判断,一定要结合上下文语境,甚至韵律、语气、重音、停顿等。

未登录词识别

未登录词,一种是指已有的词表中没有收录的词,另一种是指训练语料中未曾出现过的词。而后一种含义也可以被称作集外词,OOV(out of vocabulary),即训练集以外的词。通常情况下未登录词和OOV是一回事,我们这里不加以区分。
未登录词大体可以分为如下几个类型:

  • 新出现的普通词汇,如网络用语当中层出不穷的新词,这在我们的分词系统这种也是一大挑战,一般对于大规模数据的分词系统,会专门集成一个新词发现模块,用于对新词进行挖掘发现,经过验证后加入到词典当中。
  • 专有名词,在分词系统中我们有一个专门的模块,命名体识别(NER name entity recognize),用于对人名、地名以及组织机构名等单独进行识别。
  • 专业名词和研究领域名称,这个在通用分词领域出现的情况比较少,如果出现特殊的新领域,专业,就会随之产生一批新的词汇。
  • 其他专用名词,包含其他新产生的产品名、电影、书籍等等。

经过统计汉语分词出现问题更多是由于未登录词造成的,那么分词模型对于未登录词的处理将是衡量一个系统好坏的重要指标。

常用的汉语分词方法

基于词典的分词方法

基于词典的方法是经典的传统分词方法,这种方式很直观,我们从大规模的训练语料中提取分词词库,并同时将词语的词频统计出来,我们可以通过逆向最大匹配、N-最短路径以及N-Gram模型等分词方法对句子进行切分。基于词典的分词方法非常直观,我们可以很容易的通过增减词典来调整最终的分词效果,比如当我们发现某个新出现的名词无法被正确切分的时候,我们可以直接在词典当中进行添加,以达到正确切分的目的;同样的过于依赖于词典也导致这种方法对于未登录词的处理不是很好,并且当词典当中的词出现公共子串的时候,就会出现歧义切分的问题,这需要语料库足够的丰富,从而能够对每个词的频率有一个很好的设置。

基于字的分词方法

不同于基于词典的分词方法,需要依赖于一个事先编制好的词典,通过查词典的方式作出最后的切分决策;基于字的分词方法将分词过程看作是字的分类问题,其认为每个字在构造一个特定词语时都占据着一个确定的构词位置(词位)[1]。这种方法最早由薛念文等人于2002年提出,并在各种分词大赛上取得了不错的成绩,尤其是对未登录词问题的处理,召回率一直很高。
一般情况下,我们认为每个字的词位有4种情况:B(Begin)、E(End)、M(Middle)、S(Single),那么我们对于一个句子的切分就可以转为对句子中每个字打标签的过程,举个例子:

  • 自然语言处理/可以/应用/在/诸多/领域。
  • 自B 然M 语M 言M 处M 理E 可B 以E 应B 用E 在S 诸B 多E 领B 域E。

我们对句子中的每个字赋予了一个词位,即BEMS中的一个标签,这样我们就完成了分词的目的。
基于字的方法将传统的语言学问题转换为了一个更加容易建模的序列标注问题,我们可以用最大熵模型为每个字进行标签分类;也可以利用HMM将其看作一个解码问题;或者考虑句子间的时序关系,利用判别模型CRF来建模;同样时下火热的深度学习中的LSTM也可以用在这里进行建模。

总结

本篇博文我们先简单介绍分词问题本身,其重点和难点是什么,已经大的方向上用到了哪些方法和模型,后续我们会选取常用的分词模型进行一一介绍和实现。这里需要特别说明下的是,本系列文章在介绍的时候是分开单个模型进行介绍的,在实际生产环境中,我们往往会融合多种方法来提高准确率和召回率,比如在github中经常被提及的结巴分词就融合了n-gram词典分词和HMM字分词,大家具体用到的时候要根据实际环境进行选择和搭配,必要的时候要对模型进行重train和调整。

如有任何纰漏,欢迎大家指正。

参考文献

  1. 《统计自然语言处理 第2版》

原文地址:https://www.cnblogs.com/xlturing/p/8465965.html

时间: 2024-08-04 09:57:31

浅谈分词算法(1)分词中的基本问题的相关文章

hdu1875浅谈prim算法的朴素实现

阅读原题 题目大意 给你几个(<=100)小岛的坐标,然后你把所有的岛都修上桥连接起来,求最小花费,还有个附加的限制:只有岛之间的距离大于等于10,或小于等于1000时才能修桥. 大概是因为十米以内不用建桥,千米以上无法建桥.哈哈,说着玩的. 很明显这是一道MST(最小生成树)的题目,貌似也有人用并查集AC过. 最小生成树算法 概述 最小生成树的常用算法有两个kruskal和prim算法.两者都是不停地执行归并操作,然而一言以蔽之,两者的不同之处在于:kruskal----归并边:prim---

浅谈设计模式的学习(中)

在<浅谈设计模式的学习(上)>中我说到了设计模式的基石-----抽象思维.为什么需要抽象思维呢?因为越抽象就越不容易出错,就像有些领导人说话:坚持改革开放.但怎么算坚持改革开放呢,没有具体的标准,因事而异,所以就不容易违背这个坚持改革开放的原则了. 3.学习设计模式,要保持抽象的思维     什么是抽象思维呢?真的不好说,抽象的东西往往难以说明白,听了也难以搞明白,还是通过具体的例子来说吧 有这么一个学生请假的场景,如果请假时间一天以内则有班长批准就可以了,三天以内则需要老师批准,超过三天就得

转:浅谈CSS在前端优化中一些值得注意的关键点

前端优化工作中要考虑的元素多种多样,而合理地使用CSS脚本可以在很大程度上优化页面的加载性能,以下我们就来浅谈CSS在前端优化中一些值得注意的关键点: 当谈到Web的“高性能”时,很多人想到的是页面加载时间,但其实性能不仅仅是指加载时间,还包括浏览器性能.网络性能.开发效率.在Web前端开发中,性能是一个非常重要的需要考虑的点.本文将介绍一些开发原则和性能准则,这些都是提高Web前端性能的基础. 1. 开发原则 1.1 编写符合当代浏览器性能的代码如果想提高前端性能,就必须理解浏览器的工作原理,

浅谈logo在PPT设计中的运用

在工业设计范畴,特别是产品设计中常常会提到“形式跟随功用”,也就是说产品的外型是树立在产品功用的根底之上的,同样道理,在PPT设计中则演化为“形式跟随内容”,就是说页面的美化设计是为了更好的将内容向观众传达. 为此我们总结了PPT设计的三个原则,即“图示化”,“图标化”,“图表化” 以“图标化”为例,所谓图标,就是具有指代意义的图形符号,具有高度浓缩并快捷传达信息.便于记忆的特性.应用范围很广,软硬件网页社交场所公共场所无所不在,例如各种交通标志…… 在用户界面设计范畴中则为图标的形式,包括程序

浅谈加速因子在策略中的意义

他站链接:浅谈加速因子在策略中的意义 NO:01没有完美的交易系统,但是却有完美的交易哲学.交易哲学.交易策略和资金管理三者缺一不可,才能构成正期望的交易系统.投机依赖价格的移动获得盈利(低买高卖或高买更高卖).在上升或下降趋势中,价格虽然在整体上朝着一个方向移动,但中间也会有短暂的反方向移动.而在横盘过程中,价格的移动方向则显得相对"随机"一些. NO:02关于价格的移动,可以类比物理学中的运动.其中包括:位移距离.时间.速度等.价格的位移相对于时间的比率就是价格的速度.除了速度之外

浅谈欧洲算法——模拟退火

初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...) 直到学了退火之后,我才发现: 退火不只是帅,而且非常万能 甚至比 D (大) F (法) S (师)还要万能 简直就是骗(de)分神器啊 简介 作为一个计算机算法,它竟然在百度上有物理词条! 当时我看了就懵了,你说计算机一个算法,跟冶炼金属有什么关系啊? 后来我看了算法的词条... 是不是更懵了... 方便大家理解(变得更懵),我搬了百度上的定义: Simulate Anneal Arithmetic (SAA,模拟退火算法

从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中.设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}.要求:写出本题的算法描述. 分析: 本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可.本题算法描述如下: 1 #include <iostream> 2 using namespace st

浅谈Manacher算法与扩展KMP之间的联系

首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 通过枚举S的子串,然后判断该子串是否为回文,由于S的子串个数大约为,加上每次判断需要的时间,所以总的时间复杂度为,空间复杂度为. bool check(string &S, int left, int right) { while (left < right && S[left]

浅谈数据结构之KMP(串中的模式匹配算法)

KMP算法是一种模式匹配算法的改进版,其通过减少匹配的次数以及使主串不回朔来减少字符串匹配的次数,从而较少算法的相应代价,但是,事件万物是普遍归中的,KMP算法的有效性也是有一定的局限的,我将在本文的最后也讨论这个算法的局限性. 一般的匹配算法: KMP基本概念引入: 但是,其实我们会发现,上面的中间两个匹配步骤是没有必要的,因为他们的第一个匹配字母就不相同,完全没有可比性,而当我们在第四次匹配的时候,其实我们从模式串中就可得知,只有当模式串滑到这个地方的时候,它的匹配才是最有价值的,因为从模式

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust