字典类型及操作
字典的定义
理解“映射”
映射是一种键(索引)和值(数据)的对应
字典类型是“映射”的体现
键值对:键是数据索引的扩展
字典是键值对的集合,键值对之间无序
采用大括号{}和dict()创建,键值对用冒号: 表示
{<键1>:<值1>,<键2>:<值3>}
可以通过键拿到值
我们在之前的的集合中说声明一个空集合要使用set(),而不是直接用{}这是因为,如果使用{}默认为集合
字典的处理函数及方法
注意keys()和values()返回的是一种字典的key类型,这些类型是可以用for in的方式做遍历,但是不能当做列表类型来操作
这里要注意的是:如果我们使用get()找键时没有找到,那就返回第二个设置的参数,否则返回值
# 定义空字典d d={} # 向d新增2个键值对元素 d[0]=1 d[1]=2 # 修改第2个元素 d[1]=3 # 判断字符"c"是否是d的键 "c" in d # 计算d的长度 len(d) # 清空d d.clear()
Jieba库的使用
jieba库概述:jieba是优秀的中文分词第三方库
中文文本需要通过分词获得单个的词语
jieba是优秀的中文分词第三方库,需要额外安装
jieba库提供三种分词模式,最简单只需掌握一个函数
jieba库的安装
(cmd命令行) pip install jieba
jieba分词的原理
jieba分词依靠中文词库
利用一个中文词库,确定中文字符之间的关联概率
中文字符间概率大的组成词组,形成分词结果
除了分词,用户还可以添加自定义的词组
jieba库使用说明
精确模式、全模式、搜索引擎模式
精确模式:把文本精确的切分开,不存在冗余单词
全模式:把文本中所有可能的词语都扫描出来,有冗余
搜索引擎模式:在精确模式基础上,对长词再次切分
jieba分词要点 jieba.lcut(s)
文本词频统计--英文
需求:一篇文章,出现了哪些词?哪些词出现得最多?
该怎么做呢? 这里要分中文文本 和 英文文本
英文文本:Hamet 分析词频
https://python123.io/resources/pye/hamlet.txt
中文文本:《三国演义》 分析人物
https://python123.io/resources/pye/threekingdoms.txt
文章来源地址https://www.toymoban.com/news/detail-790915.html
这段代码的作用是读取一个名为“hamlet.txt”的文本文件,将其转换为小写字母,并将文本中的特殊字符替换为空格。然后,将文本中的单词分割,并统计每个单词出现的次数。最后,按照单词出现次数从高到低的顺序,输出出现次数最多的前10个单词及其出现次数。
具体实现过程如下:
-
定义函数
getText()
,它打开名为“hamlet.txt”的文本文件,并将文件内容读取到变量txt
中。 -
将
txt
中的所有字符转换为小写字母。 -
遍历字符串
txt
中的每个字符,如果字符是特殊字符,则将其替换为空格。 -
返回处理后的文本
txt
。 -
调用
getText()
函数,将处理后的文本赋值给变量hamletTxt
。 -
将
hamletTxt
中的单词通过空格分割,并将每个单词的出现次数保存在字典counts
中。 -
将
counts
转换为列表items
,并按照每个元素的第二个值(即单词出现次数)从高到低排序。 -
遍历
items
列表的前10个元素,将每个元素的第一个值(即单词)和第二个值(即出现次数)输出到屏幕上。其中,{0:<10}
表示输出第一个值(即单词)时左对齐占用10个字符的位置,{1:>5}
表示输出第二个值(即出现次数)时右对齐占用5个字符的位置。
文本词频统计--中文
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))
这段代码的作用是读取一个名为“threekingdoms.txt”的文本文件,使用结巴分词库将文本中的中文分词,并统计每个词语出现的次数。最后,按照词语出现次数从高到低的顺序,输出出现次数最多的前15个词语及其出现次数。
具体实现过程如下:
-
导入结巴分词库
jieba
。 -
打开名为“threekingdoms.txt”的文本文件,并将文件内容读取到变量
txt
中。注意需要指定文件编码为utf-8
。 -
使用结巴分词库
jieba
中的lcut()
函数对文本进行分词,并将分词结果保存在列表words
中。 -
创建一个空字典
counts
,用于保存每个词语的出现次数。 -
遍历列表
words
中的每个词语,如果该词语的长度为1,则跳过该词语;否则,将该词语的出现次数加1,并保存到字典counts
中。 -
将字典
counts
转换为列表items
,并按照每个元素的第二个值(即词语出现次数)从高到低排序。 -
遍历
items
列表的前15个元素,将每个元素的第一个值(即词语)和第二个值(即出现次数)输出到屏幕上。其中,{0:<10}
表示输出第一个值(即词语)时左对齐占用10个字符的位置,{1:>5}
表示输出第二个值(即出现次数)时右对齐占用5个字符的位置。
但是存在一个bug,将词频与人物并没有相关联
import jieba
excludes = {"将军","却说","荆州","二人","不可","不能","如此"}
txt = open("threekingdoms.txt", "r", encoding='utf-8').read()
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
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]
中文文本分词
使用字典表达词频
扩展程序解决问题
面向问题改造程序
这段代码的功能是读取《三国演义》文本文件,使用jieba分词库对文本进行分词,并统计关键词出现的频率。在统计关键词的过程中,对一些关键词进行了简化和替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。
该代码的面向问题改造思路如下:
-
问题:需要统计《三国演义》中出现频率最高的关键词。
-
解决方案:使用jieba分词库对文本进行分词,并统计关键词出现的频率,然后按照出现频率从高到低排序,选取出现频率最高的前10个关键词。
-
实现步骤:
- 读取《三国演义》文本文件,使用jieba分词库对文本进行分词。
- 统计分词结果中各个关键词出现的频率,将结果存储在字典counts中。
- 对一些关键词进行简化和替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。
- 删除一些无意义的关键词,如“将军”、“却说”、“荆州”、“二人”、“不可”、“不能”、“如此”。
- 将counts转换为列表items,并按照出现频率从高到低排序。
- 选取出现频率最高的前10个关键词,并输出结果。
文章来源:https://www.toymoban.com/news/detail-790915.html
到了这里,关于字典类型操作、jieba库使用及文本词频统计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!