本文首先介绍下中文分词基本原理,然后介绍下国内比较流行的中文分词工具,如jiebaSnowNLPTHULACNLPIR,上述分词工具都已经在github上开源,后续也会附上github链接,以供参考。

1.中文分词原理介绍

1.1 中文分词概述

中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词分词就是将连续的字序列按照一定的规范重新组合成词序列的过程

1.2 中文分词方法介绍

现有的分词方法可分为三大类:基于字符串匹配的分词方法基于理解的分词方法基于统计的分词方法

1.2.1 基于字符串匹配的分词方法

基于字符串匹配的分词方法又称机械分词方法,它是按照一定的策略待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。

按照扫描方向的不同,字符串匹配分词方法可以分为正向匹配逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配最小(最短)匹配;按照是否与词性标注过程相结合,可以分为单纯分词方法分词与词性标注相结合的一体化方法。常用的字符串匹配方法有如下几种:

(1)正向最大匹配法(从左到右的方向);

(2)逆向最大匹配法(从右到左的方向);

(3)最小切分(每一句中切出的词数最小);

(4)双向最大匹配(进行从左到右、从右到左两次扫描)

这类算法的优点是速度快,时间复杂度可以保持在O(n),实现简单,效果尚可;但对歧义未登录词处理效果不佳。

1.2.2 基于理解的分词方法

基于理解的分词方法通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息语义信息处理歧义现象。它通常包括三个部分:分词子系统句法语义子系统总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段

1.2.3 基于统计的分词方法

基于统计的分词方法是在给定大量已经分词的文本的前提下,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。例如最大概率分词方法最大熵分词方法等。随着大规模语料库的建立,统计机器学习方法的研究和发展,基于统计的中文分词方法渐渐成为了主流方法

主要的统计模型有:N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),条件随机场模型(Conditional Random Fields,CRF)等。

在实际的应用中,基于统计的分词系统都需要使用分词词典进行字符串匹配分词,同时使用统计方法识别一些新词,即将字符串频率统计字符串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点

2.中文分词工具介绍

2.1 jieba (github star数 9003)

