jieba是一款强大的python第三方中文分词库。目前jieba已经支持四种分词模式:
jieba提供了几种安装模式。
安装好jieba后,我们就来了解下jieba的基本分词操作。前面我们也说了jieba具有四种分词模式,其中jieba.cut用于精确模式、全模式、paddle模式,jieba.cut_for_search用于搜索引擎模式。
# encoding=utf-8
import jieba
# 全模式
seg_list = jieba.cut("结巴中文分词:做最好的 Python 中文分词组件", cut_all=True)
print("/ ".join(seg_list))
# 精确模式,默认
seg_list = jieba.cut("结巴中文分词:做最好的 Python 中文分词组件", cut_all=False)
print("/ ".join(seg_list))
# 搜索引擎模式
seg_list = jieba.cut_for_search("结巴中文分词:做最好的 Python 中文分词组件")
print(", ".join(seg_list))
# 启动paddle模式。 0.40版之后开始支持,早期版本不支持
jieba.enable_paddle()
# 使用paddle模式
seg_list = jieba.cut("结巴中文分词:做最好的 Python 中文分词组件",use_paddle=True)
print('/'.join(list(seg_list)))
结巴/ 巴中/ 中文/ 分词/ :/ 做/ 最好/ 的/ / / / Python/ / / / 中文/ 分词/ 词组/ 组件
结巴/ 中文/ 分词/ :/ 做/ 最好/ 的/ / Python/ / 中文/ 分词/ 组件
结巴, 中文, 分词, :, 做, 最好, 的, , Python, , 中文, 分词, 组件
结巴/中文/分词/:/做/最好/的/ Python /中文/分词/组件
我们还可以指定自己自定义的词典,以便包含 jieba 词库里没有的词。虽然 jieba 有新词识别能力,但是自行添加新词可以保证更高的正确率 用法: jieba.load_userdict(file_name),file_name 为文件类对象或自定义词典的路径 词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。 词频省略时使用自动计算的能保证分出该词的词频。
比如我们传入以下的词典,看看传入前后jieba精确模式下分词变化。
“””
结巴大仙 7
快乐结巴侠 10
“””
seg_list = jieba.cut_for_search("结巴大仙和快乐结巴侠是两个人")
print("/ ".join(seg_list))
jieba.load_userdict('jieba_dic.txt')
seg_list = jieba.cut_for_search("结巴大仙和快乐结巴侠是两个人")
print("/ ".join(seg_list))
结巴/ 大仙/ 和/ 快乐/ 结巴/ 结巴侠/ 是/ 两个/ 人
结巴/ 大仙/ 结巴大仙/ 和/ 快乐/ 结巴/ 结巴侠/ 快乐结巴侠/ 是/ 两个/ 人
这里可以看到添加字典后,jieba已经能分出我们加进去的新词。
我们还可以使用add_word(word, freq=None, tag=None)和del_word(word)在程序中动态修改字典。使用suggest_freq(segment, tune=True)调整单个词的频率,使得它可以(或不能)被分割。
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提供几种关键词抽取算法,如TF-IDF、TextRank。下面我们介绍一下TF-IDF算法。
使用前需要导入相关库jieba.analyse。然后使用jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())提取关键词。其中:
import jieba.analyse
s = "这少年便是闰土。我认识他时,也不过十多岁,离现在将有三十年了;那时我的父亲还在世,家景也好,我正是一个少爷。那一年,我家是一件大祭祀的值年。这祭祀,说是三十多年才能轮到一回,所以很郑重;正月里供祖像,供品很多,祭器很讲究,拜的人也很多,祭器也很要防偷去。我家只有一个忙月(我们这里给人做工的分三种:整年给一定人家做工的叫长工;按日给人做工的叫短工;自己也种地,只在过年过节以及收租时候来给一定人家做工的称忙月),忙不过来,他便对父亲说,可以叫他的儿子闰土来管祭器的。"
for x, w in jieba.analyse.extract_tags(s, withWeight=True):
print('%s %s' % (x, w))
做工 0.4919613755858824
祭器 0.4434057375132353
祭祀 0.22701743368411764
我家 0.21521377734764707
家景 0.20442173017647058
闰土 0.17580540445441176
他时 0.17580540445441176
里供 0.17580540445441176
祖像 0.17580540445441176
防偷 0.17580540445441176
按日 0.17580540445441176
闰土来 0.17580540445441176
十多岁 0.1691585644
人家 0.16612445769794118
父亲 0.16261684609735294
供品 0.15650854579411766
整年 0.15256348716764706
短工 0.15172292225735293
收租 0.14981037625441176
忙不过来 0.14631520490279412
jieba还能标注句子分词后每个词的词性,除了jieba默认分词模式,提供paddle模式下的词性标注功能。
import jieba.posseg as pseg
words = pseg.cut("我爱我的祖国") #jieba默认模式
for word, flag in words:
print('%s %s' % (word, flag))
我 r
爱 v
我 r
的 uj
祖国 n
jieba提供了Tokenize来返回词语在原文的起止位置,拥有默认和搜索两种模式。
result = jieba.tokenize(u'小Q的python学习笔记')
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:1
word Q start: 1 end:2
word 的 start: 2 end:3
word python start: 3 end:9
word 学习 start: 9 end:11
word 笔记 start: 11 end:13