精确模式将句子最精确的切分开,每个词都只有一种含义。
import jieba
seg_list1=jieba.cut("人生最宝贵的是生命,人生最需要的是学习,人生最愉快的是工作,人生最重要的是友谊。",cut_all=False)
print("Default Mode:"+"/".join(seg_list1))
Default Mode:人生/最/宝贵/的/是/生命/,/人生/最/需要/的/是/学习/,/人生/最/愉快/的/是/工作/,/人生/最/重要/的/是/友谊/。
全模式把句子中所有的可以成词的词语都扫描出来, 会出现一词多用、一词多意。
seg_list2=jieba.cut("我来自长沙某高校,是一名平平无奇的大学一年级的好学生。",cut_all=True)
print("Full Mode:"+"/".join(seg_list2))
Full Mode:我/来自/长沙/某/高校/,/是/一名/平平/无奇/的/大学/一年/一年级/年级/的/好学/学生/。
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
seg_list3=jieba.cut_for_search("自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。")
print("Search Mode:"+",".join(seg_list3))
Search Mode:自然,语言,自然语言,处理,是,计算,算机,科学,计算机,计算机科学,领域,与,人工,智能,人工智能,领域,中,的,一个,重要,方向,。,它,研究,能,实现,人,与,计算,算机,计算机,之间,用,自然,语言,自然语言,进行,有效,通信,的,各种,理论,和,方法,。
<比如一些四川话就不能识别>
于是我整理了一下四川方言锦集
自定义词典文件的词汇格式是一个词占一行,每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
#不添加自定义词典
seg_list4=jieba.cut("莫来头,反正你都开腔叫我老汉儿了,幺儿乖。莫摆龙门阵了,你假巴意思学一下,不然明天考试就洗白了。")
print("/".join(seg_list4))
#载入词典
jieba.load_userdict("四川方言.txt")
seg_list5=jieba.cut("莫来头,反正你都开腔叫我老汉儿了,幺儿乖。莫摆龙门阵了,你假巴意思学一下,不然明天考试就洗白了。")
print("/".join(seg_list5))
效果差别
莫/来头/,/反正/你/都/开腔/叫/我/老汉/儿/了/,/幺/儿/乖/。/莫/摆龙门阵/了/,/你/假巴/意思/学/一下/,/不然/明天/考试/就/洗白/了/。
莫来头/,/反正/你/都/开腔/叫/我/老汉儿/了/,/幺儿/乖/。/莫/摆龙门阵/了/,/你/假巴意思/学/一下/,/不然/明天/考试/就/洗白/了/。
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
import jieba.posseg as pseg
words=pseg.cut("我爱北京天安门")
for word,flag in words:
print("%s %s"%(word,flag))
我 r
爱 v
北京 ns
天安门 ns
注意:输入参数只接受 unicode
#默认模式
result = jieba.tokenize(u'好好学习天天向上')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 好好学习 start: 0 end:4
word 天天向上 start: 4 end:8
#搜索模式
result = jieba.tokenize(u'好好学习天天向上', mode='search')
for tk in result:
print("word %s\t\t start: %d \t\t end:%d" % (tk[0],tk[1],tk[2]))
word 好好 start: 0 end:2
word 好学 start: 1 end:3
word 学习 start: 2 end:4
word 好好学 start: 0 end:3
word 好好学习 start: 0 end:4
word 天天 start: 4 end:6
word 向上 start: 6 end:8
word 天天向上 start: 4 end:8
以浪潮之巅介绍为例(也可以随便找一个文本文档)
# -*- coding: utf-8 -*-
import jieba
txt = open("浪潮之巅.txt", "r", encoding='utf-8').read()
words = jieba.lcut(txt) # 使用精确模式对文本进行分词
counts = {} # 通过键值对的形式存储词语及其出现的次数
for word in words:
if len(word) == 1: # 单个词语不计算在内
continue
else:
counts[word] = counts.get(word, 0) + 1 # 遍历所有词语,每出现一次其对应的值加 1
items = list(counts.items())
items.sort(key=lambda x: x[1], reverse=True) # 根据词语出现的次数进行从大到小排序
for i in range(3):
word, count = items[i]
print("{0:<5}{1:>5}".format(word, count))