一、介绍

官网:https://pypi.org/project/jieba/
官方文档:https//github.com/fxsjy/jieba
jiaba是第三方模块
中文分词(Chinese Word Segmentation)将一个汉字序列切分成一个个单独的词。
下载:pip install jieba
image.png

二、特点

1.支持四种分词模式:

  • 精确模式:将句子最精确地切开,适合文本分析
  • 全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
  • paddl而漠视:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。paddle模式使用需安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。目前paddle模式支持jieba v0.40及以上版本。

2.支持繁体分词
3.支持自定义词典
4.MIT协议(开源软件许可协议)授权

三、算法

基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG)
采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合
对于未登录词,采用了基于汉字成词能力的 HMM 模型,使用了 Viterbi 算法

四、主要功能

4.1 分词

函数名 说明
jieba.cut(s) 精确模式,返回可迭代类型genertor
jieba.lcut(s) 精确模式,返回列表类型
jiaba.cut(s,cut_all=True) 全模式,输出文本s中所有可能的值,返回可迭代类型genertor
jieba.lcut(s,cut_all=True) 全模式,返回列表类型
jieba.cut_for_search(s) 搜索引擎模式,适合搜索引擎建立索引的分词结果,粒度比较细
jieba.lcut_for_search(s 搜索引擎模式,返回一个列表类型
  1. ##精确模式
  2. import jieba
  3. word1 =jieba.cut("今天天气很好,我们一起去远足吧!")
  4. print(','.join(word1)) ##将可迭代对象用逗号连接后输出,
  5. word1 =jieba.cut("今天天气很好,我们一起去远足吧!")
  6. print(list(word1)) ##将可迭代对象转换成字典后输出
  7. word2 =jieba.lcut("今天天气很好,我们一起去远足吧!")
  8. print(word2) ##lcut输出的结果为列表
  9. ##结果
  10. Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cache
  11. Loading model cost 1.113 seconds.
  12. Prefix dict has been built successfully.
  13. 今天天气,很,好,,,我们,一起,去,远足,吧,!
  14. ['今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']
  15. ['今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']
  16. ##全模式
  17. import jieba
  18. word1 = jieba.cut("今天天气很好,我们一起去远足吧!",cut_all=True)
  19. print(list(word1))
  20. word2 = jieba.lcut("今天天气很好,我们一起去远足吧!",cut_all=True)
  21. print(list(word2))
  22. ##结果
  23. ['今天', '今天天气', '天天', '天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']
  24. ['今天', '今天天气', '天天', '天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']
  25. ##搜索引擎模式
  26. import jieba
  27. word1 = jieba.cut_for_search("今天天气很好,我们一起去远足吧!")
  28. print(list(word1))
  29. ##结果
  30. ['今天', '天天', '天气', '今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']

4.2 载入词典

开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率

方法 说明
jieba.load_userdict(file_name) file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。

4.3 调整词典

方法 说明
add_word(word, freq=None, tag=None) 向分词词典中增加新词w
del_word(word) 向分词词典中删除词w
suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
  1. ##增加新词
  2. import jieba
  3. print(jieba.lcut("南普陀寺的椰子味的素饼很不错"))
  4. jieba.add_word("南普陀寺") ##添加新词
  5. print(jieba.lcut("南普陀寺的椰子味的素饼很不错"))
  6. ##结果
  7. Prefix dict has been built successfully.
  8. ['南普陀', '寺', '的', '椰子', '味', '的', '素饼', '很', '不错']
  9. ['南普陀寺', '的', '椰子', '味', '的', '素饼', '很', '不错']

五、实例

统计三生三世十里桃花里面出场次数排名前10位的人物

  1. import jieba
  2. txt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()
  3. words = jieba.lcut(txt) #精确分词,返回一个列表
  4. counts = {} #用字典类型存储人物及出现的次数
  5. for word in words:
  6. if len(word)!=1: #不统计单个汉字的词汇
  7. counts[word] =counts.get(word,0)+1
  8. listitem = list(counts.items()) #将字典转换成列表
  9. #按列表中每个元组第二个位置元素的值(即人数)降序排序
  10. #key 指明排序前被调用的函数,reverse指定降序排序
  11. listitem.sort(key = lambda x:x[1],reverse =True)
  12. #人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1
  13. print("{0:<10}{1:>8}".format("人物","出场次数"))
  14. for i in range(10):
  15. ##listitem 是一个元组类型的元素
  16. word = listitem[i][0]
  17. count = listitem[i][1]
  18. #word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1
  19. print("{0:-<10}{1:->10}".format(word,count))
  20. ##结果
  21. Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cache
  22. Loading model cost 0.989 seconds.
  23. Prefix dict has been built successfully.
  24. 人物 出场次数
  25. 夜华---------------489
  26. 一个---------------448
  27. 这个---------------411
  28. 什么---------------289
  29. 团子---------------282
  30. 有些---------------244
  31. 墨渊---------------239
  32. 十分---------------239
  33. 这么---------------223
  34. 觉得---------------216

改进版,将输出中无关人名的词汇去掉,然后重新统计

  1. ##改进版,将输出中无关人名的词汇去掉,然后重新统计
  2. import jieba
  3. ##无关人名,需要被排除的词汇
  4. excluder ={"一个","这个","什么","有些","十分","这么",
  5. "觉得","自己","不是","不过","我们","神仙",
  6. "晓得","不能","一声","他们","如今","这样",
  7. "心中","眼睛","还是","两个","青丘","一番",
  8. "出来","狐狸","今日","此番","海水","自然",
  9. "过来","方才","怎么","师父","昆仑","师兄",
  10. "时候","一张","便是"}
  11. txt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()
  12. words = jieba.lcut(txt) #精确分词,返回一个列表
  13. counts = {} #用字典类型存储人物及出现的次数
  14. for word in words:
  15. if len(word)!=1: #不统计单个汉字的词汇
  16. counts[word] =counts.get(word,0)+1
  17. #删除与人名无关的词汇
  18. for word in excluder:
  19. del(counts[word])
  20. listitem = list(counts.items()) #字典类型不能排序,需要将字典转换成列表
  21. #按列表中每个元组第二个位置元素的值(即人数)降序排序
  22. #key 指明排序前被调用的函数,reverse指定降序排序
  23. listitem.sort(key = lambda x:x[1],reverse =True)
  24. #人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1
  25. print("{0:<10}{1:>8}".format("人物","出场次数"))
  26. for i in range(10):
  27. ##listitem 是一个元组类型的元素
  28. word = listitem[i][0]
  29. count = listitem[i][1]
  30. #word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1
  31. print("{0:-<10}{1:->10}".format(word,count))
  32. ##结果
  33. Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cache
  34. Loading model cost 1.226 seconds.
  35. Prefix dict has been built successfully.
  36. 人物 出场次数
  37. 夜华---------------489
  38. 团子---------------282
  39. 墨渊---------------239
  40. 天君---------------191
  41. 折颜---------------157
  42. 四哥---------------147
  43. 糯米---------------127
  44. 元贞---------------110
  45. 离镜---------------100
  46. 姑姑----------------96

发现重要人物没有出现在前10的行列中,需要在词典中增加这个名词重新统计

  1. ##发现重要人物没有出现在前10的行列中,需要在词典中增加这个名词重新统计
  2. import jieba
  3. ##无关人名,需要被排除的词汇
  4. excluder ={"一个","这个","什么","有些","十分","这么",
  5. "觉得","自己","不是","不过","我们","神仙",
  6. "晓得","不能","一声","他们","如今","这样",
  7. "心中","眼睛","还是","两个","青丘","一番",
  8. "出来","狐狸","今日","此番","海水","自然",
  9. "过来","方才","怎么","师父","昆仑","师兄",
  10. "时候","一张","便是"}
  11. txt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()
  12. ##三生三世十里桃花人物
  13. namelist =["白浅","夜华","凤九","折颜","东华帝君","素锦","离镜","白真","阿离","司命",
  14. "玄女","胭脂","天君","擎苍","少辛","迷谷","叠风","令羽","连宋","浅浅","素素"]
  15. ##将人物添加到jieba词典中
  16. for name in namelist:
  17. jieba.add_word(name)
  18. words = jieba.lcut(txt) #精确分词,返回一个列表
  19. counts = {} #用字典类型存储人物及出现的次数
  20. for word in words:
  21. if len(word)!=1: #不统计单个汉字的词汇
  22. counts[word] =counts.get(word,0)+1
  23. #删除与人名无关的词汇
  24. for word in excluder:
  25. del(counts[word])
  26. listitem = list(counts.items()) #字典类型不能排序,需要将字典转换成列表
  27. #按列表中每个元组第二个位置元素的值(即人数)降序排序
  28. #key 指明排序前被调用的函数,reverse指定降序排序
  29. listitem.sort(key = lambda x:x[1],reverse =True)
  30. #人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1
  31. print("{0:<10}{1:>8}".format("人物","出场次数"))
  32. for i in range(10):
  33. ##listitem 是一个元组类型的元素
  34. word = listitem[i][0]
  35. count = listitem[i][1]
  36. #word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1
  37. print("{0:-<10}{1:->10}".format(word,count))
  38. ##结果
  39. Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cache
  40. Loading model cost 1.066 seconds.
  41. Prefix dict has been built successfully.
  42. 人物 出场次数
  43. 夜华---------------733
  44. 团子---------------282
  45. 折颜---------------270
  46. 墨渊---------------238
  47. 天君---------------238
  48. 四哥---------------147
  49. 素锦---------------135
  50. 糯米---------------127
  51. 迷谷---------------115
  52. 离镜---------------110