Python实现jieba分词

  • 2019 年 10 月 5 日
  • 笔记

Python实现jieba分词


今日知图替换

r  替换当前字符  R  替换当前行光标后的字符  

0.说在前面1.结巴分词三种模式2.自定义字典3.动态修改字典4.词性标注及关键字提取5.高级使用6.作者的话


0.说在前面

微信群讨论了jieba,这里我将学到的jieba分享一波,大家一起来学习一下。

1.结巴分词三种模式

默认模式

s_list=jieba.cut("我来到北京清华大学",cut_all=True) # 默认为False  print("[全模式]:"+'/'.join(s_list))  

精确模式

s_list=jieba.cut("我来到北京清华大学",) # 默认是精确模式cut_all=False  print("[默认模式]:"+'/'.join(s_list))  

搜索引擎模式

s_list=jieba.cut_for_search("小米毕业于中科院计算所,后来在日本东京大学留学深造") # 搜索引擎模式  print("[默认模式]:"+'/'.join(s_list))  

以上结果

[全模式]:我/来到/北京/清华/清华大学/华大/大学  [默认模式]:我/来到/北京/清华大学  [默认模式]:小米/毕业/于/中科/计算/中科院/计算所/中科院计算所/,/后来/在/日本/东京/大学/日本东京大学/留学/深造  

2.自定义字典

jieba默认分词

test_string=("医疗卫生事业是强国安民的光荣事业,是为实现中国梦奠定基础的伟大事业。")  words=jieba.cut(test_string)  print('jieba默认分词效果')  print('/'.join(words))  

加载自定义字典

# 自定义字典 test_string.txt  光荣事业 4 nz  中国梦 4 nl  奠定基础 4 nz  # 自定义字典实现  jieba.load_userdict('test_string.txt')  words=jieba.cut(test_string)  print("加载自定义字典后,分词效果")  print('/'.join(words))  

以上结果

jieba默认分词效果  医疗卫生/事业/是/强国/安民/的/光荣/事业/,/是/为/实现/中国/梦/奠定/基础/的/伟大事业/。  加载自定义字典后,分词效果  医疗卫生/事业/是/强国/安民/的/光荣事业/,/是/为/实现/中国/梦/奠定基础/的/伟大事业/。  

3.动态修改字典

t=jieba.suggest_freq(('医疗','卫生'),True)  print(t)  print('/'.join(jieba.cut(test_string, HMM=False)))  t=jieba.suggest_freq(('中国梦'),True)  print(t)  print('/'.join(jieba.cut(test_string, HMM=False)))  

以上结果

0  医疗/卫生事业/是/强国/安民/的/光荣事业/,/是/为/实现/中国/梦/奠定基础/的/伟大事业/。  9  医疗/卫生事业/是/强国/安民/的/光荣事业/,/是/为/实现/中国梦/奠定基础/的/伟大事业/。  

4.词性标注及关键字提取

import jieba.posseg as pseg  words=pseg.cut(test_string)  for word, flag in words:      print('%s %s' % (word, flag))  

以上结果

医疗 n  卫生事业 n  是 v  强国 n  安民 nr  的 uj  光荣事业 nz  , x  是 v  为 p  实现 v  中国梦 nl  奠定基础 nz  的 uj  伟大事业 nz  。 x  

5.高级使用

自定义处理:

----------自定义字典文件test_string.txt--------  光荣事业 4 nz  中国梦 4 nl  奠定基础 4 nz  ----------issue.py----------  import jieba  test_string=("医疗卫生事业是强国安民的光荣事业,是为实现中国梦奠定基础的伟大事业。")  words=jieba.cut(test_string)  print('jieba默认分词效果')  print('/'.join(words))  # 加载自定义字典  jieba.load_userdict('test_string.txt')  words=jieba.cut(test_string)  print("加载自定义字典后,分词效果")  print('/'.join(words))  ----------output----------  医疗卫生/事业/是/强国/安民/的/光荣/事业/,/是/为/实现/中国/梦/奠定/基础/的/伟大事业/。  加载自定义字典后,分词效果  医疗卫生/事业/是/强国/安民/的/光荣事业/,/是/为/实现/中国/梦/奠定基础/的/伟大事业/。  

问题

观察以上output会发现,光荣事业跟奠定基础按照了字典文件进行了合并,但是中国梦并没有,这是什么问题呢?

于是得出以下结论: jieba 分词自定义词典只对长词起作用 对如果定义的词比jieba自己分的短,则没有用

那如何解决呢?

直接改变主字典路径(0.28 之前的版本是不能指定主词典的路径的,有了延迟加载机制后,你可以改变主词典的路径),不用jieba默认的: 将issue.py中的jieba.load_userdict('test_string.txt') 替换为jieba.set_dictionary('test_string.txt') 此时输出:

jieba默认分词效果  医疗卫生/事业/是/强国/安民/的/光荣/事业/,/是/为/实现/中国/梦/奠定/基础/的/伟大事业/。  加载自定义字典后,分词效果  医疗/卫生/事业/是/强国安民/的/光荣事业/,/是/为/实现/中国梦/奠定基础/的/伟大事业/。