软工作业3: 词频统计
词频统计
一、编译环境
(1)IDE:PyCharm 2018
(2)python版本:python3.6.3(Anaconda3-5.1.0 )
二、程序分析
(1)读文件到缓冲区(process_file(dst))
def process_file(dst): # 读文件到缓冲区try: # 打开文件file = open(dst, 'r') # dst为文本的目录路径except IOError as s:print(s)return Nonetry: # 读文件到缓冲区bvffer = file.read()except:print("Read File Error!")return Nonefile.close()return bvffer
(2)处理缓冲区,返回存放每个单词频率的字典word_freq(process_buffer(bvffer))
def process_buffer(bvffer): # 处理缓冲区,返回存放每个单词频率的字典word_freqif bvffer:# 下面添加处理缓冲区bvffer代码,统计每个单词的频率,存放在字典word_freqword_freq = {}# 将文本内容都改为小写且去除文本中的中英文标点符号for ch in '“‘!;,.?”': bvffer = bvffer.lower().replace(ch, " ")# strip()删除空白符(包括'/n', '/r','/t');split()以空格分割字符串words = bvffer.strip().split() for word in words:word_freq[word] = word_freq.get(word, 0) + 1return word_freq
(3)按照单词的频数排序,输出前十的单词(output_result(word_freq))
def output_result(word_freq):if word_freq:sorted_word_freq = sorted(word_freq.items(), key=lambda v: v[1], reverse=True)for item in sorted_word_freq[:10]: # 输出 Top 10 的单词print("单词:%s 频数:%d " % (item[0], item[1]))
(4)主程序输出前十结果
if __name__ == "__main__":dst = "src/A_Tale_of_Two_Cities.txt" # 《A_Tale_of_Two_Cities》的路径,另一组测试更改为《Gone_with_the_wind》的路径bvffer = process_file(dst)word_freq = process_buffer(bvffer)output_result(word_freq)
三、 代码风格说明
(1)python3与python2在print函数的使用上的区别:python3中,print函数要加上(),如上第一段代码的第五行。
print(s)
(2)不要使用 tab 缩进;使用任何编辑器写 Python,请把一个 tab 展开为 4 个空格;绝对不要混用 tab 和空格,否则容易出现 IndentationError。
(3)使用有意义的,英文单词或词组,绝对不要使用汉语拼音命名;变量名不要用单个字符。(除非变量名含义可从上下文很容易看出来)
for word in words:word_freq[word] = word_freq.get(word, 0) + 1
四、程序运行命令、运行结果截图
(1)编写完成 word_freq.py,在DOS窗口执行
①《Gone_with_the_wind》
运行命令:python C:/Users/asus/Desktop/software_engineering/SE16_WordCount/word_freq.py
运行截图:
②《A_Tale_of_Two_Cities》
运行命令:python C:/Users/asus/Desktop/software_engineering/SE16_WordCount/word_freq.py
运行截图:
(2)在PyCharm2018中直接运行
①《Gone_with_the_wind》
②《A_Tale_of_Two_Cities》
五、性能分析结果及改进
(1)寻找执行时间、次数最多的部分代码【参考博客 https://blog.csdn.net/asukasmallriver/article/details/74356771 】
①性能分析的代码:为了方便调用,把原本主函数的词频运行代码封装在main()函数中,性能分析代码放在主函数中。
def main(): # main函数封装词频运行dst = "C:/Users/asus/Desktop/software_engineering/SE16_WordCount/src/Gone_with_the_wind.txt" #《Gone_with_the_wind》的路径bvffer = process_file(dst)word_freq = process_buffer(bvffer)output_result(word_freq)if __name__ == "__main__":import cProfileimport pstatscProfile.run("main()", filename="word_freq.out")# 创建Stats对象p = pstats.Stats('word_freq.out')# 输出调用此处排前十的函数# sort_stats(): 排序# print_stats(): 打印分析结果,指定打印前几行p.sort_stats('calls').print_stats(10)# 输出按照运行时间排名前十的函数# strip_dirs(): 去掉无关的路径信息p.strip_dirs().sort_stats("cumulative", "name").print_stats(10)# 根据上面的运行结果发现函数process_buffer()最耗时间# 查看process_buffer()函数中调用了哪些函数p.print_callees("process_buffer")
②执行时间最长的代码
# 将文本内容都改为小写且去除文本中的中英文标点符号for ch in '“‘!;,.?”': bvffer = bvffer.lower().replace(ch, " ")
附:ncalls:表示函数调用的次数; tottime:表示指定函数的总的运行时间,除掉函数中调用子函数的运行时间;
percall:(第一个percall)等于 tottime/ncalls; cumtime:表示该函数及其所有子函数的调用运行的时间;
percall:(第二个percall)即函数运行一次的平均时间,等于 cumtime/ncalls;
filename:lineno(function):每个函数调用的具体信息;
③执行次数最多的代码
for word in words:word_freq[word] = word_freq.get(word, 0) + 1
(2)使用可视化工具分析【参考博客 https://blog.csdn.net/asukasmallriver/article/details/74356771 】
①工具:graphviz、Gprof2Dot
②对main()函数执行产生的word_freq.out进行可视化
③根据执行时间性能分析或根据执行次数性能分析可视化
(3)尝试改进程序代码
①分析:减少运行时间可以从两个方面减少:1)减少调用次数 ,2)减少每次调用的耗时,所以减少最多次调用的代码的耗时是实现改进最有效的方式;但是调用次数最多的代码是遍历字典对同一个词求出现次数,这个涉及到遍历算法的优化,不好修改;所以减少耗时最长的代码的运行时间
②实现:把bvffer.lower()放到for循环外
原来的代码:
# 将文本内容都改为小写且去除文本中的中英文标点符号for ch in '“‘!;,.?”': bvffer = bvffer.lower().replace(ch, " ")
修改后代码:
# 将文本内容都改为小写bvffer = bvffer.lower()#去除文本中的中英文标点符号for ch in '“‘!;,.?”':bvffer = bvffer.replace(ch, " ")
③结果对比
原来的运行结果:
修改后运行结果:
结论:修改后比修改前快了0.177s
转载于:https://www.cnblogs.com/KingGY/p/9722190.html
软工作业3: 词频统计相关推荐
- 软工作业3—词频统计
一.案例课程分析 1.编译环境 pycharm2018.python3.7 2.读文件到缓存区(process_file(dst)) def process_file(dst): # 读文件到缓冲区 ...
- 软工作业 5:词频统计——增强功能
一.基本信息 1.1 编译环境.项目名称.作者 1 #编译环境:python3.6 2 #项目名称:软工作业5-词频统计-增强功能 3 #作者:1613072055 潘博 4 # 1613072056 ...
- 第一次软工作业展示——潘学
第一次软工作业完成啦! 回首这个作业的完成过程,我是很有收获.这个作业有几个难点:1.在给定目录下读取TXT文件的内容:2.从读到的内容中分析出单词:3.统计单词的出现频率并输出. 我之前只学习过C和 ...
- 第三次软工作业——实现最大字段和算法并进行判定条件覆盖
第三次软工作业 实现最大子段和的算法并进行条件组合覆盖测试 (一)什么是最大子段和? 我自己的理解: 一个数组可以若干个子数组,包含自身.每一个字数组都有一个数组元素之和,求这些和之间的最大值. 最朴 ...
- 第一次软工作业(构建之法)
第一次软工作业(构建之法) 关于构建之法的若干个问题 1.第一章32页,原文:"有人认为,"中文编程",是解决程序员编程效率的一个秘密武器,请问它是一个"银弹& ...
- 第一次软工作业(数独)
第一次软工作业(数独) 1.该项目的github地址: https://github.com/514DNA/sudoku 2.各个模块耗费的时间: PSP2.1 Personal Software P ...
- java大作业国际比赛奖牌榜,java大作业之词频统计
[实例简介] 开发工具idea,统计方式为java8的stream方式,不是传统的字节流统计方式,内含答辩PPT以及统计单词的文本,配置好后可直接使用 [实例截图] [核心代码] java大作业之词频 ...
- 软工作业4:词频统计
一.基本信息 # 编译环境:Pycharm2018.Python3.7# 项目名称:词频统计--基本功能(结对编程)# 作者: 1613072050:马钰# 1613072051:朱佳豪# 16130 ...
- 2019/3/14 软工作业
自我介绍 2017xxxxx1066:我是骆树仁:我的爱好是揉白泽球: 我的码云个人主页是:https://gitee.com/sturdast/events 我的第一个项目地址是:https://g ...
最新文章
- 【总结整理】关于切图
- 32岁被裁,拿N+1,我高兴地失业了
- 一个域名可以绑定多个公众号_如何在同一个浏览器中同时登录多个公众号?
- 版本控制可视化工具-Gource教程
- Maven学习之 仓库镜像
- 早上起来CSDN的PC端主页积分变成了0
- java集合类分析-hashset
- 新手学java7编程_新手学Java 7编程:面向对象程序设计
- volatile的正确使用姿势
- 2022年的第一个工作日,整理了风控的这些内容
- 一个小工具帮你搞定实时监控Nginx服务器
- 2014年5月第二个周末总结--保守自己的心
- android aysncTask面试解析
- 圣诞素材网站推荐 这几个网站超多免费可商用素材
- 【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~
- 太虚幻境 文/江湖一劍客
- 分享一些Python导图与速查表
- Python解决羊车门问题
- 利用三星S3C6410源码实现同时压缩视频和图片
- Oracle Parallel Query
热门文章
- hdu 5339 Untitled【搜索】
- JavaSE学习总结(六)——接口、抽象类、内部类
- SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善
- 深入浅出说编译原理(一)
- 动态生成treeview
- 建立一个Web项目及一些错误解决办法
- exportfs命令和FTP服务
- 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
- 金融新手投标模块布局小Demo
- 搭建hadoop2.6.0 HA及YARN HA