Python中如何为RNN存储变长Word2vec文本嵌入?
Word2vec文本嵌入存储方案参考
把嵌入向量转成字符串存CSV的方案只适合临时做小样本调试,完全不适合正式训练流程:后续读取要反复做字符串拆分、浮点类型转换,不仅读写速度慢,还容易碰到分隔符冲突、浮点精度丢失的问题,样本量上十万、嵌入维度到100以上的时候,额外的解析开销会非常明显。
下面是几个适配PyTorch RNN训练流程、落地成本极低的方案,按推荐优先级排序:
1. 直接存PyTorch/Numpy二进制格式(最推荐)
你用RNN做分类本来就要把不等长文本做截断/补零,统一成固定长度序列才能组成batch训练,完全没必要存不等长的原始嵌入结果,直接存处理好的张量是最省事的:
- 先把所有文本按你设定的最大序列长度处理,得到shape为
(样本总数, 最大序列长度, 词嵌入维度)的嵌入数组,标签单独存成和样本顺序一一对应的一维数组 - 用
torch.save()存成.pt格式,或者转成numpy数组用np.save()存成.npy格式就行 - 读取的时候不需要做任何格式转换,直接加载出来就能送进DataLoader喂给RNN,没有精度损失,文件体积比CSV小60%以上,读写速度快一个数量级。
核心操作参考:
import torch import numpy as np from gensim.models import Word2Vec # 配置参数按你的实际需求改 MAX_SEQ_LEN = 128 EMBED_DIM = w2v_model.vector_size all_embeds = [] for tokens in tokenized_corpus: seq_embed = [] for idx in range(MAX_SEQ_LEN): # 序列长度不够补零向量,超长直接截断 if idx < len(tokens) and tokens[idx] in w2v_model.wv: seq_embed.append(w2v_model.wv[tokens[idx]]) else: seq_embed.append(np.zeros(EMBED_DIM)) all_embeds.append(np.array(seq_embed)) # 转成统一格式的数组 all_embeds = np.array(all_embeds, dtype=np.float32) all_labels = np.array(labels, dtype=np.int64) # 存储,两种格式选一个就行 np.save("train_embeds.npy", all_embeds) np.save("train_labels.npy", all_labels) # PyTorch格式可以把嵌入和标签打包存在一个文件里 torch.save( {"embeds": torch.from_numpy(all_embeds), "labels": torch.from_numpy(all_labels)}, "train_dataset.pt" )
2. 需要联动表格数据就用Parquet格式存
如果你后续需要结合其他文本元数据做筛选、用pandas做数据处理,不要用CSV,直接存Parquet格式:
- 不需要手动把向量转成字符串,直接把每个样本的嵌入数组放到pandas的列里,调用
to_parquet()存储时会自动处理数组类型 - 读取的时候用
pd.read_parquet()加载,嵌入列会直接还原成数组格式,没有CSV的分隔符转义、类型转换问题,压缩率和读写速度都远好于CSV。
3. 小数据集要存不等长嵌入选JSON Lines
如果你不想提前做固定长度padding,想在训练阶段动态做可变长度序列处理,数据集规模又不大(十万样本以内),可以选JSON Lines格式:
- 每一行对应一个样本,存储结构为
{"label": 类别标签, "embed": [词向量1, 词向量2, ...], "seq_len": 原序列长度} - 逐行读取解析即可,比CSV存字符串的容错率高很多,不会因为特殊字符导致解析失败。
避坑提醒:不要为了图方便硬把高维向量塞成字符串存CSV,等你训练的时候要花几倍的时间做数据清洗和格式转换,反而拖慢进度。
内容的提问来源于stack exchange,提问作者Adrian Evensen
相关产品推荐
相关产品推荐

