NLP自然语言 - jieba分词库

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

1.安装jieba

pip install jieba

2.简单用法

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

(1)精确模式

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

cut = jieba.cut(s) print(cut) print(','.join(cut))

#结果:

<generator object cut at 0x7f8dbc0efc30> 我,想,和,女朋友,一起,去,北京故宫博物院,参观,和,闲逛,。

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

(2)全模式

cut=jieba.cut(s,cut_all = True))

print(','.join(cut))

#结果:

我,想,和,女朋友,朋友,一起,去,北京,北京故宫,北京故宫博物院,故宫,故宫博物院,博物,博物院,参观,和,闲逛,,

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

(3)搜索引擎模式

print('【Output】')

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

【Output】 我,想,和,朋友,女朋友,一起,去,北京,故宫,博物,博物院,北京故宫博物院,参观,和,闲逛,。

3.获取词性

每个词都有其词性,比如名词、动词、代词等,结巴分词的结果也可以带上每个词的词性,要用到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')] '''

4.并行分词(windows下不支持)

在文本数据量非常大的时候,为了提高分词效率,开启并行分词就很有必要了。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()

5.获取出现频率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'居然是出现频率最高的词,还有'一个'、'没有'、'这个'等这种我们并不想要的无实际意义的词,那么就可以根据前面说的词性来进行过滤。

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

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

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

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

词语 词频 词性

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

jieba为自然语言语言中常用工具包,jieba具有对分词的词性进行标注的功能,词性类别如下:

Ag

形语素

形容词性语素。形容词代码为 a,语素代码g前面置以A。

a

形容词

取英语形容词 adjective的第1个字母。

ad

副形词

直接作状语的形容词。形容词代码 a和副词代码d并在一起。

an

名形词

具有名词功能的形容词。形容词代码 a和名词代码n并在一起。

b

区别词

取汉字“别”的声母。

c

连词

取英语连词 conjunction的第1个字母。

dg

副语素

副词性语素。副词代码为 d,语素代码g前面置以D。

d

副词

取 adverb的第2个字母,因其第1个字母已用于形容词。

e

叹词

取英语叹词 exclamation的第1个字母。

f

方位词

取汉字“方”

g

语素

绝大多数语素都能作为合成词的“词根”,取汉字“根”的声母。

h

前接成分

取英语 head的第1个字母。

i

成语

取英语成语 idiom的第1个字母。

j

简称略语

取汉字“简”的声母。

k

后接成分

l

习用语

习用语尚未成为成语,有点“临时性”,取“临”的声母。

m

数词

取英语 numeral的第3个字母,n,u已有他用。

Ng

名语素

名词性语素。名词代码为 n,语素代码g前面置以N。

n

名词

取英语名词 noun的第1个字母。

nr

人名

名词代码 n和“人(ren)”的声母并在一起。

ns

地名

名词代码 n和处所词代码s并在一起。

nt

机构团体

“团”的声母为 t,名词代码n和t并在一起。

nz

其他专名

“专”的声母的第 1个字母为z,名词代码n和z并在一起。

o

拟声词

取英语拟声词 onomatopoeia的第1个字母。

p

介词

取英语介词 prepositional的第1个字母。

q

量词

取英语 quantity的第1个字母。

r

代词

取英语代词 pronoun的第2个字母,因p已用于介词。

s

处所词

取英语 space的第1个字母。

tg

时语素

时间词性语素。时间词代码为 t,在语素的代码g前面置以T。

t

时间词

取英语 time的第1个字母。

u

助词

取英语助词 auxiliary

vg

动语素

动词性语素。动词代码为 v。在语素的代码g前面置以V。

v

动词

取英语动词 verb的第一个字母。

vd

副动词

直接作状语的动词。动词和副词的代码并在一起。

vn

名动词

指具有名词功能的动词。动词和名词的代码并在一起。

w

标点符号

x

非语素字

非语素字只是一个符号,字母 x通常用于代表未知数、符号。

y

语气词

取汉字“语”的声母。

z

状态词

取汉字“状”的声母的前一个字母。

un

未知词

不可识别词及用户自定义词组。取英文Unkonwn首两个字母。(非北大标准,CSW分词中定义)

猜你喜欢

转载自blog.csdn.net/helunqu2017/article/details/113147381