jieba是一款强大的python第三方中文分词库。目前jieba已经支持四种分词模式:
精确模式:试图将句子最精确地切开,不存在冗余数据,适合文本分析。
全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。
搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。
jieba提供了几种安装模式。
全自动安装:easy_install jieba 或者 pip install jieba / pip install jieba
半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
通过 import jieba 来引用
如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==..。
安装好jieba后,我们就来了解下jieba的基本分词操作。前面我们也说了jieba具有四种分词模式,其中jieba.cut用于精确模式、全模式、paddle模式,jieba.cut_for_search用于搜索引擎模式。
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。
# encoding=utf-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模式。 .版之后开始支持,早期版本不支持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精确模式下分词变化。
“”” 结巴大仙 快乐结巴侠 “”” 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=, withWeight=False, allowPOS=())提取关键词。其中:
sentence: 要提取的文本
topK:返回具有最高 TF/IDF 权重的关键字数量。默认值为
withWeight: 是否返回带有关键字的 TF/IDF 权重。默认值为 False
allowPOS:过滤包含 POS 的单词。为空不过滤。
import jieba.analyse s = "这少年便是闰土。我认识他时,也不过十多岁,离现在将有三十年了;那时我的父亲还在世,家景也好,我正是一个少爷。那一年,我家是一件大祭祀的值年。这祭祀,说是三十多年才能轮到一回,所以很郑重;正月里供祖像,供品很多,祭器很讲究,拜的人也很多,祭器也很要防偷去。我家只有一个忙月(我们这里给人做工的分三种:整年给一定人家做工的叫长工;按日给人做工的叫短工;自己也种地,只在过年过节以及收租时候来给一定人家做工的称忙月),忙不过来,他便对父亲说,可以叫他的儿子闰土来管祭器的。"for x, w in jieba.analyse.extract_tags(s, withWeight=True): print(%s %s % (x, w))
做工 .祭器 .祭祀 .我家 .家景 .闰土 .他时 .里供 .祖像 .防偷 .按日 .闰土来 .十多岁 .人家 .父亲 .供品 .整年 .短工 .收租 .忙不过来 .
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 start: %d end:%d" % (tk[],tk[],tk[]))
word 小 start: end:word Q start: end:word 的 start: end:word python start: end:word 学习 start: end:word 笔记 start: end:
今天我们了解了一款贼好用的分词工具jieba,希望你在今后的学习工作中可以灵活使用。下一期我们将用jieba进行分词,并生成词云图。感兴趣的同学,可以点点关注。