python中文分词库jieba使用方法详解


Posted in Python onFebruary 11, 2020

安装python中文分词库jieba

法1:Anaconda Prompt下输入conda install jieba

法2:Terminal下输入pip3 install jieba

1、分词

1.1、CUT函数简介

cut(sentence, cut_all=False, HMM=True)

返回生成器,遍历生成器即可获得分词的结果

lcut(sentence)

返回分词列表

import jieba
sentence = '我爱自然语言处理'
# 创建【Tokenizer.cut 生成器】对象
generator = jieba.cut(sentence)
# 遍历生成器,打印分词结果
words = '/'.join(generator)
print(words)

打印结果

我/爱/自然语言/处理

import jieba
print(jieba.lcut('我爱南海中学'))

打印结果

[‘我', ‘爱', ‘南海中学']

1.2、分词模式

精确模式:精确地切开

全模式:所有可能的词语都切出,速度快

搜索引擎模式:在精确模式的基础上,对长词再次切分

import jieba
sentence = '订单数据分析'
print('精准模式:', jieba.lcut(sentence))
print('全模式:', jieba.lcut(sentence, cut_all=True))
print('搜索引擎模式:', jieba.lcut_for_search(sentence))

打印结果

精准模式: [‘订单', ‘数据分析']

全模式: [‘订单', ‘订单数', ‘单数', ‘数据', ‘数据分析', ‘分析']

搜索引擎模式: [‘订单', ‘数据', ‘分析', ‘数据分析']

1.3、词性标注

jieba.posseg
import jieba.posseg as jp
sentence = '我爱Python数据分析'
posseg = jp.cut(sentence)
for i in posseg:
 print(i.__dict__)
 # print(i.word, i.flag)

打印结果

{‘word': ‘我', ‘flag': ‘r'}
{‘word': ‘爱', ‘flag': ‘v'}
{‘word': ‘Python', ‘flag': ‘eng'}
{‘word': ‘数据分析', ‘flag': ‘l'}

词性标注表

标注 解释 标注 解释 标注 解释
a 形容词 mq 数量词 tg 时语素
ad 副形词 n 名词 u 助词
ag 形语素 ng 例:义 乳 亭 ud 例:得
an 名形词 nr 人名 ug 例:过
b 区别词 nrfg 也是人名 uj 例:的
c 连词 nrt 也是人名 ul 例:了
d 副词 ns 地名 uv 例:地
df 例:不要 nt 机构团体 uz 例:着
dg 副语素 nz 其他专名 v 动词
e 叹词 o 拟声词 vd 副动词
f 方位词 p 介词 vg 动语素
g 语素 q 量词 vi 例:沉溺于 等同于
h 前接成分 r 代词 vn 名动词
i 成语 rg 例:兹 vq 例:去? 去过 ??过
j 简称略语 rr 人称代词 x 非语素字
k 后接成分 rz 例:这位 y 语气词
l 习用语 s 处所词 z 状态词
m 数词 t 时间词 zg 例:且 ?F ?G

1.4、词语出现的位置

jieba.tokenize(sentence)
import jieba
sentence = '订单数据分析'
generator = jieba.tokenize(sentence)
for position in generator:
 print(position)

打印结果

(‘订单', 0, 2)
(‘数据分析', 2, 6)

2、词典

2.1、默认词典

import jieba, os, pandas as pd
# 词典所在位置
print(jieba.__file__)
jieba_dict = os.path.dirname(jieba.__file__) + r'\dict.txt'
# 读取字典
df = pd.read_table(jieba_dict, sep=' ', header=None)[[0, 2]]
print(df.head())
# 转字典
dt = dict(df.values)
print(dt.get('暨南大学'))

python中文分词库jieba使用方法详解

2.2、添词和删词

往词典添词

add_word(word, freq=None, tag=None)

往词典删词,等价于add_word(word, freq=0)

del_word(word)

import jieba
sentence = '天长地久有时尽,此恨绵绵无绝期'
# 添词
jieba.add_word('时尽', 999, 'nz')
print('添加【时尽】:', jieba.lcut(sentence))
# 删词
jieba.del_word('时尽')
print('删除【时尽】:', jieba.lcut(sentence))

打印结果

添加【时尽】: [‘天长地久', ‘有', ‘时尽', ‘,', ‘此恨绵绵', ‘无', ‘绝期']

删除【时尽】: [‘天长地久', ‘有时', ‘尽', ‘,', ‘此恨绵绵', ‘无', ‘绝期']

2.3、自定义词典加载

新建词典,按照格式【单词 词频 词性】添词,以UTF-8编码保存

使用函数load_userdict加载词典

import os, jieba
# 创建自定义字典
my_dict = 'my_dict.txt'
with open(my_dict, 'w', encoding='utf-8') as f:
 f.write('慕容紫英 9 nr\n云天河 9 nr\n天河剑 9 nz')
# 加载字典进行测试
sentence = '慕容紫英为云天河打造了天河剑'
print('加载前:', jieba.lcut(sentence))
jieba.load_userdict(my_dict)
print('加载后:', jieba.lcut(sentence))
os.remove(my_dict)

打印结果

加载前: [‘慕容', ‘紫英为', ‘云', ‘天河', ‘打造', ‘了', ‘天河', ‘剑']

加载后: [‘慕容紫英', ‘为', ‘云天河', ‘打造', ‘了', ‘天河剑']

2.4、使单词中的字符连接或拆分

suggest_freq(segment, tune=False)

import jieba
sentence = '上穷碧落下黄泉,两处茫茫皆不见'
print('修正前:', ' | '.join(jieba.cut(sentence)))
jieba.suggest_freq(('落', '下'), True)
print('修正后:', ' | '.join(jieba.cut(sentence)))

打印结果

修正前: 上穷 | 碧 | 落下 | 黄泉 | , | 两处 | 茫茫 | 皆 | 不见

修正后: 上穷 | 碧落 | 下 | 黄泉 | , | 两处 | 茫茫 | 皆 | 不见

3、jieba分词原理

基于词典,对句子进行词图扫描,生成所有成词情况所构成的有向无环图(Directed Acyclic Graph)

根据DAG,反向计算最大概率路径(动态规划算法;取对数防止下溢,乘法运算转为加法)

根据路径获取最大概率的分词序列

import jieba
sentence = '中心小学放假'
DAG = jieba.get_DAG(sentence)
print(DAG)
route = {}
jieba.calc(sentence, DAG, route)
print(route)

DAG

{0: [0, 1, 3], 1: [1], 2: [2, 3], 3: [3], 4: [4, 5], 5: [5]}

最大概率路径

{6: (0, 0), 5: (-9.4, 5), 4: (-12.6, 5), 3: (-20.8, 3), 2: (-22.5, 3), 1: (-30.8, 1), 0: (-29.5, 3)}

4、识别【带空格的词】

示例:使Blade Master这类中间有空格的词被识别

import jieba, re
sentence = 'Blade Master疾风刺杀Archmage'
jieba.add_word('Blade Master') # 添词
print('修改前:', jieba.lcut(sentence))
jieba.re_han_default = re.compile('(.+)', re.U) # 修改格式
print('修改后:', jieba.lcut(sentence))

打印结果

修改前: [‘Blade', ' ', ‘Master', ‘疾风', ‘刺杀', ‘Archmage']

修改后: [‘Blade Master', ‘疾风', ‘刺杀', ‘Archmage']

5、其它

5.1、并行分词

运行环境:linux系统

开启并行分词模式,参数n为并发数:jieba.enable_parallel(n)

关闭并行分词模式:jieba.disable_parallel()

5.2、关键词提取

基于TF-IDF:jieba.analyse

基于TextRank:jieba.textrank

import jieba.analyse as ja, jieba
text = '柳梦璃施法破解了狐仙的法术'
jieba.add_word('柳梦璃', tag='nr')
keywords1 = ja.extract_tags(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
print('基于TF-IDF:', keywords1)
keywords2 = ja.textrank(text, allowPOS=('n', 'nr', 'ns', 'nt', 'nz'))
print('基于TextRank:', keywords2)

打印结果

基于TF-IDF: [‘柳梦璃', ‘狐仙', ‘法术']

基于TextRank: [‘狐仙', ‘柳梦璃', ‘法术']

5.3、修改HMM参数

import jieba
text = '柳梦璃解梦C法'
print(jieba.lcut(text, HMM=False)) # ['柳', '梦', '璃', '解梦', 'C', '法']
print(jieba.lcut(text)) # ['柳梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['B']['C'] = -1e-9 # begin
print(jieba.lcut(text)) # ['柳梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['M']['梦'] = -100 # middle
print(jieba.lcut(text)) # ['柳', '梦璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['S']['梦'] = -.1 # single
print(jieba.lcut(text)) # ['柳', '梦', '璃', '解梦', 'C', '法']
jieba.finalseg.emit_P['E']['梦'] = -.01 # end
print(jieba.lcut(text)) # ['柳梦', '璃', '解梦', 'C', '法']
jieba.del_word('柳梦') # Force_Split_Words
print(jieba.lcut(text)) # ['柳', '梦', '璃', '解梦', 'C', '法']

print

[‘柳', ‘梦', ‘璃', ‘解梦', ‘C', ‘法']

[‘柳梦璃', ‘解梦', ‘C', ‘法']

[‘柳梦璃', ‘解梦', ‘C', ‘法']

[‘柳', ‘梦璃', ‘解梦', ‘C', ‘法']

[‘柳', ‘梦', ‘璃', ‘解梦', ‘C', ‘法']

[‘柳梦', ‘璃', ‘解梦', ‘C', ‘法']

[‘柳', ‘梦', ‘璃', ‘解梦', ‘C', ‘法']

更多关于python中文分词库jieba使用方法请查看下面的相关链接

Python 相关文章推荐
python遍历数组的方法小结
Apr 30 Python
Python中for循环控制语句用法实例
Jun 02 Python
简单介绍Python中的几种数据类型
Jan 02 Python
python简单实现操作Mysql数据库
Jan 29 Python
Django框架视图介绍与使用详解
Jul 18 Python
Jupyter Notebook 实现正常显示中文和负号
Apr 24 Python
Python如何使用队列方式实现多线程爬虫
May 12 Python
完美解决ARIMA模型中plot_acf画不出图的问题
Jun 04 Python
Pycharm导入anaconda环境的教程图解
Jul 31 Python
python程序的组织结构详解
Dec 06 Python
分享几种python 变量合并方法
Mar 20 Python
python单向链表实例详解
May 25 Python
Transpose 数组行列转置的限制方式
Feb 11 #Python
Tensorflow:转置函数 transpose的使用详解
Feb 11 #Python
tensorflow多维张量计算实例
Feb 11 #Python
python误差棒图errorbar()函数实例解析
Feb 11 #Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 #Python
python scatter函数用法实例详解
Feb 11 #Python
python可视化text()函数使用详解
Feb 11 #Python
You might like
让PHP开发者事半功倍的十大技巧小结
2010/04/20 PHP
php检测用户是否用手机(Mobile)访问网站的类
2014/01/09 PHP
PHP连接access数据库
2015/03/27 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
原生js实现给指定元素的后面追加内容
2013/04/10 Javascript
document.write的几点使用心得
2014/05/14 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
微信小程序搭建(mpvue+mpvue-weui+fly.js)的详细步骤
2018/09/18 Javascript
js中的this的指向问题详解
2019/08/29 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
python自动格式化json文件的方法
2015/03/11 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
举例讲解Python中的死锁、可重入锁和互斥锁
2015/11/05 Python
python生成器表达式和列表解析
2016/03/10 Python
Python基本语法经典教程
2016/03/11 Python
Python中字符串的处理技巧分享
2016/09/17 Python
win7下 python3.6 安装opencv 和 opencv-contrib-python解决 cv2.xfeatures2d.SIFT_create() 的问题
2019/10/24 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
python-docx文件定位读取过程(尝试替换)
2020/02/13 Python
Django与pyecharts结合的实例代码
2020/05/13 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
L’AGENCE官网:加州女装品牌
2018/06/03 全球购物
初中政治教学反思
2014/01/17 职场文书
酒店周年庆活动方案
2014/08/21 职场文书
Pytorch 实现变量类型转换
2021/05/17 Python
Java基于Dijkstra算法实现校园导游程序
2022/03/17 Java/Android