Python统计单词出现次数:从文件读写到词频排序实战

Noah
Noah
发布时间:2026-10-13| 6人浏览过
原创

本文详解如何使用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统计单词出现的次数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。