使用Gensim在自有语料实现词嵌入时内存不足如何解决
内存不足原因
你当前代码的核心问题是对每条文本的所有词向量做拼接,向量维度会随句子长度线性增长。比如长度为200的句子拼接后是200*100=20000维,万级样本量就会轻松占满12GB内存。
可行解决方案
1. 改用固定维度的句向量聚合(优先级最高)
放弃拼接操作,对单条文本内的所有词向量做平均/最大池化,得到固定100维的句向量,内存占用可降低90%以上,同时完全满足绝大多数下游文本分类、聚类任务的需求。
示例代码:
import numpy as np train_documents = [] for document in X_train_list: # 过滤词表外的词,增加容错性 word_vecs = [model.wv[word] for word in document if word in model.wv] if word_vecs: # 平均池化得到固定维度句向量 doc_vec = np.mean(word_vecs, axis=0) else: # 空文本返回零向量 doc_vec = np.zeros(model.vector_size) train_documents.append(doc_vec) # 最终数组shape为(样本数, 100),内存占用极低 train_documents = np.array(train_documents)
2. 固定序列长度做截断补全
如果你的下游任务是序列标注等需要保留词级信息的场景,可统一设定最大序列长度(比如取所有文本长度的95分位数作为max_len),长文本截断,短文本补零,保证所有样本维度一致,避免超长文本拉高整体内存占用。
3. 优化Word2Vec训练参数
- 调高
min_count阈值:你当前设置min_count=1会保留所有只出现1次的生僻词,词表冗余度极高,改为min_count=3或min_count=5可直接砍掉大半无用词向量,同时不影响模型效果。 - 降低向量维度:如果任务精度要求允许,可将
size参数从100调整为50或30,向量体积直接减半。
4. 分批处理落地存储
如果你确实需要保留所有词的拼接向量,不要将全量结果都存在内存的列表中,每处理1000~5000条样本就将结果写入磁盘的npy文件,清空内存缓存后再处理下一批,避免内存堆积。
内容的提问来源于stack exchange,提问作者Sai_Varma
相关产品推荐
相关产品推荐

