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

使用Gensim Summarizer出现MemoryError,求可行解决方案?

解决Gensim Summarizer处理大文本时的MemoryError问题

我明白你在使用Gensim的summarize函数处理36万字符的文本时,卡在了内存不足的问题上——这个错误出现在构建PageRank邻接矩阵的阶段。旧版Gensim的摘要模块在处理大量句子时,会为所有句子对计算相似度并生成全连接图,这会占用极大的内存资源,尤其是当文本拆分出的句子数量较多时,很容易触发MemoryError。

下面是几个可行的解决方案,你可以根据自己的环境和需求尝试:

1. 拆分文本为更小的块分批处理

与其一次性加载并处理整个大文本,不如把它拆分成多个较小的文本块,分别生成每个块的摘要,最后再合并这些摘要内容。这样能大幅降低单次处理的内存占用,是最容易落地的方案。

示例代码:

from gensim.summarization.summarizer import summarize

def split_text(text, chunk_size=50000):
    # 按字符数拆分文本,也可以根据段落换行符来拆分
    chunks = []
    for i in range(0, len(text), chunk_size):
        chunks.append(text[i:i+chunk_size])
    return chunks

# 读取文本
with open("xxxxx.txt", 'r') as file_read:
    content = file_read.read()

# 拆分文本块并逐个生成摘要
text_chunks = split_text(content)
final_summary = ""

for idx, chunk in enumerate(text_chunks):
    try:
        chunk_summary = summarize(chunk, ratio=0.02)
        final_summary += f"--- 块{idx+1}摘要 ---\n{chunk_summary}\n\n"
    except Exception as e:
        print(f"处理第{idx+1}块时出错: {e}")
        continue

print(final_summary)

2. 预先过滤句子,减少计算量

在生成摘要前,先过滤掉过短的句子(比如少于5个词的句子)、重复句或无意义的句子,减少需要参与PageRank计算的句子总数,从而降低内存消耗。

示例代码:

from gensim.summarization.summarizer import summarize
from gensim.summarization.textcleaner import split_sentences

# 读取文本
with open("xxxxx.txt", 'r') as file_read:
    content = file_read.read()

# 拆分句子并过滤
sentences = split_sentences(content)
# 保留至少包含5个词的句子,可根据需求调整阈值
filtered_sentences = [sent for sent in sentences if len(sent.split()) >= 5]
filtered_content = " ".join(filtered_sentences)

# 生成摘要
summary_r = summarize(filtered_content, ratio=0.02)
print(summary_r)

3. 升级Gensim版本(环境允许的话)

你当前使用的是Python3.6对应的旧版Gensim,后续版本的Gensim对摘要模块的内存使用做了不少优化。如果你的环境允许,可以尝试升级到Python3.6支持的最高Gensim版本(比如4.2.0):

pip install --upgrade gensim==4.2.0

4. 改用更内存高效的摘要实现

如果上述方法都不奏效,可以考虑换用基于Transformer的轻量级摘要模型,这类模型对长文本的处理更高效,内存占用也更可控:

from transformers import pipeline

# 加载轻量级摘要模型
summarizer = pipeline("summarization", model="distilbart-cnn-12-6")

# 读取文本
with open("xxxxx.txt", 'r') as file_read:
    content = file_read.read()

# 分块处理长文本,适配模型输入长度限制
max_chunk_length = 1024
text_chunks = [content[i:i+max_chunk_length] for i in range(0, len(content), max_chunk_length)]

final_summary = []
for chunk in text_chunks:
    result = summarizer(chunk, max_length=100, min_length=30, do_sample=False)
    final_summary.append(result[0]['summary_text'])

print("\n".join(final_summary))

这些方法应该能帮你解决内存不足的问题,建议先从拆分文本块的方法开始尝试,成本最低且见效快。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:39:02