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中的super用法详解
May 28 Python
Python如何import文件夹下的文件(实现方法)
Jan 24 Python
对Python 2.7 pandas 中的read_excel详解
May 04 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
May 10 Python
python 与服务器的共享文件夹交互方法
Dec 27 Python
Python分割训练集和测试集的方法示例
Sep 19 Python
PyTorch中反卷积的用法详解
Dec 30 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
Python基于callable函数检测对象是否可被调用
Oct 16 Python
python unittest单元测试的步骤分析
Aug 02 Python
python开发的自动化运维工具ansible详解
Aug 07 Python
Python批量解压&压缩文件夹的示例代码
Apr 04 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
介绍php设计模式中的工厂模式
2008/06/12 PHP
PHP的变量总结 新手推荐
2011/04/18 PHP
php筛选不存在的图片资源
2015/04/28 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
2016/03/21 PHP
ThinkPHP中Common/common.php文件常用函数功能分析
2016/05/20 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
thinkphp3.2.0 setInc方法 源码全面解析
2018/01/29 PHP
javascript函数中的arguments参数
2010/08/01 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
javascript中节点的最近的相关节点访问方法
2013/03/20 Javascript
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
js中判断用户输入的值是否为空的简单实例
2013/12/23 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
AngularJS中过滤器的使用与自定义实例代码
2016/09/17 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
原生js实现打字动画游戏
2017/02/04 Javascript
使用jquery判断一个元素是否含有一个指定的类(class)实例
2017/02/12 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
Vue2实时监听表单变化的示例讲解
2018/08/30 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
[01:23:24]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第三场 2月7日
2021/03/11 DOTA
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
Python实现的拉格朗日插值法示例
2019/01/08 Python
Pycharm 实现下一个文件引用另外一个文件的方法
2019/01/17 Python
详解django中url路由配置及渲染方式
2019/02/25 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
通过代码简单了解django model序列化作用
2020/11/12 Python
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
工程业务员岗位职责
2013/12/31 职场文书
辞职信格式模板
2015/02/27 职场文书
求职简历自我评价范文
2015/03/10 职场文书
婚礼伴郎致辞
2015/07/28 职场文书