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中http请求方法库汇总
Jan 06 Python
python socket网络编程之粘包问题详解
Apr 28 Python
ubuntu17.4下为python和python3装上pip的方法
Jun 12 Python
对Python中内置异常层次结构详解
Oct 18 Python
10分钟教你用Python实现微信自动回复功能
Nov 28 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 Python
keras:model.compile损失函数的用法
Jul 01 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
详解用Python把PDF转为Word方法总结
Apr 27 Python
Python 数据可视化之Seaborn详解
Nov 02 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
ThinkPHP3.2.3数据库设置新特性
2015/03/05 PHP
php实现三级级联下拉框
2016/04/17 PHP
php简单实现批量上传图片的方法
2016/05/09 PHP
PHP线程的内存回收问题
2016/07/08 PHP
php自定义截取中文字符串-utf8版
2017/02/27 PHP
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
2010/07/17 Javascript
jquery动态添加option示例
2013/12/30 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
JavaScript弹出新窗口并控制窗口移动到指定位置的方法
2015/04/06 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
js实现表单多按钮提交action的处理方法
2015/10/24 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
深入koa-bodyparser原理解析
2019/01/16 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
8个非常实用的Vue自定义指令
2020/12/15 Vue.js
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python实现排序算法
2014/02/14 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
pycharm解决关闭flask后依旧可以访问服务的问题
2020/04/03 Python
django Model层常用验证器及自定义验证器详解
2020/07/15 Python
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
鞋子女王塔玛拉·梅隆同名奢侈品牌:Tamara Mellon
2017/11/22 全球购物
戴尔新加坡官网:Dell Singapore
2020/12/13 全球购物
艺术专业大学生自我评价
2013/09/22 职场文书
奥巴马演讲稿
2014/01/08 职场文书
决心书范文
2014/03/11 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
Html5通过数据流方式播放视频的实现
2021/04/27 HTML / CSS
CSS完成视差滚动效果
2021/04/27 HTML / CSS
mysql联合索引的使用规则
2021/06/23 MySQL
教你在 Java 中实现 Dijkstra 最短路算法的方法
2022/04/08 Java/Android