python jieba分词模块的基本用法

star2017 1年前 ⋅ 513 阅读
“结巴”中文分词:做最好的 Python 中文分词组件。

jieba(结巴)是一个强大的分词库,完美支持中文分词。之前写毕业论文的时候用到过,现在学习NLP做一个小结,分享给大家。


安装

安装简单:

pip install jieba


基本用法

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

精确模式

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

print(cut)
print(','.join(cut))

'''
# 输出

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

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

全模式

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

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

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

搜索引擎模式

print(','.join(jieba.cut_for_search(s)))

'''
# 输出
我,想,和,朋友,一起,去,北京,故宫,博物,博物院,北京故宫博物院,参观,和,闲逛,。
'''


获取词性

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

import jieba.posseg as psg

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

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

词语 词频 词性

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

更多内容请访问:IT源点

相关文章推荐

全部评论: 0

    我有话说: