导语
本周对自然语言处理的分词技术进行了学习。本文针对分词技术的进行了全视角的概览,目标是掌握什么是分词技术、为什么需要分词技术和如何使用分词技术。后续将分不同篇幅对其中内容进行深挖和讲解。
文章结构如下(全文阅读时间大约10分钟):
文章大纲
1.简介
首先,简单介绍一下自然语言处理技术(简称NLP),是人工智能领域中一个重要的方向,主要研究如何让人类和计算机之间,能够使用人类能够理解的语言进行有效沟通,其涵盖语言学、计算机科学、数学等多种交叉学科。
在现如今人工智能技术迅速发展时期,AI技术逐步从感知智能朝认知智能大跨步迈进,NLP技术或许是人类实现强人工智能的关键所在。
NLP技术
什么是分词技术?分词技术属于自然语言处理技术范畴,分词就是将句子中的词语划分出来的技术,人能够知道哪些是词语,如何让计算机能够理解和划分,其处理过程就是分词。当然,分词只是一种工具,场景不同,要求也不同。
分词
为什么需要分词技术?因为许多自然语言处理技术都会围绕词语展开,例如情感分析、问答模型等;分词效果直接影响上层技术的效果;并且,词语是最小粒度有意义的语言成分;英文往往不需要分词,但中文需要,因为中文在基本文法上有其特殊性,主要体现在:
1.英文以空格作为天然分隔符,中文词语间没有分隔
2.古文词通常是单个汉字,而现在汉语双字多字词比较多
3.词和词组边界模糊
古文与现代文对比
2.技术难点
到目前为止,中文分词技术仍存在三大难题未完全突破:
1.分词的规范:字和词的界限往往很模糊,并没有一个公认、权威的标准,会有很多不同主观上的分词差异
2.歧义词的切分,歧义词的情况分为:交集型歧义、组合型歧义和混合型歧义。另外,更头痛的情况就是真歧义,即使是人都无法判断的情况
3.未登录词识别,就是新词的意思,如人名、地名、网络用词等等
交集型歧义
组合型歧义
混合型歧义
真歧义
分词算法概述
1算法中的数据结构
在展开算法实现之前,先来讲讲算法中提到的数据结构:一个是词典,一个是词图。
词典一般可以用链表或数组实现,更高级的词典还有Trie树和AC自动机等,例如在HanLp的源码中用户自定义词典的识别是用的AC自动机实现的(需要了解Trie树、KMP算法、AC自动机可以在后续的推文中学习)。
Trie树
图作为一种常见的数据结构,其存储方式一般有两种:邻接矩阵和邻接表。所谓矩阵其实就是二维数组,所谓邻接矩阵存储结构,就是每个顶点用一个一维数组存储每条边的信息,就能用矩阵表示图中各顶点之间的邻接关系。
邻接矩阵
邻接表,存储方法跟树的子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。
邻接图
2分词算法简介
分词算法
现有的分词算法,大体上可以分为如下几类:1.基于规则的分词算法 2.基于统计的分词算法 3.基于语义的分词算法 4.基于理解的分词算法(该部分内容在本期后续推文中会展开讲解)
基于规则的分词算法主要思想是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。
优点是简单,容易实现。缺点是:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。
基于规则的分词方法
基于统计的分词算法的主要核心是词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
实际运用中会结合基于规则的分词方法,不仅发挥词典匹配的速度快的优势,又结合无词典分词能够结合上下文识别、消歧的优势。
基于统计的分词方法
基于语义的分词算法引入了语义分析,对自然语言自身的语言信息进行更多的处理。
基于语义的分词方法
基于理解的分词算法,是通过让计算机,模拟人对句子的理解,达到识别词组的效果。基本思想是在分词的同时进行句法、语义的分析,利用句法和语义信息来处理歧义现象。通常包含三部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息,来对分词歧义进行判断,模拟人对句子的理解过程。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。
基于理解的分词方法
python工具
python分词库
最后介绍一些常用的python分词库(该部分内容在本期后续推文中会展开讲解如何使用):
1.jieba:专用于分词的python库,分词效果好.支持三种分词模式:精准模式、全模式和搜索引擎模式;并且支持繁体分词;可以自定义词典。它主要使用的分词算法是基于统计的分词算法:
a.基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
b.采用动态规划查找最大概率路径,找出基于词频的最大切分组合
c.对未登录词,采用基于汉字成词能力的HMM模型,使用Viterbi算法
Github地址:
https://github.com/fxsjy/jieba
2.THULAC:由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
a.能力强。利用集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
b.准确率高。该工具包在标准数据集Chinese Treebank上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
c.速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s.
Github地址:
https://github.com/thunlp/THULAC-Python
3.pkuseg:由北京大学语言计算与机器学习研究组研制推出的一套全新的中文分词工具包。具有如下几个特点:
a.分词准确率。相比于其他的分词工具包,该工具包在不同领域的数据上都大幅提高了分词的准确度。根据测试结果,pkuseg分别在示例数据集(MSRA和CTB8)上降低了79.33%和63.67%的分词错误率。
b.多领域分词。该分词包训练了多种不同领域的分词模型。根据待分词的领域特点,用户可以自由地选择不同的模型。
c.支持用户自训练模型。支持用户使用全新的标注数据进行训练。
Github地址:
https://github.com/lancopku/PKUSeg-python
4.FoolNLTK:根据该项目所述,这个中文工具包的特点有如下几点:
a.可能不是最快的开源中文分词,但很可能是最准的开源中文分词
b.基于 BiLSTM 模型训练而成
c.包含分词,词性标注,实体识别, 都有比较高的准确率
d.用户自定义词典
Github地址:
https://github.com/rockyzhengwu/FoolNLTK
5.LTP:语言技术平台(Language Technology Platform,LTP)是哈工大社会计算与信息检索研究中心历时十年开发的一整套中文语言处理系统。LTP制定了基于XML的语言处理结果表示,并在此基础上提供了一整套自底向上的丰富而且高效的中文语言处理模块(包括词法、句法、语义等6项中文处理核心技术),以及基于动态链接库(Dynamic Link Library, DLL)的应用程序接口、可视化工具,并且能够以网络服务(Web Service)的形式进行使用。
GitHub地址:
https://github.com/HIT-SCIR/pyltptp
另外运行的时候需要下载模型,模型还比较大,下载地址:
http://ltp.ai/download.html
6.SnowNLP: Simplified Chinese Text Processing,可以方便的处理中文文本内容,是受到了 TextBlob 的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和 TextBlob 不同的是,这里没有用 NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。
GitHub 地址:
https:github.com/isnowfy/snownlp
作者原创,请务必替换文字