jieba分词是国内使用人数最多的中文分词工具(github链接:https://github.com/fxsjy/jieba)。jieba分词支持三种模式

(1)精确模式:试图将句子最精确地切开,适合文本分析

(2)全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义

(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率适合用于搜索引擎分词

jieba分词过程中主要涉及如下几种算法:

(1)基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);

(2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合

(3)对于未登录词,采用了基于汉字成词能力的 HMM 模型,采用Viterbi 算法进行计算;

(4)基于Viterbi算法做词性标注

(5)基于tf-idftextrank模型抽取关键词

测试代码如下所示:

# -*- coding: utf-8 -*-
"""
jieba分词测试
"""import jieba#全模式
test1 = jieba.cut("杭州西湖风景很好,是旅游胜地!", cut_all=True)
print("全模式: " + "| ".join(test1))#精确模式
test2 = jieba.cut("杭州西湖风景很好,是旅游胜地!", cut_all=False)
print("精确模式: " + "| ".join(test2))#搜索引擎模式
test3= jieba.cut_for_search("杭州西湖风景很好,是旅游胜地,每年吸引大量前来游玩的游客!")
print("搜索引擎模式:" + "| ".join(test3))

测试结果如下图所示:

2.2 SnowNLP(github star数 2043)

SnowNLP是一个python写的类库(https://github.com/isnowfy/snownlp),可以方便的处理中文文本内容,是受到了TextBlob的启发而写的。SnowNLP主要包括如下几个功能:

(1)中文分词(Character-Based Generative Model);

(2)词性标注(3-gram HMM);

(3)情感分析(简单分析,如评价信息);

(4)文本分类(Naive Bayes)

(5)转换成拼音(Trie树实现的最大匹配)

(6)繁简转换(Trie树实现的最大匹配)

(7)文本关键词文本摘要提取(TextRank算法)

(8)计算文档词频TF,Term Frequency)和逆向文档频率IDF,Inverse Document Frequency)

(9)Tokenization(分割成句子)

(10)文本相似度计算(BM25)

SnowNLP的最大特点是特别容易上手,用其处理中文文本时能够得到不少有意思的结果,但不少功能比较简单,还有待进一步完善。

测试代码如下所示:

# -*- coding: utf-8 -*-
"""
SnowNLP测试
"""from snownlp import SnowNLPs = SnowNLP(u'杭州西湖风景很好,是旅游胜地,每年吸引大量前来游玩的游客!')#分词
print(s.words)#情感词性计算
print("该文本的情感词性为正的概率:" + str(s.sentiments))text = u'''
西湖,位于浙江省杭州市西面,是中国大陆首批国家重点风景名胜区和中国十大风景名胜之一。
它是中国大陆主要的观赏性淡水湖泊之一,也是现今《世界遗产名录》中少数几个和中国唯一一个湖泊类文化遗产。
西湖三面环山,面积约6.39平方千米,东西宽约2.8千米,南北长约3.2千米,绕湖一周近15千米。
湖中被孤山、白堤、苏堤、杨公堤分隔,按面积大小分别为外西湖、西里湖、北里湖、小南湖及岳湖等五片水面,
苏堤、白堤越过湖面,小瀛洲、湖心亭、阮公墩三个小岛鼎立于外西湖湖心,夕照山的雷峰塔与宝石山的保俶塔隔湖相映,
由此形成了“一山、二塔、三岛、三堤、五湖”的基本格局。
'''s2 = SnowNLP(text)#文本关键词提取
print(s2.keywords(10))

测试结果如下图所示:

2.3 THULAC (github star数 311)

THULAC(THU Lexical Analyzer for Chinese)由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包(github链接:https://github.com/thunlp/THULAC-Python),具有中文分词词性标注功能。THULAC具有如下几个特点:

(1)能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大

(2)准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。

(3)速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

THU词性标记集(通用版)如下所示:

n/名词 np/人名 ns/地名 ni/机构名 nz/其它专名
m/数词 q/量词 mq/数量词 t/时间词 f/方位词 s/处所词
v/动词 a/形容词 d/副词 h/前接成分 k/后接成分 i/习语
j/简称 r/代词 c/连词 p/介词 u/助词 y/语气助词
e/叹词 o/拟声词 g/语素 w/标点 x/其它

测试代码(python版)如下所示:

# -*- coding: utf-8 -*-
"""
THULAC 分词测试
"""import thulac   #默认模式,分词的同时进行词性标注
test1 = thulac.thulac()
text1 = test1.cut("杭州西湖风景很好,是旅游胜地!")
print(text1)#只进行分词
test2 = thulac.thulac(seg_only=True)
text2 = test2.cut("杭州西湖风景很好,是旅游胜地!")
print(text2)

测试结果如下图所示:

2.4 NLPIR (github star数 811)

NLPIR分词系统(前身为2000年发布的ICTCLAS词法分析系统,gtihub链接:https://github.com/NLPIR-team/NLPIR),是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词词性标注命名实体识别用户词典新词发现关键词提取等功能。本文测试所采用的是PyNLPIRNLPIRPython版本,github链接:https://github.com/tsroten/pynlpir)

测试代码如下所示:

# -*- coding: utf-8 -*-
"""
PYNLPIR 分词测试
"""import pynlpir#打开分词器
pynlpir.open()text1 = "杭州西湖风景很好,是旅游胜地,每年吸引大量前来游玩的游客!" #分词,默认打开分词和词性标注功能
test1 = pynlpir.segment(text1)
#print(test1)
print('1.默认分词模式:\n' + str(test1))#将词性标注语言变更为汉语
test2 = pynlpir.segment(text1,pos_english=False)
print('2.汉语标注模式:\n' + str(test2))#关闭词性标注
test3 = pynlpir.segment(text1,pos_tagging=False)
print('3.无词性标注模式:\n' + str(test3))

测试结果如下图所示:

自然语言处理入门(4)——中文分词原理及分词工具介绍相关推荐

  1. 详细介绍NLP中文分词原理及分词工具

    基于词表的分词方法 正向最大匹配算法FMM 从左到右扫描文本,得到词的最大匹配. 案例分析: 用正向最大匹配法对"秦皇岛今天晴空万里"进行中文分词,见下表. 词典 :"秦 ...

  2. 中文分词原理及分词工具介绍

    中文分词学习记录 中文分词 实现方法 基于字符串匹配的分词方法 基于理解的分词方法 基于统计的分词方法 工具介绍 结巴分词 SnowNLP 北大PKUSEG 中文分词 首先,我们将介绍中文分词的思想和 ...

  3. 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介...

    <自然语言处理实战入门> ---- 第4课 :中文分词原理及相关组件简介 之 语言学与分词技术简介 https://edu.csdn.net/course/play/20769/25954 ...

  4. 《自然语言处理实战入门》 第三章 :中文分词原理及相关组件简介 ---- 语言学与分词技术简介

    文章大纲 0.内容梗概 1. 汉语语言学简介 1.1 汉语与汉字的起源 1.2 汉字的统一与演变 1.3 印欧语系与汉藏语系 1.4 语言区别对于NLP 的影响 2. 词汇与分词技术简介 2.1 汉语 ...

  5. 《自然语言处理实战入门》 ---- 第4课 :中文分词原理及相关组件简介 之 汉语分词领域主要分词算法、组件、服务(上)...

    目录 0.内容梗概 1. 基于传统统计算法的分词组件 1.1 hanlp : Han Language Processing 1.2 语言技术平台(Language Technology Platfo ...

  6. 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介 ---- 工业级词法分析组件百度LAC2.0

    文章大纲 简介 工具介绍 安装与使用 安装说明 功能与使用 分词 词性标注与实体识别 定制化功能 增量训练 1. 分词训练 2. 词法分析训练 文件结构 效果 原理 参考文献 简介 LAC全称Lexi ...

  7. 《自然语言处理实战入门》第三章 :中文分词原理及相关组件简介 ---- 汉语分词领域主要分词算法、组件、服务(上)

    文章大纲 0.内容梗概 1. 基于传统统计算法的分词组件 1.1 hanlp : Han Language Processing 1.1.1 pyhanlp 安装 1.1.2 功能及分词样例 1.1. ...

  8. 自然语言处理学习笔记2:分词工具及分词原理

    中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词.分词就是将连续的字序列按照一定的规范重新组合成词序列的过程.我们知道,在英文的行文中,单词之 ...

  9. 自然语言处理课程(二):Jieba分词的原理及实例操作

    上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...

  10. 结巴分词优点_中文分词概述及结巴分词原理

    词是中文表达语义的最小单位,中文分词是中文文本处理的一个基础步骤,分词的结果对中文信息处理至为关键. 本文先对中文分词方法进行概述,然后简单介绍结巴分词背后的原理. 1. 中文分词概述 中文分词根据实 ...

最新文章

  1. java实体属性对应mysql和SQL Server 和Oracle 数据类型对应
  2. c语言 strlower 将所有的字母转化为小写字母
  3. Android拖动和缩放图片
  4. [Objective-c 基础 - 2.4] 多态
  5. 【Blog.Core重要升级】:封装服务扩展层
  6. word和html互换,word与html互转(2) -- html转word
  7. 腾讯云对象存储 python_GitHub - fushall1104/cos-python3-sdk: 腾讯云对象存储服务(cos)Python3.5版本SDK...
  8. C语言 JSON 解析库 - MJSON使用介绍
  9. Android Gallery3D源码分析
  10. fread 单独测试没有问题 在正式项目里面丢数据 可能是系统资源不足 预读出了问题
  11. C# 性能优化之斤斤计较篇 一
  12. 【bzoj1449/bzoj2895】[JSOI2009]球队收益/球队预算 费用流
  13. 【转】为VS2005安装STLport
  14. 日程表模板html,日程安排表EXCEL模板
  15. 《麻省理工学院公开课:人工智能》笔记二
  16. Effective C++ 读书笔记(五)
  17. CentOS 7 minimal安装完成之后安装图形界面
  18. 笔记本合上盖子锁定计算机,解决:win10笔记本电脑不合上盖子时也锁定
  19. 你还在抱怨职场的不公吗?
  20. ABC157 D - Friend Suggestions 题解

热门文章

  1. linux如何安装usb转串口驱动,虚拟机下Ubuntu安装usb转串口驱动
  2. rs232转usb线故障(ft232r usb uart驱动安装失败)
  3. 长文图解工业HART总线协议
  4. 查阅国外文献的网站有哪些?
  5. rs232读取智能电表_预付费电表高性价比型号推荐 预付费抄表系统免费安装
  6. eos java调用命名sql_普元 EOS Platform 7.6 开发命名SQL缓存示例
  7. 时间操作 - 时间格式转换
  8. 【Java基础】建立Java面向对象编程OOP模型
  9. qunee for html5 绘图
  10. games101-789-shading