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

使用Python构建高效词汇表:N-Gram词频统计实战

在自然语言处理(NLP)领域,构建高效的词汇表是文本预处理的关键步骤。本文将解析一个使用Python实现的n-gram词频统计工具,并展示如何将其转化为可复用的技术博客内容。

一、项目背景与目标

1.1 技术需求

  • 高效处理大规模文本数据
  • 支持不同长度的n-gram组合
  • 内存优化的词频统计方案
  • 可扩展的代码结构设计

1.2 核心技术栈

from collections import Counter
import pandas as pd
from tqdm import tqdm
import numpy as np

二、核心代码解析

2.1 数据处理函数

def process_line(line_vocab, len_size):"""处理单行数据,构建局部词汇表参数:line_vocab (str): 输入文本行len_size (int): n-gram长度返回:Counter: 词频统计对象"""local_vocab = Counter()# 单字统计if len_size == 1:local_vocab.update(Counter(list(line_vocab)))# 双字组合统计    elif len_size == 2:vocab_data = np.array([list(line_vocab[:-1]), list(line_vocab[1:])])vocab_data = vocab_data[0,:] + vocab_data[1,:]local_vocab.update(Counter(vocab_data.tolist()))# 三字组合统计    elif len_size == 3:vocab_data = np.array([list(line_vocab[:-2]), list(line_vocab[1:-1]), list(line_vocab[2:])])vocab_data = vocab_data[0,:] + vocab_data[1,:] + vocab_data[2,:]local_vocab.update(Counter(vocab_data.tolist()))# 四字组合统计    elif len_size == 4:vocab_data = np.array([list(line_vocab[:-3]), list(line_vocab[1:-2]), list(line_vocab[2:-1]), list(line_vocab[3:])])vocab_data = vocab_data[0,:] + vocab_data[1,:] + vocab_data[2,:] + vocab_data[3,:]local_vocab.update(Counter(vocab_data.tolist()))# 五字组合统计    elif len_size == 5:vocab_data = np.array([list(line_vocab[:-4]), list(line_vocab[1:-3]), list(line_vocab[2:-2]), list(line_vocab[3:-1]), list(line_vocab[4:])])vocab_data = vocab_data[0,:] + vocab_data[1,:] + vocab_data[2,:] + vocab_data[3,:] + vocab_data[4,:]local_vocab.update(Counter(vocab_data.tolist()))del line_vocab  # 显式释放内存return local_vocab

2.2 数据处理流程

# 加载预处理数据
lines = pd.read_pickle("pretrain_hq.pkl")# 初始化全局词表
global_vocab = Counter()# 逐行处理
for line in tqdm(lines):global_vocab.update(process_line(line, 1))# 保存结果
pd.to_pickle(global_vocab, "vocab_{}.pkl".format(1))

三、技术亮点解析

3.1 内存优化策略

  • 使用del显式删除临时变量
  • 借助Counter进行高效词频统计
  • 分块处理大规模数据集

3.2 性能提升方案

  • 并行化处理:可通过multiprocessing.Pool实现多进程处理
from multiprocessing import Pooldef parallel_process(lines, len_size):with Pool() as pool:results = pool.starmap(process_line, [(line, len_size) for line in lines])return sum(results, Counter())
  • NumPy向量化操作:利用数组运算替代循环

四、应用场景拓展

4.1 文本分析

  • 关键词提取
  • 语言模型训练
  • 文本相似度计算

4.2 Web服务集成

结合Flask框架构建API服务:

from flask import Flask, request
import pandas as pdapp = Flask(__name__)
vocab = pd.read_pickle("vocab_1.pkl")@app.route('/analyze', methods=['POST'])
def analyze():text = request.json['text']result = {word: vocab[word] for word in text.split()}return jsonify(result)

五、完整项目结构建议

vocab-analyzer/
├── data/
│   ├── pretrain_hq.pkl
│   └── vocab_1.pkl
├── src/
│   ├── __init__.py
│   ├── processor.py    # 核心处理逻辑
│   └── server.py       # Flask服务
├── requirements.txt
└── README.md

六、部署与维护

6.1 依赖管理

numpy>=1.21
pandas>=1.3
tqdm>=4.62

6.2 性能监控

  • 使用memory_profiler进行内存分析
  • 添加日志记录关键步骤耗时

七、总结与展望

本文展示了一个高效的n-gram词频统计工具实现方案,通过合理利用Python标准库和NumPy向量化运算,实现了:

  • 支持多维度的n-gram分析
  • 内存友好的数据处理
  • 可扩展的架构设计

未来可扩展方向:

  • 支持正则表达式预处理
  • 添加分布式处理支持(Dask/Spark)
  • 构建可视化分析界面
http://www.xdnf.cn/news/13301.html

相关文章:

  • 力扣 1456. 定长子串中元音的最大数目 的多解
  • 图数据在人工智能中的应用场景
  • 苍穹外卖-day03
  • 国防科技大学计算机基础课程笔记02信息编码
  • 基于梯度的中毒攻击
  • vue3+vite项目中使用.env文件环境变量方法
  • React Native 是什么?为什么学它?
  • 非功能需求
  • Axure设计案例之词云图设计
  • bed文件排序
  • 比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
  • 解决ubuntu20.04无法唤醒的问题的一种方法
  • 【Java基础】​​向上转型(Upcasting)和向下转型(Downcasting)
  • Rust 学习笔记:关于共享状态并发的练习题
  • 多模态大语言模型arxiv论文略读(112)
  • 13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
  • 在软件开发中正确使用MySQL日期时间类型的深度解析
  • 什么是知识产权管理系统?知识产权管理系统有哪些功能?
  • 公司内网OA办公系统(本地服务器没有公网IP)如何实现异地外网访问?
  • MySQL数据库基础(三)———数据行操作
  • 本地项目push到git
  • 深度学习在微纳光子学中的应用
  • 6个月Python学习计划 Day 18 - 项目实战 · 学生成绩管理系统(OOP版)
  • Linux——I/O复用函数
  • 245. 2019年蓝桥杯国赛 - 数正方形(困难)- 递推
  • RocketMQ基础命令
  • 【Linux】使用1Panel 面板让服务器定时自动执行任务
  • 小木的算法日记-二叉堆
  • 代码随想录算法训练营第60期第六十二天打卡
  • 全面掌握Pandas时间序列处理:从基础到实战