一、jieba库概述
jieba是优秀的中文分词第三方库
- 中文文本需要通过分词获得单个的词语
- jieba是优秀的中文分词第三方库,需要额外安装
- jieba库提供三种分词模式,最简单只需要掌握一个函数
二、jieba库安装
1
|
pip install jieba
|
三、jieba分词的原理
jieba分词依靠中文词库
- 利用一个中文词库,确定汉字之间的关联概率
- 汉字间概率大的组成词组,形成分词结果
四、jieba分词的3种模式
- 精确模式:把文本精确地切分开,不存在冗余单词(最常用)
- 全模式:把文本中所有可能的词语都扫描出来,有冗余
- 搜索引擎模式:在精确模式的基础上,对长词再次切分
五、jieba库常用函数
函数 | 描述 |
---|---|
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
jieba.lcut(s,cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 |
jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
jieba.add_word(s) | 向分词词典增加新词w |
例子:
1
2
3
4
5
6
7
8
|
>>> jieba.lcut( "中国是一个伟大的国家" )
[ '中国' , '是' , '一个' , '伟大' , '的' , '国家' ]
>>> jieba.lcut( "中国是一个伟大的国家" , cut_all = True )
[ '中国' , '国是' , '一个' , '伟大' , '的' , '国家' ]
>>> jieba.lcut_for_search( "*是伟大的" )
[ '中华' , '华人' , '人民' , '共和' , '*' , '*' , '是' , '伟大' , '的' ]
|
六、文本词频示例
问题分析
- 英文文本: Hamlet 分析词频
https://python123.io/resources/pye/hamlet.txt
- 中文文本: 《三国演义》 分析人物
https://python123.io/resources/pye/threekingdoms.txt
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
def getText():
# 打开 hamlet.txt 这个文件
txt = open ( "hamlet.txt" , "r" ).read()
# 避免大小写对词频统计的干扰,将所有单词转换为小写
txt = txt.lower()
# 将文中出现的所有特殊字符替换为空格
for ch in '|"#$%^&*()_+-=\\`~{}[];:<>?/' :
txt = txt.replace(ch, " " )
# 返回一个所以后单词都是小写的,单词间以空格间隔的文本
return txt
hamletTxt = getText()
# split() 默认使用空格作为分隔符
words = hamletTxt.split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0 ) + 1
items = list (counts.items())
items.sort(key = lambda x:x[ 1 ], reverse = True )
for i in range ( 10 ):
word, count = items[i]
print ( "{0:<10}{1:>5}" . format (word,count))
|
上面代码中的
1
|
items.sort(key = lambda x:x[ 1 ], reverse = True )
|
是根据单词出现的次数进行排序,其中使用了 lambda 函数。更多解释请看:
https://www.runoob.com/python/att-list-sort.html
下面使用 jieba 库来统计《三国演义》中任务出场的次数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import jieba
txt = open ( "threekingdoms.txt" , "r" ,encoding = "utf-8" ).read()
words = jieba.lcut(txt)
counts = {}
for word in words:
if len (word) = = 1 :
continue
else :
counts[word] = counts.get(word, 0 ) + 1
items = list (counts.items())
items.sort(key = lambda x:x[ 1 ], reverse = True )
for i in range ( 15 ):
word, count = items[i]
print ( "{0:<10}{1:>5}" . format (word,count))
|
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
曹操 953
孔明 836
将军 772
却说 656
玄德 585
关公 510
丞相 491
二人 469
不可 440
荆州 425
玄德曰 390
孔明曰 390
不能 384
如此 378
张飞 358
|
我们可以看到得出的结果与我们想象的有些差异,比如
- “却说”、“二人”等与人名无关
- “诸葛亮”、“孔明”都是同一个人
- “孔明”和“孔明曰”分词不符合我们的需求
所以我们需要对上面代码进行优化,在词频统计的基础上,面向问题改造我们的程序。
下面是《三国演义》人物数量统计代码的升级版,升级版中对于某些确定不是人名的词,即使做了词频统计,也要将它删除掉。使用寄一个集合excludes来接收一些确定不是人名但是又排序比较靠前的单词列进去。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
import jieba
txt = open ( "threekingdoms.txt" , "r" ,encoding = "utf-8" ).read()
excludes = { "将军" , "却说" , "荆州" , "二人" , "不可" , "不能" , "如此" }
words = jieba.lcut(txt)
counts = {}
for word in words:
if len (word) = = 1 :
continue
elif word = = "诸葛亮" or word = = "孔明曰" :
rword = = "孔明"
elif word = = "关公" or word = = "云长" :
rword = = "关羽"
elif word = = "玄德" or word = = "玄德曰" :
rword = = "刘备"
elif word = = "孟德" or word = = "丞相" :
rword = = "曹操"
else :
rword = word
counts[rword] = counts.get(rword, 0 ) + 1
items = list (counts.items())
items.sort(key = lambda x:x[ 1 ], reverse = True )
for i in range ( 15 ):
word, count = items[i]
print ( "{0:<10}{1:>5}" . format (word,count))
|
运行结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
曹操 963
孔明 847
张飞 366
商议 359
如何 352
主公 340
军士 320
吕布 303
左右 298
军马 297
赵云 283
刘备 282
引兵 279
次日 278
大喜 274
|
可以看出还是有像“商议”、“如何”等不是人物的词出现在统计结果,我们将这些词加入到 excludes 中,多次运行程序后最后得到《三国演义》任务出场顺序前20:
七、文本词频统计问题举一反三
应用问题扩展
- 《红楼梦》、《西游记》、《水浒传》...等名著都可以统计它的任务出场次数
- *工作报告、科研论文、新闻报道...中出现的大量的词频进行分析,进而找到每篇文章的重点内容
- 进一步,对文本的词语或词汇绘制成词云,使其展示的效果更加直观
以上内容资料均来源于中国大学MOOC网-北京理工大学Python语言程序设计课程
课程地址:https://www.icourse163.org/course/BIT-268001
以上就是python jieba库的基本使用的详细内容,更多关于python jieba库的资料请关注服务器之家其它相关文章!
原文链接:https://www.cnblogs.com/keepcode/p/14436010.html