python利用jieba实现中文分词

jieba是一款强大的python第三方中文分词库。目前jieba已经支持四种分词模式:

  • 精确模式:试图将句子最精确地切开,不存在冗余数据,适合文本分析。
  • 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义。
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
  • paddle模式:利用PaddlePaddle深度学习框架,训练序列标注(双向GRU)网络模型实现分词。

jieba安装

jieba提供了几种安装模式。

  • 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
  • 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
  • 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
  • 通过 import jieba 来引用
  • 如果需要使用paddle模式下的分词和词性标注功能,请先安装paddlepaddle-tiny,pip install paddlepaddle-tiny==1.6.1。

jieba简单使用

安装好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-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=())提取关键词。其中:

  • sentence: 要提取的文本
  • topK:返回具有最高 TF/IDF 权重的关键字数量。默认值为 20
  • 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))
做工 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

python利用jieba实现中文分词_第1张图片

你可能感兴趣的:(笔记,python,中文分词)