jieba结巴分词库

jieba(结巴)是一个强大的分词库,完美支持中文分词,本文对其基本用法做一个简要总结。

安装jieba

pip install jieba

简单用法

结巴分词分为三种模式:精确模式(默认)、全模式和搜索引擎模式,下面对这三种模式分别举例介绍:

精确模式

import jieba
s = u'我想和女朋友一起去北京故宫博物院参观和闲逛。'
cut = jieba.cut(s)

print '【Output】'
print cut
print ','.join(cut)
【Output】
<generator object cut at 0x7f8dbc0efc30>
我,想,和,女朋友,一起,去,北京故宫博物院,参观,和,闲逛,。

可见分词结果返回的是一个生成器(这对大数据量数据的分词尤为重要)。

全模式

print '【Output】'
print ','.join(jieba.cut(s,cut_all = True))
【Output】
我,想,和,女朋友,朋友,一起,去,北京,北京故宫,北京故宫博物院,故宫,故宫博物院,博物,博物院,参观,和,闲逛,,

可见全模式就是把文本分成尽可能多的词。

搜索引擎模式

print '【Output】'
print ','.join(jieba.cut_for_search(s))
【Output】
我,想,和,朋友,女朋友,一起,去,北京,故宫,博物,博物院,北京故宫博物院,参观,和,闲逛,。

获取词性

每个词都有其词性,比如名词、动词、代词等,结巴分词的结果也可以带上每个词的词性,要用到jieba.posseg,举例如下:

import jieba.posseg as psg
print '【Output】'
print [(x.word,x.flag) for x in psg.cut(s)]

# 输出:
'''
[(u'我', u'r'), (u'想', u'v'), (u'和', u'c'), (u'女朋友', u'n'), (u'一起', u'm'),
(u'去', u'v'), (u'北京故宫博物院', u'ns'), (u'参观', u'n'), (u'和', u'c'), (u'闲逛', u'v'), (u'。', u'x')]
'''

可以看到成功获取到每个词的词性,这对于我们对分词结果做进一步处理很有帮助,比如只想获取分词结果列表中的名词,那么就可以这样过滤:

print [(x.word,x.flag) for x in psg.cut(s) if x.flag.startswith('n')]

# 输出:
'''
[(u'女朋友', u'n'), (u'北京故宫博物院', u'ns'), (u'参观', u'n')]
'''

至于词性的每个字母分别表示什么词性,jieba分词的结果可能有哪些词性,就要去查阅词性对照表了,本文结尾附了一份从网上搜到的词性对照表,想了解更详细的词性分类信息,可以到网上搜索"结巴分词词性对照"。

并行分词

在文本数据量非常大的时候,为了提高分词效率,开启并行分词就很有必要了。jieba支持并行分词,基于python自带的multiprocessing模块,但要注意的是在Windows环境下不支持。

用法:

# 开启并行分词模式,参数为并发执行的进程数
jieba.enable_parallel(5)

# 关闭并行分词模式
jieba.disable_parallel()

举例:开启并行分词模式对三体全集文本进行分词

santi_text = open('./santi.txt').read()
print len(santi_text)
2681968

可以看到三体全集的数据量还是非常大的,有260多万字节的长度。

jieba.enable_parallel(100)
santi_words = [x for x in jieba.cut(santi_text) if len(x) >= 2]
jieba.disable_parallel()

获取出现频率Top n的词

还是以上面的三体全集文本为例,假如想要获取分词结果中出现频率前20的词列表,可以这样获取:

from collections import Counter
c = Counter(santi_words).most_common(20)
print c

# 输出:
'''
[(u'\r\n', 21805), (u'一个', 3057), (u'没有', 2128), (u'他们', 1690), (u'我们', 1550),
(u'这个', 1357), (u'自己', 1347), (u'程心', 1320), (u'现在', 1273), (u'已经', 1259),
(u'世界', 1243), (u'罗辑', 1189), (u'可能', 1177), (u'什么', 1176), (u'看到', 1114),
(u'知道', 1094), (u'地球', 951), (u'人类', 935), (u'太空', 930), (u'三体', 883)]
'''

