使用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
相关产品推荐
相关产品推荐

