本文介绍: 理解映射映射是一种键(索引)和值(数据)的对应字典类型是“映射”的体现键值对:键是数据索引扩展字典键值对的集合键值对之间无序采用括号{}和dict()创建键值对用冒号: 表示{:,:}可以通过键拿到值我们在之前的的集合中说声明一个集合使用set(),而不是直接用{}这是因为,如果使用{}默认集合

字典类型操作

字典的定义

理解映射

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

字典类型是“映射”的体现

键值对:键是数据索引扩展

字典是键值对的集合,键值对之间无序

采用括号{}和dict()创建键值对用冒号: 表示

{&lt;键1&gt;:&lt;值1&gt;,&lt;键2&gt;:<值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 

 

这段代码作用读取一个名为“hamlet.txt”的文本文件,将其转换为小写字母,并将文本中的特殊字符替换为空格。然后,将文本中的单词分割,并统计每个单词出现的次数最后,按照单词出现次数从高到低的顺序输出出现次数最多的前10个单词及其出现次数。

具体实现过程如下

  1. 定义函数 getText(),它打开名为“hamlet.txt”的文本文件,并将文件内容读取变量 txt 中。

  2. 将 txt 中的所有字符转换为小写字母

  3. 遍历字符串 txt 中的每个字符,如果字符特殊字符,则将其替换为空格。

  4. 返回处理后的文本 txt

  5. 调用 getText() 函数,将处理后的文本赋值变量 hamletTxt

  6. 将 hamletTxt 中的单词通过空格分割,并将每个单词的出现次数保存在字典 counts 中。

  7. 将 counts 转换列表 items,并按照每个元素第二个值(即单词出现次数)从高到低排序

  8. 遍历 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个词语及其出现次数。

具体实现过程如下

  1. 导入结巴分词库 jieba

  2. 打开名为“threekingdoms.txt”的文本文件,并将文件内容读取变量 txt 中。注意需要指定文件编码为 utf-8

  3. 使用结巴分词库 jieba 中的 lcut() 函数对文本进行分词,并将分词结果保存列表 words 中。

  4. 创建一个空字典 counts用于保存每个词语的出现次数。

  5. 遍历列表 words 中的每个词语,如果该词语的长度为1,则跳过该词语;否则,将该词语的出现次数加1,并保存到字典 counts 中。

  6. 将字典 counts 转换列表 items,并按照每个元素的第二个值(即词语出现次数)从高到低排序

  7. 遍历 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分词库对文本进行分词,并统计关键词出现的频率。在统计关键词过程中,对一些关键词进行了简化替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。

代码面向问题改造思路如下

  1. 问题需要统计《三国演义》中出现频率最高的关键词

  2. 解决方案:使用jieba分词库对文本进行分词,并统计关键词出现的频率然后按照出现频率从高到低排序选取出现频率最高的前10个关键词

  3. 实现步骤

  • 读取《三国演义》文本文件,使用jieba分词库对文本进行分词。
  • 统计分词结果中各个关键词出现的频率,将结果存储在字典counts中。
  • 对一些关键词进行简化和替换,如“孔明曰”简化为“孔明”,“玄德曰”简化为“刘备”,“丞相”替换为“曹操”。
  • 删除一些无意义的关键词,如“将军”、“却说”、“荆州”、“二人”、“不可”、“不能”、“如此”。
  • 将counts转换为列表items,并按照出现频率从高到低排序
  • 选取出现频率最高的前10个关键词,并输出结果。

 

原文地址:https://blog.csdn.net/weixin_64612659/article/details/129821830

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_26308.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注