更详细的解释及举例请查看官方文本:jieba参考文档
支持四种分词模式:
精确模式,试图将句子最精确地切开,适合文本分析;
全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
paddle模式,利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。同时支持词性标注。
paddle模式使用需安装paddlepaddle-tiny
#安装paddlepaddle-tiny
pip install paddlepaddle-tiny==1.6.1
jieba.cut 方法接受四个输入参数:
需要分词的字符串;
cut_all 参数用来控制是否采用全模式;
HMM 参数用来控制是否使用 HMM 模型;
use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码
jieba.cut_for_search 方法接受两个参数:
需要分词的字符串;
是否使用 HMM 模型。
该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode)
jieba.lcut 以及 jieba.lcut_for_search 直接返回 list
jieba.Tokenizer(dictionary=DEFAULT_DICT) 新建自定义分词器,可用于同时使用不同词典。
jieba.dt 为默认分词器,所有全局分词相关函数都是该分词器的映射。
#待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。
#注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
import jieba
# 启动paddle模式
jieba.enable_paddle()
strs=["我来到北京清华大学","乒乓球拍卖完了","中华人民共和国是一个伟大的国家","华夏文明是一个经久不衰的文明"]
for str in strs:
seg_list=jieba.lcut(str,use_paddle=False,cut_all=False)#不指定use_paddle,cut_all时默认值为False
print("Default Mode:",seg_list)
for str in strs:
seg_list=jieba.lcut(str,use_paddle=True)
print("Paddle Mode:",seg_list)
for str in strs:
seg_list=jieba.lcut(str,use_paddle=False,cut_all=True)
print("Cut_all Mode:",seg_list)
for str in strs:
seg_list=jieba.lcut_for_search(str)
print("Search Mode:",seg_list)
输出结果:
Default Mode: ['我', '来到', '北京', '清华大学']
Default Mode: ['乒乓球', '拍卖', '完', '了']
Default Mode: ['中华人民共和国', '是', '一个', '伟大', '的', '国家']
Default Mode: ['华夏', '文明', '是', '一个', '经久不衰', '的', '文明']
Paddle Mode: ['我', '来到', '北京清华大学']
Paddle Mode: ['乒乓球', '拍卖', '完', '了']
Paddle Mode: ['中华人民共和国', '是', '一个', '伟大', '的', '国家']
Paddle Mode: ['华夏文明', '是', '一个', '经久不衰', '的', '文明']
Cut_all Mode: ['我', '来到', '北京', '清华', '清华大学', '华大', '大学']
Cut_all Mode: ['乒乓', '乒乓球', '乒乓球拍', '球拍', '拍卖', '卖完', '了']
Cut_all Mode: ['中华', '中华人民', '中华人民共和国', '华人', '人民', '人民共和国', '共和', '共和国', '国是', '一个', '伟大', '的', '国家']
Cut_all Mode: ['华夏', '文明', '是', '一个', '经久', '经久不衰', '不衰', '的', '文明']
Search Mode: ['我', '来到', '北京', '清华', '华大', '大学', '清华大学']
Search Mode: ['乒乓', '乒乓球', '拍卖', '完', '了']
Search Mode: ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '一个', '伟大', '的', '国家']
Search Mode: ['华夏', '文明', '是', '一个', '经久', '不衰', '经久不衰', '的', '文明']
开发者可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率
jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。
调整词典
jieba.add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。
jieba.suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。
注意:自动计算的词频在使用 HMM 新词发现功能时可能无效
print(jieba.lcut('李小福是台中创新办主任,也是云计算方面的专家', HMM=False))
jieba.add_word('台中', freq=None, tag=None)
jieba.add_word('云计算', freq=5, tag=None)
jieba.add_word('创新办', freq=3, tag='i')
jieba.add_word('李小福', freq=3, tag='i')
print(jieba.lcut('李小福是台中创新办主任,也是云计算方面的专家', HMM=False))
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
jieba.suggest_freq(('中', '将'), True)
print('/'.join(jieba.cut('如果放到post中将出错。', HMM=False)))
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
jieba.suggest_freq('台中', True)
print('/'.join(jieba.cut('「台中」正确应该不会被切开', HMM=False)))
输出结果:
['李', '小', '福', '是', '台', '中', '创新', '办', '主任', ',', '也', '是', '云', '计算', '方面', '的', '专家']
['李小福', '是', '台中', '创新办', '主任', ',', '也', '是', '云计算', '方面', '的', '专家']
如果/放到/post/中将/出错/。
如果/放到/post/中/将/出错/。
「/台中/」/正确/应该/不会/被/切开
「/台中/」/正确/应该/不会/被/切开
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
sentence 为待提取的文本
topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
withWeight 为是否一并返回关键词权重值,默认值为 False
allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) 新建 TFIDF 实例,idf_path 为 IDF 频率文件
jieba.analyse.set_idf_path(file_name) # file_name为自定义语料库的路径
jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径
import jieba.analyse
sentence='''在克鲁伊夫时代,巴萨联赛中完成四连冠,后三个冠军都是在末轮逆袭获得的。在91//92赛季,巴萨末轮前落后皇马1分,结果皇马客场不敌特内里费使得巴萨逆转。一年之后,巴萨用几乎相同的方式逆袭,皇马还是末轮输给了特内里费。在93/94赛季中,巴萨末轮落后拉科1分。巴萨末轮5比2屠杀塞维利亚,拉科则0比0战平瓦伦西亚,巴萨最终在积分相同的情况下靠直接交锋时的战绩优势夺冠。神奇的是,拉科球员久基齐在终场前踢丢点球,这才有巴萨的逆袭。
巴萨上一次压哨夺冠,发生在09/10赛季中。末轮前巴萨领先皇马1分,只要赢球就夺冠。末轮中巴萨4比0大胜巴拉多利德,皇马则与对手踢平。巴萨以99分的佳绩创下五大联赛积分记录,皇马则以96分成为了悲情的史上最强亚军。
在48/49赛季中,巴萨末轮2比1拿下同城死敌西班牙人,以2分优势夺冠。52/53赛季,巴萨末轮3比0战胜毕巴,以2分优势力压瓦伦西亚夺冠。在59/60赛季,巴萨末轮5比0大胜萨拉戈萨。皇马巴萨积分相同,巴萨靠直接交锋时的战绩优势夺冠。'''
print(jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()))
print(jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=()))
print(jieba.analyse.extract_tags(sentence, topK=20, withWeight=True, allowPOS=('i','n','f','s','t')))
输出结果:
['巴萨', '末轮', '皇马', '夺冠', '赛季', '拉科', '内里费', '积分', '逆袭', '瓦伦西亚', '优势', '大胜', '联赛', '相同', '战绩', '交锋', '四连冠', '多利德', '落后', '克鲁伊夫']
[('巴萨', 1.2181461971020409), ('末轮', 0.7319245409938775), ('皇马', 0.5362676344), ('夺冠', 0.42225835063265305), ('赛季', 0.39762426810693874), ('拉科', 0.2471207792387755), ('内里费', 0.18912486601360545), ('积分', 0.1691336641957143), ('逆袭', 0.16264989799863944), ('瓦伦西亚', 0.16264989799863944), ('优势', 0.15362255099918368), ('大胜', 0.12660622859646256), ('联赛', 0.12398892393455782), ('相同', 0.12255595193938776), ('战绩', 0.12077275008340135), ('交锋', 0.11605496086870748), ('四连冠', 0.09456243300680273), ('多利德', 0.09456243300680273), ('落后', 0.09077944490340135), ('克鲁伊夫', 0.08708888002244898)]
[('末轮', 2.2989937505576923), ('皇马', 1.5159873510923079), ('赛季', 1.1240532194561537), ('内里费', 0.5346414481538462), ('优势', 0.43427913455538464), ('战绩', 0.34141527427423074), ('交锋', 0.32807844707115386), ('压哨', 0.2298993750557692), ('赢球', 0.2298993750557692), ('力压', 0.2298993750557692), ('终场', 0.22506640528076924), ('战平', 0.22120735344615383), ('悲情', 0.21173665180961537), ('点球', 0.20620430426153843), ('佳绩', 0.19894864597115386), ('客场', 0.1913352679498077), ('球员', 0.1652386529725), ('冠军', 0.14683416229307691), ('战胜', 0.14229592272), ('领先', 0.13591626767673076)]
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=(‘ns’, ‘n’, ‘vn’, ‘v’)) 直接使用,接口相同,注意默认过滤词性。
jieba.analyse.TextRank() 新建自定义 TextRank 实例
print(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))
输出结果:
['巴萨', '末轮', '皇马', '夺冠', '优势', '联赛', '终场', '交锋', '逆袭', '内里费', '战绩', '瓦伦西亚', '客场', '使得', '创下', '球员', '点球', '记录', '分成', '屠杀']
jieba.posseg.POSTokenizer(tokenizer=None) 新建自定义分词器,tokenizer 参数可指定内部使用的 jieba.Tokenizer 分词器。jieba.posseg.dt 为默认词性标注分词器。
标注句子分词后每个词的词性,采用和 ictclas 兼容的标记法。
import jieba.posseg
print(jieba.posseg.lcut('华夏文明是一个经久不衰的文明'))
print(jieba.posseg.lcut('华夏文明是一个经久不衰的文明',use_paddle=True))
for word,flag in jieba.posseg.lcut('华夏文明是一个经久不衰的文明',use_paddle=True):
print(word,flag)
输出结果:
[pair('华夏', 'ns'), pair('文明', 'nr'), pair('是', 'v'), pair('一个', 'm'), pair('经久不衰', 'l'), pair('的', 'uj'), pair('文明', 'nr')]
[pair('华夏文明', 'nz'), pair('是', 'v'), pair('一个', 'm'), pair('经久不衰', 'a'), pair('的', 'u'), pair('文明', 'n')]
华夏文明 nz
是 v
一个 m
经久不衰 a
的 u
文明 n
原理:将目标文本按行分隔后,把各行文本分配到多个 Python 进程并行分词,然后归并结果,从而获得分词速度的可观提升
基于 python 自带的 multiprocessing 模块,目前暂不支持 Windows
jieba.enable_parallel(4) # 开启并行分词模式,参数为并行进程数
jieba.disable_parallel() # 关闭并行分词模式
注意:并行分词仅支持默认分词器 jieba.dt 和 jieba.posseg.dt。
jieba.enable_parallel()
注意,输入参数只接受 unicode
print('默认模式')
for tk in jieba.tokenize(u'华夏文明是一个经久不衰的文明'):
print("word %s\t start: %2d \t end:%2d" % (tk[0],tk[1],tk[2]))
print('搜索模式')
for tk in jieba.tokenize(u'华夏文明是一个经久不衰的文明', mode='search'):
print("word %s\t start: %2d \t end:%2d" % (tk[0],tk[1],tk[2]))
输出结果:
默认模式
word 华夏 start: 0 end: 2
word 文明 start: 2 end: 4
word 是 start: 4 end: 5
word 一个 start: 5 end: 7
word 经久不衰 start: 7 end:11
word 的 start: 11 end:12
word 文明 start: 12 end:14
搜索模式
word 华夏 start: 0 end: 2
word 文明 start: 2 end: 4
word 是 start: 4 end: 5
word 一个 start: 5 end: 7
word 经久 start: 7 end: 9
word 不衰 start: 9 end:11
word 经久不衰 start: 7 end:11
word 的 start: 11 end:12
word 文明 start: 12 end:14