Python【组合数据类型2】:字典、jieba库、文本词频统计

一、字典

  1. 映射:是一种键(索引)和值(数据)的对应。

‘streetAddr’:‘中关村南大街5号’
‘city’:‘北京市’
‘zipcode’:‘100081’

  1. 由用户 为数据 定义 索引的一种映射类型。
  2. 键值对:键是数据索引的扩展
  3. 字典是键值对的几何,键值对之间无序
  4. 采用大括号 {}dict() 创建,键值对用冒号**:**表示
>>> d={'中国':'北京','美国':'华盛顿','法国':'巴黎'}
>>> d
{'中国': '北京', '美国': '华盛顿', '法国': '巴黎'}
>>> d['中国']
'北京'

字典与集合

  1. 字典由键值对组成,集合是单个的元素;
  2. 集合中如果生成空的集合类型,不能使用 {} 的形式,空 {} 是默认来生成字典类型的。
  3. 如果想生成 空的集合 类型,应采用 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()
('法国', '巴黎')
注意:
  1. 返回的dict_keys是一种字典的key类型,或字典的values类型。
  2. 这些类型可以用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库

  1. jieba库的安装:

(cmd命令行)pip install jieba

若安装失败,将安装库的网址指定为国内映射网址:

pip install jieba -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com

  1. jieba分词的原理
  • 利用一个中文词库,确定汉子之间的关联概率;
  • 汉字间概率大的组成词组,形成分词结果;
  • 出了分词,用户还可以添加自定义的词组。
  1. 三种模式:精确模式、全模式、搜索引擎模式。
函数描述
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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部