作者:看那个码农
公众号:看那个码农
1.jieba简介
在自然语言处理任务时中文文本需要通过分词获得单个的词语,这个时候就需要用到中文分词工具jieba
jieba分词是一个开源项目,地址为github.com/fxsjy/jieba
它在分词准确度和速度方面均表现不错。
2.jieba的安装
- 全自动安装
pip install jieba / pip3 install jieba
- 半自动安装
- 先下载pypi.python.org/pypi/jieba/
- 解压后运行
python setup.py install
- 手动安装:
- 将 jieba 的整个目录放置于python的site-packages 目录中
3.jieba的分词原理分析
- 初始化。加载词典文件,获取每个词语和它出现的词数
- 切分短语。利用正则,将文本切分为一个个语句,之后对语句进行分词
- 构建DAG。通过字符串匹配,构建所有可能的分词情况的有向无环图,也就是DAG
- 构建节点最大路径概率,以及结束位置。计算每个汉字节点到语句结尾的所有路径中的最大概率,并记下最大概率时在DAG中对应的该汉字成词的结束位置。
- 构建切分组合。根据节点路径,得到词语切分的结果,也就是分词结果。
- HMM新词处理:对于新词,也就是jieba词典中没有的词语,我们通过统计方法来处理,jieba中采用了HMM(隐马尔科夫模型)来处理。
- 返回分词结果:通过yield将上面步骤中切分好的词语逐个返回。yield相对于list,可以节约存储空间。 HMM模型:隐马尔可夫模型
4.jieba的特点
1.jieba的三种分词模式
Jieba支持三种分词模式
- 精确模式:把文本精确的切分开,不存在冗余单词。
- 全模式:把文本中所有可能的词语都扫描出来,有冗余。
- 搜索引擎模式:在精确模式基础上,对长词再次切分。
我们用一个案例来演示一下jieba的三种模式
import jieba
sentence = '我爱重庆酸辣粉和老火锅'
seg_list = jieba.cut(sentence, cut_all=True)
print('全模式:{}'.format('/ '.join(seg_list)))
seg_list = jieba.cut(sentence, cut_all=False)
print('精准模式:{}'.format('/ '.join(seg_list)))
seg_list = jieba.cut_for_search(sentence)
print('搜索引擎模式:{}'.format('/ '.join(seg_list)))
输出为
- jieba.cut函数可以接受三个参数,第一个参数是需要分词的字符串;第二个参数cut_all是控制是否采用全模式,默认是False,是使用精准模式;第三个参数是用来控制是否使用HMM模型来识别未登录词。
- jieba.cut_for_search函数可以接受两个参数,第一个参数是需要分词的字符串;第二个参数是用来控制是否使用HMM模型。
2.jieba支持支持繁体分词
3.jieba支持自定义词典
4.jieba支持MIT 授权协议(开源软件许可协议)
5.jieba的载入自定义词典
jieba的基础用法只能满足我们最基本的分词需求,而实际情况会更复杂一些。
Jieba分词的过程中,jieba词库里往往有很多没有定义的新词汇,这样就使得jieba不能按照开发者的意愿进行分词,那么我们如何解决呢?
方法就是载入自定义词典
使用jieba.load_userdict函数加载自定义词典,
- 该函数只接受一个参数,
- 参数为文件类对象或自定义词典的路径。
- 需要特别注意的是文件必须是UTF-8编码
自定义字典的定义如下所示:
- 每个词占一行,而每一行由三部分组成。
- 由空格分隔,分别是:词语、词频和词性。
- 其中词频和词性可以省略,但顺序不可改变。
然后编辑下面的代码看看实际应用
import jieba
sentence = '我爱重庆酸辣粉和重庆老火锅'
seg_list = jieba.cut(sentence)
print('没有自定义词典:{}'.format('/ '.join(seg_list)))
jieba.load_userdict('./userdict.txt')
seg_list = jieba.cut(sentence)
print('有自定义词典:{}'.format('/ '.join(seg_list)))
输出为
我们可以看见分词按照我们的意愿进行了划分
6.jieba的词典语言调整
很多时候我们没有必要使用自定义词典,加大开发的难度。 因此jieba给我们提供了调整词典的函数。
- 通过
jieba.add_word(word, freq=None, tag=None)和jieba.del_word(word)这两个函数,可以动态地增删词典。 - 通过
suggest_freq(segment, tune=True)这个函数,可以调节单个词语的词频,使其能或不能被切分。
例如下面案例所示:
import jieba
sentence="我吃酸辣粉"
words="酸辣粉"
jieba.add_word(words)
jieba.suggest_freq(('酸辣粉'), tune=True)
seg_list = jieba.cut(sentence)
print('\ '.join(seg_list))
输出为
7.jieba的词性标注
jieba除了提供了分词功能之外,还提供了词性标注的功能,词性标注对于文本挖掘的帮助很大。
标注句子分词后每个词的词性,采用和ictclas兼容的标记法
- ictclas:汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)
例如下面的案例
import jieba.posseg as pseg
words = pseg.cut('我吃酸辣粉')
for word, flag in words:
print('{} {}'.format(word, flag))
输出为
结巴分词词性对照表如下: 参考:结巴词性对照表
| 形容词 | 区别词 | 连词 | 副词 | 叹词 | 方位词 |
|---|---|---|---|---|---|
| a 形容词 | b 区别词 | c 连词 | d 副词 | e 叹词 | f 方位词 |
| ad 副形词 | bl 区别词性惯用语 | cc 并列连词 | |||
| an 名形词 | |||||
| ag 形容词性语素 | |||||
| al 形容词性惯用语 |
| 前缀 | 后缀 | 数词 | 名词 | 拟声词 | 介词 |
|---|---|---|---|---|---|
| h 前缀 | k 后缀 | m 数词 | n 名词 | o 拟声词 | p 介词 |
| mq 数量词 | nr 人名 | pba 介词“把” | |||
| nr1 汉语姓氏 | pbei 介词“被” | ||||
| nr2 汉语名字 | |||||
| nrj 日语人名 | |||||
| nrf 音译人名 | |||||
| ns 地名 | |||||
| nsf 音译地名 | |||||
| nt 机构团体名 | |||||
| nz 其它专名 | |||||
| nl 名词性惯用语 | |||||
| ng 名词性语素 | |||||
| ns 地名 |
| 量词 | 代词 | 处所词 | 时间词 | 助词 | 动词 |
|---|---|---|---|---|---|
| q 量词 | r 代词 | s 处所词 | t 时间词 | u 助词 | v 动词 |
| qv 动量词 | rr 人称代词 | tg 时间词性语素 | uzhe 着 | vd 副动词 | |
| qt 时量词 | rz 指示代词 | ule 了 喽 | vshi 动词“是” | ||
| rzt 时间指示代词 | uguo 过 | vyou 动词“有” | |||
| rzs 处所指示代词 | ude1 的 底 | vf 趋向动词 | |||
| rzv 谓词性指示代词 | ude2 地 | vx 形式动词 | |||
| ry 疑问代词 | ude3 得 | vi 不及物动词(内动词) | |||
| ryt 时间疑问代词 | usuo 所 | vl 动词性惯用语 | |||
| rys 处所疑问代词 | udeng 等 等等 云云 | vg 动词性语素 | |||
| ryv 谓词性疑问代词 | uyy 一样 一般 似的 般 | ||||
| rg 代词性语素 | udh 的话 | ||||
| uls 来讲 来说 而言 说来 | |||||
| uzhi 之 | |||||
| ulian 连 (“连小学生都会”) |
| 标点符号 | 字符串 | 语气词 | 状态词 | ||
|---|---|---|---|---|---|
| w 标点符号 | x 字符串 | y 语气词(delete yg) | z 状态词 | ||
| wkz 左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { < | xx 非语素字 | tg 时间词性语素 | uzhe 着 | vd 副动词 | |
| wky 右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { > | xu 网址URL | ule 了 喽 | vshi 动词“是” | ||
| wyz 左引号,全角:“ ‘ 『 | uguo 过 | vyou 动词“有” | |||
| wyy 右引号,全角:” ’ 』 | ude1 的 底 | vf 趋向动词 | |||
| wj 句号,全角:。 | ude2 地 | vx 形式动词 | |||
| ww 问号,全角:? 半角:? | ude3 得 | vi 不及物动词(内动词) | |||
| wt 叹号,全角:! 半角:! | usuo 所 | vl 动词性惯用语 | |||
| wd 逗号,全角:, 半角:, | udeng 等 等等 云云 | vg 动词性语素 | |||
| wf 分号,全角:; 半角: ; | uyy 一样 一般 似的 般 | ||||
| wn 顿号,全角:、 | udh 的话 | ||||
| wm 冒号,全角:: 半角: : | uls 来讲 来说 而言 说来 | ||||
| ws 省略号,全角:…… … | uzhi 之 | ||||
| wp 破折号,全角:—— -- ——- 半角:--- ---- | ulian 连 (“连小学生都会”) | ||||
| wb 百分号千分号,全角:% ‰ 半角:% | ulian 连 (“连小学生都会”) | ||||
| wh 单位符号,全角:¥ $ £ ° ℃ 半角:$ | ulian 连 (“连小学生都会”) |
8.jieba的并行分词
将目标文本按行分隔后,把各行文本分配到多个python进程并行分词,然后归并结果,从而获得分词速度的可观提升。
用法:
jieba.enable_parallel(5)# 开启并行分词模式,参数为并行进程数jieba.disable_parallel()# 关闭并行分词模式
jieba在其github页面提供了一组性能测试数据:
在 4 核 3.4GHz Linux 机器上,对金庸全集进行精确分词,获得了 1MB/s 的速度,是单进程版的 3.3 倍。
9.jieba的Tokenize
jieba库使用返回Tokenize来返回词语在原文的起始位置
例如下下面的案例:
import jieba
words= jieba.tokenize('我吃酸辣粉')
for tk in words:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0], tk[1], tk[2]))
输出为
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。
本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情