可以看到结果中'\r\n'居然是出现频率最高的词,还有'一个'、'没有'、'这个'等这种我们并不想要的无实际意义的词,那么就可以根据前面说的词性来进行过滤,这个以后细讲。

使用用户字典提高分词准确性

不使用用户字典的分词结果:

txt = u'欧阳建国是创新办主任也是欢聚时代公司云计算方面的专家'
print ','.join(jieba.cut(txt))
欧阳,建国,是,创新,办,主任,也,是,欢聚,时代,公司,云,计算,方面,的,专家

使用用户字典的分词结果:

jieba.load_userdict('user_dict.txt')
print ','.join(jieba.cut(txt))
欧阳建国,是,创新办,主任,也,是,欢聚时代,公司,云计算,方面,的,专家

可以看出使用用户字典后分词准确性大大提高。

注:其中user_dict.txt的内容如下:

欧阳建国 5

创新办 5 i

欢聚时代 5

云计算 5

用户字典每行一个词,格式为:

词语 词频 词性

其中词频是一个数字,词性为自定义的词性,要注意的是词频数字和空格都要是半角的。

附:结巴分词词性对照表

  • 按词性英文首字母排序

形容词

形容词一类a形容词
形容词二类a形容词
形容词二类ad副形词
形容词二类an名形词
形容词二类ag形容词性语素
形容词二类al形容词性惯用语
区别词一类b区别词
区别词二类bl区别词性惯用语

名词

名词一类n名词
名词二类nr人名
名词三类nr1汉语姓氏
名词三类nr2汉语名字
名词三类nrj日语人名
名词三类nrf音译人名
名词二类ns地名
名词三类nsf音译地名
名词二类nt机构团体名
名词二类nz其它专名
名词二类nl名词性惯用语
名词二类ng名词性语素

代词(1个一类,4个二类,6个三类)

r代词
rr人称代词
rz指示代词
rzt时间指示代词
rzs处所指示代词
rzv谓词性指示代词
ry疑问代词
ryt时间疑问代词
rys处所疑问代词
ryv谓词性疑问代词
rg代词性语素

助词(1个一类,15个二类)

u助词
uzhe
ule了 喽
uguo
ude1的 底
ude2
ude3
usuo
udeng等 等等 云云
uyy一样 一般 似的 般
udh的话
uls来讲 来说 而言 说来
uzhi
ulian连 (“连小学生都会”)

动词(1个一类,9个二类)

v动词
vd副动词
vn名动词
vshi动词“是”
vyou动词“有”
vf趋向动词
vx形式动词
vi不及物动词(内动词)
vl动词性惯用语
vg动词性语素

标点符号(1个一类,16个二类)

w标点符号
wkz左括号,全角:( 〔 [ { 《 【 〖 〈 半角:( [ { <
wky右括号,全角:) 〕 ] } 》 】 〗 〉 半角: ) ] { >
wyz左引号,全角:“ ‘ 『
wyy右引号,全角:” ’ 』
wj句号,全角:。
ww问号,全角:? 半角:?
wt叹号,全角:! 半角:!
wd逗号,全角:, 半角:,
wf分号,全角:; 半角: ;
wn顿号,全角:、
wm冒号,全角:: 半角: :
ws省略号,全角:…… …
wp破折号,全角:—— -- ——- 半角:--- ----
wb百分号千分号,全角:% ‰ 半角:%
wh单位符号,全角:¥ $ £ ° ℃ 半角:$

其它

连词一类c连词
连词二类cc并列连词
副词一类d副词
叹词一类e叹词

| 方位词|一类|f |方位词
| 前缀|一类)|h |前缀|
| 后缀|一类|k 后缀|
| 数词|一类,1个二类|
| 数词|一类|m |数词|
| 数词|二类|mq |数量词|

拟声词(1个一类)

o拟声词

介词(1个一类,2个二类)

|p |介词|
|pba |介词“把”|
|pbe|i 介词“被”|

量词(1个一类,2个二类)

q量词
qv动量词
qt时量词

字符串(1个一类,2个二类)

x字符串
xx非语素字
xu网址URL

语气词(1个一类)

y语气词(delete yg)

状态词(1个一类)

z状态词

处所词(1个一类)

s处所词

时间词(1个一类,1个二类)

t时间词
tg时间词性语素
12-26 12:22