Python实例分析

您所在的位置:网站首页 today的词组 Python实例分析

Python实例分析

2023-11-24 16:40| 来源: 网络整理| 查看: 265

基于中国大学mooc网嵩天老师的《Python语言程序设计》课程实例

文章目录 一、数字文本 pi二、英文文本 *Hamlet*三、中文文本《三国演义》

一、数字文本 pi

问题描述: 统计并输出圆周率pi小数点后1000位中各数字出现频率并排序

完整代码:

txt = open('pi1000.txt', 'r').read() # 获取文本文件 counts = {} # 创建空字典 for num in txt: if num == ' ': # 排除数字文本中可能出现的空格 continue else: counts[num] = counts.get(num, 0) + 1 # 统计词频并在字典中创建键值对 items = list(counts.items()) # 将无序的字典类型转换为可排序的列表类型 items.sort(key=lambda x: x[1], reverse=True) # 以元素的第二列进行从大到小排序 for i in range(10): num, count = items[i] print("{:5}".format(num, count)) # 格式化输出排序结果

结果展示: 在这里插入图片描述

二、英文文本 Hamlet

问题描述: 输出 Hamlet 中前10个高频词语及其次数

实例分析: 从思路上看,词频统计只是累加问题,即对每一个词设计一个计数器,词语每出现一次,相关计数器加1。使用字典类型能够很好地解决这个问题:以词语为键,计数器为值,构成 : 的键值对

第一步,是分解并提取英文文档中的单词。但是文本中存在噪音干扰:同一个英文单词存在大小写不同形式,而计数却不能区分大小写。因此,需要将大小写单词归一化。除此之外,文本中还有各种各样的标点符号及空格等特殊符号,在统计时需要删除并统一分隔方式。第二步,是对每个单词进行计数。计数时要确保每个单词都能被精确计数,做到不遗漏不重复。第三步,是对单词的统计值从高到低进行排序。由于字典类型没有顺序,需要将其转换为有顺序的列表类型。

具体步骤及代码分析: 首先下载保存文本,将内容保存在一个txt文档中。文本查看地址:Hamlet 注意:py文件应与文本文件位于统一路径下,否则打开文件时应指定具体路径。

完整代码:

# 首先定义一个函数,用于提取文档并处理噪音 def getText(): txt = open("Hamlet.txt", 'r').read() txt = txt.lower() for ch in '!"#$%&()*+,-./:;?@[\\]^_‘{|}~': txt = txt.replace(ch, ' ') # 将文本中的特殊字符替换为空格 return txt hamletTxt = getText() words = hamletTxt.split() # 获得分割完成的单词列表 counts = {} # 创建空字典,存放词频统计信息 for word in words: counts[word] = counts.get(word, 0) + 1 # 若字典中无当前词语则创建一个键值对,若有则将原有值加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:5}".format(word, count)) # 格式化输出词频统计结果

重要代码片段: (1)

for ch in '!"#$%&()*+,-./:;?@[\\]^_‘{|}~': txt = txt.replace(ch, ' ')

此段代码用于将文本中所有可能出现的特殊字符替换为空格,从而排除噪音干扰,以便后续提取单词

(2)

for word in words: counts[word] = counts.get(word,0) + 1

此段代码用于统计各单词的出现频率,是以下代码的简洁表示:

if word in counts: counts[word] = counts[word] + 1 else: count[word] = 1

(3)

items = list (counts.items()) items.sort(key = lambda x:x[1],reverse = True)

此段代码用于将无序的字典转换为可以排序的列表,并根据第二列进行排序

结果展示: 在这里插入图片描述

三、中文文本《三国演义》

问题描述: 统计并输出《三国演义》中出场次数最多的前15位人物

实例分析: 《三国演义》中文分词,需要用到中文分词库 jieba 。除了基本的词频统计外,需要注意的是书中人物多具有别称和代称,如:诸葛亮,也可称为孔明、丞相等。因此在处理时需要将这些名称和代称都视为一种情况;同时也要排除一些常用的词语,如:将军、却说、二人、荆州、不可等。这些干扰词汇是多次经过词频统计程序运行后得到的。

具体步骤及代码分析: 首先下载保存文本文件。文本下载地址:《三国演义》

完整代码:

import jieba txt = open("threekingdoms.txt", "r", encoding="utf-8").read() # 以utf-8格式打开文件 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 == "孟德曰" or word == "丞相": rword = "曹操" elif word == "关公" or word == "云长": rword = "关羽" elif word == "张翼德" or word == "翼德": rword = "张飞" else: rword = word counts[rword] = counts.get(rword, 0) + 1 # 若字典中没有则创建键值对,有则在原有值上加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(15): word, count = items[i] print("{0:5}".format(word, count)) # 格式化输出前15个高频出现人物

结果展示: 在这里插入图片描述

附:三个txt文本资源链接:https://pan.baidu.com/s/1yZrBbU4JuxE-qjTjaCALEg?pwd=5r66 提取码:5r66 注意文件与程序放在同一路径下



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3