Python【组合数据类型2】:字典、jieba库、文本词频统计
一、字典
- 映射:是一种键(索引)和值(数据)的对应。
‘streetAddr’:‘中关村南大街5号’
‘city’:‘北京市’
‘zipcode’:‘100081’
- 由用户 为数据 定义 索引的一种映射类型。
- 键值对:键是数据索引的扩展
- 字典是键值对的几何,键值对之间无序
- 采用大括号 {} 和 dict() 创建,键值对用冒号**:**表示
>>> d={'中国':'北京','美国':'华盛顿','法国':'巴黎'}
>>> d
{'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
>>> d['中国']
'北京'
字典与集合
- 字典由键值对组成,集合是单个的元素;
- 集合中如果生成空的集合类型,不能使用 {} 的形式,空 {} 是默认来生成字典类型的。
- 如果想生成 空的集合 类型,应采用 set() 函数 来完成。
字典的相关函数
| 函数或方法 | 描述 |
|---|---|
| del d[k] | 删除 字典d 中 键k 对应的数据值 |
| k in d | 判断 键k 是否在 字典d 中,在返回True,否则False |
| d.keys() | 返回 字典d 中所有的键信息 |
| d.values() | 返回 字典d 中所有的值信息 |
| d.items() | 返回 字典d 中所有的键值对信息 |
| d.get(k,< default >) | 获取指定键k的值。如果键k存在,则 返回 相应值,不在则返回< default >值 |
| d.pop(k,< default >) | 键k存在,则 取出 相应值,不在则返回< default >值 |
| d.popitem() | 随机从字典d中取出一个键值对,以元组形式返回 |
| d.clear() | 删除所有的键值对 |
| len(d) | 返回字典d中元素的个数 |
示例:
>>> d={'中国':'北京','美国':'华盛顿','法国':'巴黎'}
>>> '中国' in d
True
>>> d.keys()
dict_keys(['中国', '美国', '法国'])
>>> d.values()
dict_values(['北京', '华盛顿', '巴黎'])
>>> d.items()
dict_items([('中国', '北京'), ('美国', '华盛顿'), ('法国', '巴黎')])
>>>
>>> d.get('中国','伊斯兰堡') #以中国为键,去获得在字典d中对应的值
'北京'
>>> d.get('巴基斯坦','伊斯兰堡')
'伊斯兰堡'
>>> d.popitem()
('法国', '巴黎')
注意:
- 返回的dict_keys是一种字典的key类型,或字典的values类型。
- 这些类型可以用for…in…的方式做遍历,但不能当做列表 类型来操作。
>>> d = {} #定义一个空字典
>>> d['a']=1;d['b']=2 #向d新增2个键值对元素
>>> d['b']=3 #修改第2个元素
>>> 'c'in d #判断字符'c'是否是d的键
False
>>> len(d) #计算d的长度
2
>>> d.clear() #清空d
>>> d
{}
二、jieba库
- jieba库的安装:
(cmd命令行)pip install jieba
若安装失败,将安装库的网址指定为国内映射网址:
pip install jieba -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
- jieba分词的原理
- 利用一个中文词库,确定汉子之间的关联概率;
- 汉字间概率大的组成词组,形成分词结果;
- 出了分词,用户还可以添加自定义的词组。
- 三种模式:精确模式、全模式、搜索引擎模式。
| 函数 | 描述 |
|---|---|
| jieba.lcut(s) | 精确模式,返回一个列表类型的分词结果 |
| jieba.lcut(s.cut_all=True) | 全模式,返回一个列表类型的分词结果,存在冗余 |
| jieba.lcut_for_search(s) | 搜索引擎模式,返回一个列表类型的分词结果,存在冗余 |
| jieba.add_word(w) | 向分词词典增加新词 w |
示例:
>>> import jieba
>>> jieba.lcut('中国是一个伟大的国家')
['中国', '是', '一个', '伟大', '的', '国家']
>>> jieba.lcut('中国是一个伟大的国家',cut_all=True)
['中国', '国是', '一个', '伟大', '的', '国家']
>>> jieba.lcut_for_search('中华人民共和国是伟大的')
['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的']
>>> jieba.lcut('中华人民共和国是伟大的')
['中华人民共和国', '是', '伟大', '的']
三、文本词频统计
- 字符串处理函数:

| 字典函数 | 描述 |
|---|---|
| d.get(k,< default >) | 以k为键索引字典对应的值。如果键k存在,则获取相应值,不在则返回< default >值 |
- 【关于函数lambda,查看文章】
- 【关于函数sort(),查看文章】
1. 统计《Hamlet》中的词频
#CalHamlet_get.py
def getText(): #用空格替代标点,获得纯文字的文本;txt = open('Hamlet.txt','r').read()txt = txt.lower()for ch in '~!@#$%^&*()_+={}[]|\':";<>,.?/-':txt = txt.replace(ch," ")return txthamletTxt = getText()
words = hamletTxt.split() #用空格分隔文本,返回列表;
counts = {}
#对words中所有word进行循环统计,获取对应的值,统计出现的次数;
for word in words:counts[word]=counts.get(word,0)+1 #是counts[],不是counts()!#用当前单词作为键,索引字典,如果它在里面,返回它的次数+1,说明它又出现了一次#如果当前单词不在字典中,就把它加到字典中,并且赋给当前值为0,那么0+1是当前出现了一次items = list(counts.items())#counts.item()用来返回字典counts中所有的键值对;#将字典转换为列表,以用来排序。items.sort(key=lambda x:x[1],reverse=True)#lambda用来指定在列表中,使用键值对的第2个元素作为排序列,默认排序为从小到大。
for i in range(10): word,count = items[i] #提取列表序号为0~9的元素print("{0:-<10}{1:>5}".format(word,count))#word靠左排,共10个字符,空字符用-填充;count靠右排,共5个字符。
输出结果为:
the------- 1143
and------- 966
to-------- 762
of-------- 669
i--------- 631
you------- 554
a--------- 546
my-------- 514
hamlet---- 471
in-------- 451
2. 统计《三国演义》中的人物词频
- 【初级版】:无法区分人名,不准确
#Cal_ThreeKingdoms1.py
import jieba
txt = open('三国演义.txt','r',encoding='utf-8').read()
words = jieba.lcut(txt)
counts={}
for word in words:if len(word)==1:continueelse: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))
# 输出结果:
曹操-------- 953
孔明-------- 836
将军-------- 772
却说-------- 656
玄德-------- 585
关公-------- 510
丞相-------- 491
二人-------- 469
不可-------- 440
荆州-------- 425
玄德曰------- 390
孔明曰------- 390
不能-------- 384
如此-------- 378
张飞-------- 358
- 【高级版】:设置排除词库
#Cal_ThreeKingdoms2.py
import jieba
txt = open('三国演义.txt','r',encoding='utf-8').read()
#设置排除词库
excludes = {'将军','却说','荆州','二人','不可','不能','如此'}
words = jieba.lcut(txt)
counts={}
for word in words:if len(word)==1:continueelif word =='诸葛亮' or word =='孔明曰':rword = '孔明'elif word =='关公' or word == '云长':rword = '关羽'elif word =='玄德' or word == '玄德曰':rword = '刘备'elif word =='孟德' or word == '丞相':rword = '曹操'else:rword = wordcounts[rword]=counts.get(rword,0)+1
for word in excludes:del counts[word]
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))
# 输出结果:
曹操-------- 1451
孔明-------- 1383
刘备-------- 1252
关羽-------- 784
张飞-------- 358
商议-------- 344
如何-------- 338
主公-------- 331
军士-------- 317
吕布-------- 300
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
