词频统计

一、编译环境

(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: 词频统计相关推荐

  1. 软工作业3—词频统计

    一.案例课程分析 1.编译环境 pycharm2018.python3.7 2.读文件到缓存区(process_file(dst)) def process_file(dst): # 读文件到缓冲区 ...

  2. 软工作业 5:词频统计——增强功能

    一.基本信息 1.1 编译环境.项目名称.作者 1 #编译环境:python3.6 2 #项目名称:软工作业5-词频统计-增强功能 3 #作者:1613072055 潘博 4 # 1613072056 ...

  3. 第一次软工作业展示——潘学

    第一次软工作业完成啦! 回首这个作业的完成过程,我是很有收获.这个作业有几个难点:1.在给定目录下读取TXT文件的内容:2.从读到的内容中分析出单词:3.统计单词的出现频率并输出. 我之前只学习过C和 ...

  4. 第三次软工作业——实现最大字段和算法并进行判定条件覆盖

    第三次软工作业 实现最大子段和的算法并进行条件组合覆盖测试 (一)什么是最大子段和? 我自己的理解: 一个数组可以若干个子数组,包含自身.每一个字数组都有一个数组元素之和,求这些和之间的最大值. 最朴 ...

  5. 第一次软工作业(构建之法)

    第一次软工作业(构建之法) 关于构建之法的若干个问题 1.第一章32页,原文:"有人认为,"中文编程",是解决程序员编程效率的一个秘密武器,请问它是一个"银弹& ...

  6. 第一次软工作业(数独)

    第一次软工作业(数独) 1.该项目的github地址: https://github.com/514DNA/sudoku 2.各个模块耗费的时间: PSP2.1 Personal Software P ...

  7. java大作业国际比赛奖牌榜,java大作业之词频统计

    [实例简介] 开发工具idea,统计方式为java8的stream方式,不是传统的字节流统计方式,内含答辩PPT以及统计单词的文本,配置好后可直接使用 [实例截图] [核心代码] java大作业之词频 ...

  8. 软工作业4:词频统计

    一.基本信息 # 编译环境:Pycharm2018.Python3.7# 项目名称:词频统计--基本功能(结对编程)# 作者: 1613072050:马钰# 1613072051:朱佳豪# 16130 ...

  9. 2019/3/14 软工作业

    自我介绍 2017xxxxx1066:我是骆树仁:我的爱好是揉白泽球: 我的码云个人主页是:https://gitee.com/sturdast/events 我的第一个项目地址是:https://g ...

最新文章

  1. 【总结整理】关于切图
  2. 32岁被裁,拿N+1,我高兴地失业了
  3. 一个域名可以绑定多个公众号_如何在同一个浏览器中同时登录多个公众号?
  4. 版本控制可视化工具-Gource教程
  5. Maven学习之 仓库镜像
  6. 早上起来CSDN的PC端主页积分变成了0
  7. java集合类分析-hashset
  8. 新手学java7编程_新手学Java 7编程:面向对象程序设计
  9. volatile的正确使用姿势
  10. 2022年的第一个工作日,整理了风控的这些内容
  11. 一个小工具帮你搞定实时监控Nginx服务器
  12. 2014年5月第二个周末总结--保守自己的心
  13. android aysncTask面试解析
  14. 圣诞素材网站推荐 这几个网站超多免费可商用素材
  15. 【每日分享】我做程序员那些年犯下的罪,此时此刻我自己的笑出猪叫~
  16. 太虚幻境 文/江湖一劍客
  17. 分享一些Python导图与速查表
  18. Python解决羊车门问题
  19. 利用三星S3C6410源码实现同时压缩视频和图片
  20. Oracle Parallel Query

热门文章

  1. hdu 5339 Untitled【搜索】
  2. JavaSE学习总结(六)——接口、抽象类、内部类
  3. SQLServer · 最佳实践 · RDS for SQL Server 2012 权限限制的提升与改善
  4. 深入浅出说编译原理(一)
  5. 动态生成treeview
  6. 建立一个Web项目及一些错误解决办法
  7. exportfs命令和FTP服务
  8. 使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”。...
  9. 金融新手投标模块布局小Demo
  10. 搭建hadoop2.6.0 HA及YARN HA