浅谈python jieba分词模块的基本用法
jieba(结巴)是一个强大的分词库,完美支持中文分词,本文对其基本用法做一个简要总结。
特点
- 支持三种分词模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
- 支持繁体分词
- 支持自定义词典
- MIT授权协议
安装jieba
pipinstalljieba
简单用法
结巴分词分为三种模式:精确模式(默认)、全模式和搜索引擎模式,下面对这三种模式分别举例介绍:
精确模式
importjieba s=u'我想和女朋友一起去北京故宫博物院参观和闲逛。'
cut=jieba.cut(s) print'【Output】' printcut print','.join(cut)
【Output】我,想,和,女朋友,一起,去,北京故宫博物院,参观,和,闲逛,。
可见分词结果返回的是一个生成器(这对大数据量数据的分词尤为重要)。
全模式
print'【Output】' print','.join(jieba.cut(s,cut_all=True))
【Output】 我,想,和,女朋友,朋友,一起,去,北京,北京故宫,北京故宫博物院,故宫,故宫博物院,博物,博物院,参观,和,闲逛,,
可见全模式就是把文本分成尽可能多的词。
搜索引擎模式
print'【Output】' print','.join(jieba.cut_for_search(s))
【Output】 我,想,和,朋友,女朋友,一起,去,北京,故宫,博物,博物院,北京故宫博物院,参观,和,闲逛,。
获取词性
每个词都有其词性,比如名词、动词、代词等,结巴分词的结果也可以带上每个词的词性,要用到jieba.posseg,举例如下:
importjieba.possegaspsg print'【Output】' print[(x.word,x.flag)forxinpsg.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)forxinpsg.cut(s)ifx.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() printlen(santi_text)
2681968
可以看到三体全集的数据量还是非常大的,有260多万字节的长度。
jieba.enable_parallel(100) santi_words=[xforxinjieba.cut(santi_text)iflen(x)>=2] jieba.disable_parallel()
获取出现频率Topn的词
还是以上面的三体全集文本为例,假如想要获取分词结果中出现频率前20的词列表,可以这样获取:
fromcollectionsimportCounter c=Counter(santi_words).most_common(20) printc #输出: ''' [(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
创新办5i
欢聚时代5
云计算5
用户字典每行一个词,格式为:
词语词频词性
其中词频是一个数字,词性为自定义的词性,要注意的是词频数字和空格都要是半角的。
附:结巴分词词性对照表(按词性英文首字母排序)
形容词(1个一类,4个二类)
a形容词
ad副形词
an名形词
ag形容词性语素
al形容词性惯用语
区别词(1个一类,2个二类)
b区别词
bl区别词性惯用语
连词(1个一类,1个二类)
c连词
cc并列连词
副词(1个一类)
d副词
叹词(1个一类)
e叹词
方位词(1个一类)
f方位词
前缀(1个一类)
h前缀
后缀(1个一类)
k后缀
数词(1个一类,1个二类)
m数词
mq数量词
名词(1个一类,7个二类,5个三类)
名词分为以下子类:
n名词
nr人名
nr1汉语姓氏
nr2汉语名字
nrj日语人名
nrf音译人名
ns地名
nsf音译地名
nt机构团体名
nz其它专名
nl名词性惯用语
ng名词性语素
拟声词(1个一类)
o拟声词
介词(1个一类,2个二类)
p介词
pba介词“把”
pbei介词“被”
量词(1个一类,2个二类)
q量词
qv动量词
qt时量词
代词(1个一类,4个二类,6个三类)
r代词
rr人称代词
rz指示代词
rzt时间指示代词
rzs处所指示代词
rzv谓词性指示代词
ry疑问代词
ryt时间疑问代词
rys处所疑问代词
ryv谓词性疑问代词
rg代词性语素
处所词(1个一类)
s处所词
时间词(1个一类,1个二类)
t时间词
tg时间词性语素
助词(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单位符号,全角:¥$£°℃半角:$
字符串(1个一类,2个二类)
x字符串
xx非语素字
xu网址URL
语气词(1个一类)
y语气词(deleteyg)
状态词(1个一类)
z状态词
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。