中文分词工具jieba的简介|小册免费学

1,109 阅读7分钟

作者:看那个码农

公众号:看那个码农

1.jieba简介

在自然语言处理任务时中文文本需要通过分词获得单个的词语,这个时候就需要用到中文分词工具jieba

jieba分词是一个开源项目,地址为github.com/fxsjy/jieba

它在分词准确度和速度方面均表现不错。

2.jieba的安装

  1. 全自动安装
pip install jieba / pip3 install jieba
  1. 半自动安装
  1. 手动安装:
  • 将 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)))

输出为

image.png

  • 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编码

自定义字典的定义如下所示:

image.png

  • 每个词占一行,而每一行由三部分组成。
  • 由空格分隔,分别是:词语、词频和词性。
  • 其中词频和词性可以省略,但顺序不可改变。

然后编辑下面的代码看看实际应用

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)))

输出为

image.png

我们可以看见分词按照我们的意愿进行了划分

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))

输出为

image.png

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))

输出为

image.png

结巴分词词性对照表如下: 参考:结巴词性对照表

形容词区别词连词副词叹词方位词
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 网址URLule 了 喽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]))

输出为

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。

本文正在参与「掘金小册免费学啦!」活动, 点击查看活动详情