文本预处理必须先分词和标准化,TensorFlow需用TextVectorization统一处理;中文须用jieba等预分词再空格连接;Embedding层只接受整数序列,input_dim应≥max_tokens且预留padding ID=0。

文本预处理必须先做分词和标准化
TensorFlow 本身不直接提供分词器,直接喂原始字符串给 tf.keras.layers.TextVectorization 会出错或产生意外 token。常见错误是模型输入维度全为 0,或者训练时提示 ValueError: Input to embedding layer should be integers —— 这说明输入没被正确转成整数序列。
推荐做法是用 TextVectorization 层统一处理:它能自动做小写、去标点(可选)、切分(按空格或字符)、构建词表、映射为整数 ID。关键参数有:max_tokens(限制词表大小,避免 OOM)、output_sequence_length(统一长度,避免 batch 内 shape 不一致)。
- 若文本含中文,需提前用
jieba或pkuseg分词,再把结果拼成空格分隔字符串传入TextVectorization -
adapt()必须在 fit 前调用,且传入的是原始文本 list,不是 tensor;否则词表为空,所有词都映射到UNK(ID=1) - 不要在
TextVectorization后接tf.strings.lower等操作——它内部已处理,重复做会导致编码错乱
Embedding 层输入必须是整数序列,不是字符串
这是最常踩的坑:把未向量化文本直接送进 tf.keras.layers.Embedding,会报 TypeError: Expected int but got string。Embedding 层只接受 shape=(batch, seq_len) 的整数张量,每个值代表词汇表中的索引。
正确链路是:TextVectorization → 整数序列 → Embedding。注意:Embedding 的 input_dim 必须 ≥ TextVectorization.max_tokens,且通常设为 max_tokens + 1(预留 padding ID=0)。
立即学习“Python免费学习笔记(深入)”;
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- padding 默认用 ID=0,所以
Embedding第一行(index=0)应为零向量,或设mask_zero=True让后续层自动忽略 - 若用预训练词向量(如 GloVe),需用
weights参数初始化,并确保词表顺序与向量文件严格对齐——TextVectorization.get_vocabulary()返回的 list 就是索引顺序 - 序列太长时,
Embedding显存暴涨;建议配合tf.keras.layers.GlobalAveragePooling1D或LSTM降维,别硬堆Dense
处理变长文本时,batch 内必须统一长度
TensorFlow 要求同 batch 中所有样本 tensor shape 一致。原始文本长度差异大,直接 pad 到最大长度会浪费显存、拖慢训练。常见症状是 GPU memory usage 突增,或 ResourceExhaustedError。
解决方式不是全局固定长度,而是用 TextVectorization 的 output_sequence_length 控制输出长度,或用 tf.data.Dataset.padded_batch() 动态 pad:
-
TextVectorization(output_sequence_length=128):强制截断/补零到 128,适合大多数短文本场景 -
dataset.padded_batch(batch_size, padded_shapes=([None], [])):让每个 batch 自适应最长样本,但需配合tf.keras.preprocessing.sequence.pad_sequences在 map 中预处理 - 避免在
map()里调用np.pad—— 它返回 numpy array,会触发 eager mode 下的隐式转换,性能差;优先用tf.pad
中文文本要绕过默认英文分词逻辑
TextVectorization 默认按空格和标点切分,对中文完全失效——整句变一个 token,词表迅速爆炸。错误现象是:vocabulary size 比预料大 10 倍,训练 loss 不下降,attention 权重全集中在句首。
必须手动介入分词。最轻量方案是用 jieba.lcut() 预处理原始文本,再用空格连接:
import jieba
def chinese_preprocess(text):
return ' '.join(jieba.lcut(text))
<h1>然后传给 TextVectorization.adapt()</h1><p>vectorizer.adapt([chinese_preprocess(t) for t in raw_texts])- 别在
TextVectorization的standardize参数里调用jieba——它运行在 graph mode,不支持动态分词 - 如果用
tf.datapipeline,把分词写在map()里,但注意jieba不是 tf ops,需用tf.py_function包裹,且设置stateful=False - 繁体字、专有名词(如“Transformer”)需提前加进
jieba词典,否则会被拆散
实际部署时,TextVectorization 层必须保存进 SavedModel(用 model.save()),不能只存权重——它的 vocabulary 和 lookup table 是计算图一部分,漏掉就无法推理。

















