Python统计单词出现的次数


Posted in Python onApril 04, 2018

题目:

统计一个文件中每个单词出现的次数,列出出现频率最多的5个单词。

前言:

这道题在实际应用场景中使用比较广泛,比如统计历年来四六级考试中出现的高频词汇,记得李笑来就利用他的编程技能出版过一本背单词的畅销书,就是根据词频来记单词,深受学生喜欢。这就是一个把编程技能用来解决实际问题的典型场景。另外,在数据分析时,那些词云效果本质上都是基于词频统计来调整字体的大小,如果你能熟练运用Python中的知识来解决问题的话,说明你真的入门Python了。

分析

本题主要考察以下几个方面的知识点:

1、如何正确读写文件

在python中读写文件可以使用内置函数open(),而 open 函数在python2 和 python3 中有一定的区别,比如 Python 中可以指定读写文件的编码格式,而 Python 则不可以,为了同时兼容2和3,我们通常会使用io模块下面的 open 函数,大家可以查文档搞清楚它们之间的区别,培养主动学习能力和查资料的习惯。

另外一点是读写文件完成之后是需要关闭文件描述符的,除了可以使用 try...except...finally的语法之后,我们还可以使用更优雅的 with … as 的语法来自动关闭文件。

2、如何对数据进行排序

sorted函数是一个使用频率很高的内置函数,它的用法也很强大,因为它可以通过指定参数 key 来进行自定义排序,也就意味着你不仅可以对数字排序、对字母排序、还可以对列表、字典、自定义的对象进行排序,你只需要要告诉 sorted 函数的排序规则是什么,比如一个people对象,我既可以根据年龄排序也可以根据身高体重来排序,所以这个函数时非常灵活的,另外,对于列表对象有自带的 sort 方法,如果能区分清楚 list.sort 与 sorted 之间区别那说明你已经能灵活运用了。

3、字典数据类型的运用

做词频统计,用字典无疑是最合适的数据类型,单词作为字典的key, 单词出现的次数作为字典的 value,很方便地就记录好了每个单词的频率,字典很像我们的电话本,每个名字关联一个电话号码。另外,字典最大的特点就是它的查询速度会非常快。理想情况下时间复杂度为O(1),我是说理想情况,如果你想深入了解字典的话,建议看看这篇文章 https://www.laurentluce.com/posts/python-dictionary-implementation/

4、正则表达式的运用

对文本、字符串处理,正则表达式简直是神器,无论是做数据爬虫还是数据清洗使用非常广泛,当然,正则表达式并不是Python特有的东西,所有编程语言都支持,我们要做的除了学习正则表达式还有他的API,只有熟悉了API我们才能运用到实际场景中去。关于正则表达式推荐一篇文章:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html ,另外我还发现有同学引入了jieba分词库,这个库在做中文分词非常有用,感兴趣的可以去了解一下。

实现

分析完之后,我们实现起来其实是非常快的。所以我们在拿到一个需求的时候,首先肯定是把需求弄清楚,想想大概可以用哪些技术来实现,随后才是动手写代码,其实我们在工作上,真正写代码的时间还不到一半。

# -*- coding:utf-8 -*-
import io
import re
class Counter:
 def __init__(self, path):
 """
 :param path: 文件路径
 """
 self.mapping = dict()
 with io.open(path, encoding="utf-8") as f:
  data = f.read()
  words = [s.lower() for s in re.findall("\w+", data)]
  for word in words:
  self.mapping[word] = self.mapping.get(word, 0) + 1
 def most_common(self, n):
 assert n > 0, "n should be large than 0"
 return sorted(self.mapping.items(), key=lambda item: item[1], reverse=True)[:n]
if __name__ == '__main__':
 most_common_5 = Counter("importthis.txt").most_common(5)
 for item in most_common_5:
 print(item)

打印结果:

('is', 10)
('better', 8)
('than', 8)
('the', 6)
('to', 5)

总结

我在看大家代码的时候,很多代码依然存在有命名不规范(建议读PEP8),代码的排版混乱(阅读起来很困难,建议用Pycharm进行格式化)。还有不少代码的实现方式看起来很复杂(往往越复杂的代码Bug越多)。当然,实现方法不是唯一。

比如Python模块本身就提供了一个collections.Counter的类,它继承自dict类,就是用于做统计的,我发现有部分同学使用的就是这个类来实现的,细心的你可能发现了,我实现的这个Counter和collections下面那个Counter很像,其实这就是造轮子,造轮子可以锻炼我们的编程思维,当然在工作上有现成的东西就没必要自己造轮子了,除非你有信心做得更好。你也可以思考思考,假如Python没有提供Counter这个工具,你该怎么做。

另外,该模块还提供一个有序的字典对象 OrderedDict,使用它可以免去我们手动排序的操作。最后建议大家学习总结上面我提到的所有内容。如果你能坚持100天,相信你对Python的掌握程度是游刃有余的。

以上所述是小编给大家介绍的Python统计单词出现的次数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
python简单文本处理的方法
Jul 10 Python
pycharm远程调试openstack的图文教程
Nov 21 Python
git进行版本控制心得详谈
Dec 10 Python
关于不懂Chromedriver如何配置环境变量问题解决方法
Jun 12 Python
用python打印1~20的整数实例讲解
Jul 01 Python
在Django中实现添加user到group并查看
Nov 18 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
Python数据结构dict常用操作代码实例
Mar 12 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
TensorFlow的自动求导原理分析
May 26 Python
高效使用Python字典的清单
Apr 04 #Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 #Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 #Python
使用Python设计一个代码统计工具
Apr 04 #Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 #Python
Python基于辗转相除法求解最大公约数的方法示例
Apr 04 #Python
对numpy中数组元素的统一赋值实例
Apr 04 #Python
You might like
Yii不依赖Model的表单生成器用法实例
2014/12/04 PHP
PHP中PDO连接数据库中各种DNS设置方法小结
2016/05/13 PHP
thinkphp实现分页显示功能
2016/12/03 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
2011/02/14 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
JavaScript文档碎片操作实例分析
2015/12/12 Javascript
JavaScript构造函数详解
2015/12/27 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
2016/09/04 Javascript
原生js实现addclass,removeclass,toggleclasss实例
2016/11/24 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
layUI实现三级导航菜单效果
2019/07/26 Javascript
js实现文字头像的生成代码
2020/03/07 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
python使用arp欺骗伪造网关的方法
2015/04/24 Python
Python实现快速多线程ping的方法
2015/07/15 Python
深入剖析Python的爬虫框架Scrapy的结构与运作流程
2016/01/20 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python 分离文件名和路径以及分离文件名和后缀的方法
2018/10/21 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
TCP/IP中的TCP和IP分别承担什么责任
2012/04/21 面试题
精彩的大学生自我评价
2013/11/17 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
拾金不昧表扬信怎么写
2015/05/04 职场文书
学生病假条怎么写
2015/08/17 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/06 PostgreSQL