案例研究:文本统计
2025-02-17
概述
本案例将介绍如何开发一个文本统计程序,通过这个实例学习:
- 如何分析和描述问题
- 如何处理文本数据
- 如何进行性能优化
- 如何组织完整程序
问题描述
目标
开发一个文本统计程序,实现以下功能:
计算文本文件的基本统计信息:
- 字符数
- 行数
- 单词数
分析词频:
- 统计单词出现次数
- 找出出现频率最高的前10个单词
- 按出现次数排序显示结果
示例分析
以下面的文本为例:
A long time ago, in a galaxy far, far away...基本统计:
- 1行文本(以\n为行尾标识)
- 46个字符(包括空格和标点)
- 10个单词
文本预处理
基本处理
text = 'A long time ago, in a galaxy far, far away...'
# 计算字符数
print(f"字符数: {len(text)}") # 46
# 分割单词
words = text.split()
print(f"单词数: {len(words)}") # 10
print(f"单词列表: {words}")文本标准化
为了准确统计单词,需要进行以下处理:
- 转换为小写
- 处理标点符号
- 处理特殊情况
需要注意的问题
标点符号处理
- 保留撇号和连字符(如:I'd, well-known)
- 其他标点符号需要删除
大小写处理
- 统一转换为小写
- 可能影响专有名词识别(如:Polish -> polish)
实现代码
# 定义要保留的字符集
VALID_CHARS = set('abcdefghijklmnopqrstuvwxyz -\'')
def normalize_text(text: str) -> str:
"""
标准化文本:转小写并只保留有效字符
Args:
text: 输入文本
Returns:
str: 标准化后的文本
"""
return ''.join(c for c in text.lower() if c in VALID_CHARS)
# 测试
text = "I'd like a copy!"
print(normalize_text(text)) # "i'd like a copy"大文件处理
处理大型文本文件时需要注意:
- 使用生成器逐行读取文件
- 避免一次性将整个文件加载到内存
- 分块处理大文件
def process_large_file(filename: str, chunk_size: int = 1024 * 1024):
"""
分块处理大文件
Args:
filename: 文件名
chunk_size: 每次读取的块大小(默认1MB)
"""
with open(filename, 'r', encoding='utf-8') as f:
while True:
chunk = f.read(chunk_size)
if not chunk:
break
# 处理文本块
process_chunk(chunk)注意:
- 合理设置块大小
- 注意内存使用
- 处理文件编码