当前位置: 首页 > news >正文

Python3求英文文档中每个单词出现的次数并排序

[本文出自天外归云的博客园]

题目要求:

1、统计英文文档中每个单词出现的次数。

2、统计结果先按次数降序排序,再按单词首字母降序排序。

3、需要考虑大文件的读取。

我的解法如下:

import chardet
import re


# 大文件读取生成器
def read_big_file(f_path, chunk_size=100):
    f = open(f_path, 'rb')
    while True:
        # 每次读取指定内存大小的内容
        chunk_data = f.read(chunk_size)
        if not chunk_data:
            break
        # 获取文件编码并返回解码后的字符串
        detect = chardet.detect(chunk_data)
        # print(f'文件编码:{detect["encoding"]}')
        yield chunk_data.decode(detect["encoding"])


# Pythonic大文件读取生成器
def read_big_file_pythonic(f_path):
    with open(f_path, "rb") as f:
        for line in f.readlines():
            yield line.decode()


# 设定分词符并用字典统计单词出现次数
def words_freq(data, freq={}):
    for word in re.split('[,. ]', data):
        if word in freq:
            freq[word] += 1
        elif word != "":
            freq[word] = 1
    return freq


if __name__ == '__main__':
    f_path = "en_text.txt"
    freq = {}
    for i in read_big_file_pythonic(f_path):
        freq = words_freq(i, freq)
    print(sorted(freq.items(), key=lambda x: (x[1], x[0]), reverse=True))

其中read_big_file方法存在的问题:按大小进行文件读取可能会在边界处将一个单词拆分为两个单词,目前没找到什么好办法解决。

其中read_big_file_pythonic方法存在的问题:按行迭代读取,如果大文件只有一行就不好了。

所以要看实际情况合理选择两种方法的使用。

相关文章:

  • 【享受工作系列】我们为什么工作之自我意识管理
  • 深入理解spring生命周期与BeanPostProcessor的实现原理
  • JS基础学习
  • 一个可以更好地调试的 Perl 模块
  • 系统认识JavaScript正则表达式
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 深入理解linux系统下proc文件系统内容
  • Servlet容器启动过程
  • 序列化有关内容
  • 30亿元收购比特币公司 鲁亿通称不是炒概念
  • [译] android应用开发者,你们真的了解Activity的生命周期吗?
  • 分布式系统的经典基础理论
  • 如何在工作中学习
  • 实现自动SSH连接
  • 以太坊教程:搭建环境、编写编译一个智能合约
  • 【108天】Java——《Head First Java》笔记(第1-4章)
  • 08.Android之View事件问题
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6之路之模块详解
  • Material Design
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • Mysql数据库的条件查询语句
  • python 装饰器(一)
  • Swift 中的尾递归和蹦床
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 近期前端发展计划
  • 警报:线上事故之CountDownLatch的威力
  • 前端攻城师
  • 全栈开发——Linux
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ​iOS实时查看App运行日志
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (ZT)一个美国文科博士的YardLife
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十四)Flask之flask-session组件
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (一)VirtualBox安装增强功能
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)母版页和相对路径
  • *2 echo、printf、mkdir命令的应用
  • .gitignore文件设置了忽略但不生效
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 设计一套高性能的弱事件机制
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET大文件上传知识整理
  • /proc/interrupts 和 /proc/stat 查看中断的情况
  • ??myeclipse+tomcat