一、介绍
官网:https://pypi.org/project/jieba/
官方文档:https://github.com/fxsjy/jieba
jiaba是第三方模块
中文分词(Chinese Word Segmentation)将一个汉字序列切分成一个个单独的词。
下载:pip install jieba
二、特点
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 | 搜索引擎模式,返回一个列表类型 |
##精确模式import jiebaword1 =jieba.cut("今天天气很好,我们一起去远足吧!")print(','.join(word1)) ##将可迭代对象用逗号连接后输出,word1 =jieba.cut("今天天气很好,我们一起去远足吧!")print(list(word1)) ##将可迭代对象转换成字典后输出word2 =jieba.lcut("今天天气很好,我们一起去远足吧!")print(word2) ##lcut输出的结果为列表##结果Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cacheLoading model cost 1.113 seconds.Prefix dict has been built successfully.今天天气,很,好,,,我们,一起,去,远足,吧,!['今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']['今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']##全模式import jiebaword1 = jieba.cut("今天天气很好,我们一起去远足吧!",cut_all=True)print(list(word1))word2 = jieba.lcut("今天天气很好,我们一起去远足吧!",cut_all=True)print(list(word2))##结果['今天', '今天天气', '天天', '天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']['今天', '今天天气', '天天', '天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']##搜索引擎模式import jiebaword1 = jieba.cut_for_search("今天天气很好,我们一起去远足吧!")print(list(word1))##结果['今天', '天天', '天气', '今天天气', '很', '好', ',', '我们', '一起', '去', '远足', '吧', '!']
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) | 可调节单个词语的词频,使其能(或不能)被分出来。 |
##增加新词import jiebaprint(jieba.lcut("南普陀寺的椰子味的素饼很不错"))jieba.add_word("南普陀寺") ##添加新词print(jieba.lcut("南普陀寺的椰子味的素饼很不错"))##结果Prefix dict has been built successfully.['南普陀', '寺', '的', '椰子', '味', '的', '素饼', '很', '不错']['南普陀寺', '的', '椰子', '味', '的', '素饼', '很', '不错']
五、实例
统计三生三世十里桃花里面出场次数排名前10位的人物
import jiebatxt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()words = jieba.lcut(txt) #精确分词,返回一个列表counts = {} #用字典类型存储人物及出现的次数for word in words:if len(word)!=1: #不统计单个汉字的词汇counts[word] =counts.get(word,0)+1listitem = list(counts.items()) #将字典转换成列表#按列表中每个元组第二个位置元素的值(即人数)降序排序#key 指明排序前被调用的函数,reverse指定降序排序listitem.sort(key = lambda x:x[1],reverse =True)#人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1print("{0:<10}{1:>8}".format("人物","出场次数"))for i in range(10):##listitem 是一个元组类型的元素word = listitem[i][0]count = listitem[i][1]#word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1print("{0:-<10}{1:->10}".format(word,count))##结果Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cacheLoading model cost 0.989 seconds.Prefix dict has been built successfully.人物 出场次数夜华---------------489一个---------------448这个---------------411什么---------------289团子---------------282有些---------------244墨渊---------------239十分---------------239这么---------------223觉得---------------216
改进版,将输出中无关人名的词汇去掉,然后重新统计
##改进版,将输出中无关人名的词汇去掉,然后重新统计import jieba##无关人名,需要被排除的词汇excluder ={"一个","这个","什么","有些","十分","这么","觉得","自己","不是","不过","我们","神仙","晓得","不能","一声","他们","如今","这样","心中","眼睛","还是","两个","青丘","一番","出来","狐狸","今日","此番","海水","自然","过来","方才","怎么","师父","昆仑","师兄","时候","一张","便是"}txt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()words = jieba.lcut(txt) #精确分词,返回一个列表counts = {} #用字典类型存储人物及出现的次数for word in words:if len(word)!=1: #不统计单个汉字的词汇counts[word] =counts.get(word,0)+1#删除与人名无关的词汇for word in excluder:del(counts[word])listitem = list(counts.items()) #字典类型不能排序,需要将字典转换成列表#按列表中每个元组第二个位置元素的值(即人数)降序排序#key 指明排序前被调用的函数,reverse指定降序排序listitem.sort(key = lambda x:x[1],reverse =True)#人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1print("{0:<10}{1:>8}".format("人物","出场次数"))for i in range(10):##listitem 是一个元组类型的元素word = listitem[i][0]count = listitem[i][1]#word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1print("{0:-<10}{1:->10}".format(word,count))##结果Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cacheLoading model cost 1.226 seconds.Prefix dict has been built successfully.人物 出场次数夜华---------------489团子---------------282墨渊---------------239天君---------------191折颜---------------157四哥---------------147糯米---------------127元贞---------------110离镜---------------100姑姑----------------96
发现重要人物没有出现在前10的行列中,需要在词典中增加这个名词重新统计
##发现重要人物没有出现在前10的行列中,需要在词典中增加这个名词重新统计import jieba##无关人名,需要被排除的词汇excluder ={"一个","这个","什么","有些","十分","这么","觉得","自己","不是","不过","我们","神仙","晓得","不能","一声","他们","如今","这样","心中","眼睛","还是","两个","青丘","一番","出来","狐狸","今日","此番","海水","自然","过来","方才","怎么","师父","昆仑","师兄","时候","一张","便是"}txt = open("E:\\pythonstduy\\wenben\\sanshengsanshi.txt","r",encoding="utf-8").read()##三生三世十里桃花人物namelist =["白浅","夜华","凤九","折颜","东华帝君","素锦","离镜","白真","阿离","司命","玄女","胭脂","天君","擎苍","少辛","迷谷","叠风","令羽","连宋","浅浅","素素"]##将人物添加到jieba词典中for name in namelist:jieba.add_word(name)words = jieba.lcut(txt) #精确分词,返回一个列表counts = {} #用字典类型存储人物及出现的次数for word in words:if len(word)!=1: #不统计单个汉字的词汇counts[word] =counts.get(word,0)+1#删除与人名无关的词汇for word in excluder:del(counts[word])listitem = list(counts.items()) #字典类型不能排序,需要将字典转换成列表#按列表中每个元组第二个位置元素的值(即人数)降序排序#key 指明排序前被调用的函数,reverse指定降序排序listitem.sort(key = lambda x:x[1],reverse =True)#人物左对齐,宽度为10,位置在0 出场次数,宽度为8,位置在1print("{0:<10}{1:>8}".format("人物","出场次数"))for i in range(10):##listitem 是一个元组类型的元素word = listitem[i][0]count = listitem[i][1]#word左对齐,向右填充-符号,word的宽度为10,位置在0 count右对齐,向左填充-符号,count的宽度为10,位置在1print("{0:-<10}{1:->10}".format(word,count))##结果Loading model from cache C:\Users\lh\AppData\Local\Temp\jieba.cacheLoading model cost 1.066 seconds.Prefix dict has been built successfully.人物 出场次数夜华---------------733团子---------------282折颜---------------270墨渊---------------238天君---------------238四哥---------------147素锦---------------135糯米---------------127迷谷---------------115离镜---------------110
