*注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书
自然语言处理系列七
中文分词
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文的词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比英文要复杂得多、困难得多。
规则分词
规则分词是基于字典、词库匹配的分词方法(机械分词法),其实现的主要思想是:切分语句时,将语句特定长的字符串与字典进行匹配,匹配成功就进行切分。按照匹配的方式可分为:正向最大匹配分词、逆向最大匹配分词和双向最大匹配分词。这种方法按照一定策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。识别出一个词,根据扫描方向的不同分为正向匹配和逆向匹配。根据不同长度优先匹配的情况,分为最大(最长)匹配和最小(最短)匹配。根据与词性标注过程是否相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。
我们来举个例子:
假设现在有段中文文本"网易杭研大厦",并且词典中包含["网易", "杭研", "大厦", "网易杭研", "杭研大厦", "网易杭研大厦"]。基于这个简单的小词典不需要任何的理论知识可以非常容易的分成下面这四种结果:
网易 / 杭研 / 大厦
网易 / 杭研大厦
网易杭研 / 大厦
网易杭研大厦
上面这四种分词结果都是正确的,不过在中文中越长的单词所表达的意义越丰富并且含义越明确,所以我们会更倾向于选择"网易杭研大厦"。比如我们更倾向将"北京大学"作为一个完整的单词,而不是划分成"北京"和"大学"两个碎片化的单词,"北京大学"比"北京"和"大学"所表达的意义更加丰富,同时"北京大学"所表达的含义也更加明确。
在中文中越长的单词所表达的意义越丰富并且含义越明确,因此就有了第一条规则:在以某个下标递归查词的过程中,优先输出更长的单词,这种规则也被称为最长匹配算法。根据下标扫描顺序的不同分为:
正向最长匹配,下标的扫描顺序从前往后;
逆向最长匹配,下标的扫描顺序从后往前;
下面对正向最大匹配分词、逆向最大匹配分词和双向最大匹配分词的原理一一详细讲解。在讲之前会用到HanLP中文分词这个开源工具包,先简单介绍下。
HanLP是面向生产环境的多语种自然语言处理工具包,目标是普及落地最前沿的NLP技术。HanLP具备功能完善、性能高效、架构清晰、语料时新、可自定义的特点。持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析(MaxEnt依存句法分析、CRF依存句法分析)。提供Lucene插件,兼容Lucene4.x。在提供丰富功能的同时,HanLP内部模块坚持低耦合、模型坚持惰性加载、服务坚持静态提供、词典坚持明文发布,使用非常方便,同时自带一些语料处理工具,帮助用户训练自己的语料。HanLP同时支持Java和Python调用,GitHub开源地址为:https://github.com/hankcs/HanLP
安装好HanLP环境后我们先来看看如何使用Python加载HanLP的词典。首先需要查看HanLP自带词典的具体路径,可以通过下面命令进行查看(需要进入安装HanLP的虚拟环境中):
hanlp –v
查看HanLP配置的默认目录其中data路径中包含HanLP自带的一些数据文件,进入存放词典的"dictionary"文件中:
HanLP自带的词典"CoreNatureDictionary.mini.txt"就是我们接下来要使用的迷你核心词典,使用head -n 5 CoreNatureDictionary.mini.txt查看迷你核心词典的前5行。
核心迷你词典的前5行HanLP中的词典格式是一种以空格分隔的表格形式,第一列为单词本身,之后的两列分别表示词性和单词表示当前词性时的词频,单词可能不止一种词性,因此后面的列依次类推表示词性和单词表示当前词性时的词频。比如"x w 7 nx 1"表示"x"这个词以标点符号(w)的身份出现了7次,以字母专名(nx)的身份出现了1次,当然这里的词频是在某个语料库上进行统计的。不过在基于词典分词的过程中,词性和词频没有太大的用处,可以暂时忽略。
使用Python加载HanLP自带的迷你核心词典"CoreNatureDictionary.mini.txt"词典代码如下:
from pyhanlp import *
def load_dictionary():
"""
加载HanLP中的mini词库
:return: 一个set形式的词库
"""
# 利用JClass获取HanLP中的IOUtil工具类
IOUtil = JClass('com.hankcs.hanlp.corpus.io.IOUtil')
# 取得HanLP的配置项Config中的词典路径,并替换成CoreNatureDictionary.mini.txt词典
path = HanLP.Config.CoreDictionaryPath.replace('.txt', '.mini.txt')
# 读入加载列表中指定多个词典文件,返回的是Java Map对象
dic = IOUtil.loadDictionary([path])
print(type(dic))
# 不关心词性和词频引出只获取Map对象的键值KeySet,并将其转换成Python的set集合
return set(dic.keySet())
if __name__ == '__main__':
dic = load_dictionary()
print(len(dic))
print(list(dic)[0])
代码运行后的结果:
<class 'jpype._jclass.java.util.TreeMap'>
85584
度假村
注意:
JClass函数是连通Java和Python的桥梁,可以根据Java路径名获得Python类;
HanLP默认配置的词典是"CoreNatureDictionary.txt",如果想要使用迷你的"CoreNatureDictionary.mini.txt"只需要将配置文件中的".txt"替换成"mini.txt";
加载好了词典,在具体介绍正向最长匹配、逆向最长匹配以及双向最长匹配之前,先来看看什么是最长匹配?
最长匹配算法是基于词典进行匹配,首先选取词典中最长单词的汉字个数作为最长匹配的起始长度。比如现在词典中的最长单词中包含5个汉字,那么最长匹配的起始汉字个数就为5,如果与词典匹配不成功就减少一个汉字继续与词典进行匹配,循环往复,直至与词典匹配且满足规则或者剩下一个汉字。
接下来的自然语言处理系列详细讲解正向最大匹配分词、逆向最大匹配分词和双向最大匹配分词的原理,并用HanLP举例子给大家代码演示。
总结
此文章有对应的配套视频,其它更多精彩文章请大家下载充电了么app,可获取千万免费好课和文章
【新书介绍】
《分布式机器学习实战(人工智能科学与技术丛书)》(陈敬雷)【摘要 书评 试读】- 京东图书
新书特色:深入浅出,逐步讲解分布式机器学习的框架及应用配套个性化推荐算法系统、人脸识别、对话机器人等实战项目
【新书介绍视频】
分布式机器学习实战(人工智能科学与技术丛书)新书【陈敬雷】-学习视频教程-腾讯课堂
视频特色:重点对新书进行介绍,最新前沿技术热点剖析,技术职业规划建议!听完此课你对人工智能领域将有一个崭新的技术视野!职业发展也将有更加清晰的认识!
【精品课程】
《分布式机器学习实战》大数据人工智能AI专家级精品课程-学习视频教程-腾讯课堂
【免费体验视频】:
人工智能百万年薪成长路线/从Python到最新热点技术_腾讯课堂
从Python编程零基础小白入门到人工智能高级实战系列课_腾讯课堂
视频特色: 视频核心内容有互联网公司大数据和人工智能那些事、大数据算法系统架构、大数据基础、Python编程、Java编程、Scala编程、Docker容器、Mahout分布式机器学习平台、Spark分布式机器学习平台、分布式深度学习框架和神经网络算法、自然语言处理算法、工业级完整系统实战(推荐算法系统实战、人脸识别实战、对话机器人实战)、就业/面试技巧/职业生涯规划/职业晋升指导等内容。
【充电了么公司介绍】
充电了么App是专注上班族职业培训充电学习的在线教育平台。
专注工作职业技能提升和学习,提高工作效率,带来经济效益!今天你充电了么?
充电了么官网:
【充电了么app官网】充电了么 - 上班族充电学习的在线教育平台,今天你充电了么?
充电了么App官网下载地址:
下一篇:自然语言处理系列八》中文分词》规则分词》正向最大匹配法
网友评论