Python统计单词出现次数:从文件读写到词频排序实战
本文详解如何使用Python统计文件中单词出现频率并提取高频词。内容涵盖Python2与3的文件读写兼容、正则表达式提取单词、字典数据结构应用及sorted函数排序技巧。同时对比手动实现与collections.Counter模块,提供完整代码示例与最佳实践建议。
题目要求
统计指定文件中每个单词出现的次数,并列出出现频率最高的5个单词。
前言
该应用场景在实际工作中十分常见,例如统计历年四六级考试的高频词汇。李笑来曾利用编程技能出版畅销书,通过词频记忆法帮助学生背单词,这是编程解决实际问题典型案例。此外,词云效果本质也是基于词频统计来调整字体大小。若能熟练运用Python知识解决此类问题,标志着已真正入门Python开发。
分析思路
本题主要考察以下核心知识点:
1、如何正确读写文件
在Python中,读写文件可使用内置函数open()。需要注意的是,Python 2与Python 3在open函数行为上存在差异,例如Python 3允许指定编码格式而Python 2不支持。为确保代码同时兼容Python 2和3,通常建议使用io模块下的open函数。建议查阅文档了解具体区别,以此培养主动学习与查阅资料的能力。
此外,文件读写完成后需关闭文件描述符。除了使用try...except...finally语法外,更推荐使用优雅的with...as语法来自动管理文件关闭操作。
2、如何对数据进行排序
sorted函数是高频使用的内置函数,功能强大。它可通过指定key参数进行自定义排序,不仅支持数字和字母排序,还能对列表、字典及自定义对象排序。只需定义排序规则即可,例如对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统计单词出现的次数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













