You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何构建并处理3000万及以上元素的列表,实现大规模文本词频统计?

核心问题原因

现有代码的内存瓶颈来自于全量存储所有符合条件的名词到列表中,千万级词量对应的字符串数组会占用数GB到数十GB内存,直接触发系统OOM机制杀掉进程,而统计词频仅需要存储去重后的词和对应计数,不需要留存所有原始词,优化空间极大。

可落地的优化方案

1. 最低成本的代码优化(适配1亿以内词量,无额外依赖)

直接删除冗余的全量名词列表,边遍历边更新计数器,内存占用可降低90%以上,优化后代码如下:

from collections import Counter

noun_freq = Counter()
# 不需要单独维护length变量,统计总词数直接调用 sum(noun_freq.values()) 即可
for sentence in sentences:
    for token in sentence:
        if token.pos_ == "NOUN" and not token.is_stop and not token.is_punct and not token.is_digit and not token.like_num and len(token) >= 4:
            noun_freq[token.text] += 1

common_nouns = noun_freq.most_common()

2. 外存分块处理(适配10亿以内词量,单机器即可运行)

如果语料规模极大、去重后的名词量超过千万,内存仍无法容纳全量Counter,可以做分块落地:

  • 按句块/文件块切割语料,每处理完100万句就将当前内存中的Counter序列化到本地磁盘,随后重置内存计数器
  • 所有块处理完成后,遍历读取所有本地存储的小Counter,累加得到全量频次统计
  • 允许少量误差的场景下,可以替换Counter为Count-Min Sketch等有损计数算法,内存占用可再降1-2个数量级

3. SpaCy pipeline 裁剪优化

默认加载的SpaCy模型包含很多你用不到的组件,白白占用内存和算力,加载模型时关闭冗余组件即可:

import spacy
# 仅保留词性标注所需组件,关闭 parser、ner、lemmatizer等不需要的功能
nlp = spacy.load("en_core_web_md", disable=["parser", "ner", "lemmatizer"])

同时注意不要将全量语料一次性读入内存,采用逐行/逐块读取、处理完即释放的流式处理逻辑。

4. 分布式处理(适配超大规模语料,10亿词量以上)

如果语料规模超过单机能承载的上限,使用PySpark等分布式计算框架实现:

  • 先将语料分片分发到多个工作节点
  • 每个节点单独运行SpaCy过滤逻辑提取符合要求的名词
  • 通过reduceByKey算子做分布式频次统计,最后排序得到高频词列表

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:27:03