第29课:TensorFlow|自然语言处理基础【词向量、文本分词、TF文本数据预处理】 📅 发布时间:2026/9/5 23:45:13 👁 浏览次数: 文章目录1. 课前导读1.1 本节课学习目标1.2 知识重难点1.3 学习前置条件1.4 学完可掌握能力1.5 行业应用场景2. 核心理论精讲2.1 文本预处理流程2.2 分词方法2.3 词典构建与OOV处理2.4 词向量从独热到稠密2.5 预训练词向量2.6 TensorFlow文本预处理API3. 环境搭建与工具配置4. 代码实战教学4.1 Tokenizer 基本使用4.2 Embedding 层演示4.3 使用TextVectorization层推荐4.4 使用预训练词向量GloVe示例5. 案例实操演练5.1 案例一IMDb情感分类Tokenizer Embedding5.2 案例二使用TextVectorization构建端到端模型5.3 案例三加载预训练词向量GloVe进行迁移学习6. 常见坑点与排错总结6.1 Tokenizer 坑点6.2 Embedding 层坑点6.3 TextVectorization 坑点6.4 内存与性能7. 知识点总结 课后作业7.1 核心知识点梳理7.2 基础作业7.3 进阶实操作业7.4 思考拓展题《TensorFlow2.x: 深度学习入门到高阶实战教程》系列课程导航1. 课前导读1.1 本节课学习目标理解自然语言处理的基本流程文本清洗、分词、构建词典、序列化、向量化。掌握Tokenizer的使用方法拟合文本数据、生成词索引、将文本转换为整数序列。理解词向量的概念及其相对于独热编码的优势稠密表示、语义相似性。学会使用Embedding层将整数序列映射为词向量并参与端到端训练。了解预训练词向量的概念GloVe、FastText及其加载方法。掌握pad_sequences处理变长序列以及TextVectorization层Keras新API的使用。1.2 知识重难点类别内容重点Tokenizer的拟合与转换Embedding层的参数含义与使用文本序列的填充与截断难点词向量的语义捕获原理分布假说子词分词BPE、WordPiece的优势预训练词向量的加载与微调策略易混淆点Tokenizer的word_index与index_wordEmbedding层输入维度vocab_size 1的原因TextVectorization与Tokenizer的异同1.3 学习前置条件已掌握Python基础及NumPy操作第2课。了解基本的神经网络分类模型第12课。能够使用Keras搭建简单的序列模型第26课。1.4 学完可掌握能力对原始文本数据进行清洗、分词、序列化构建机器学习可用的输入。使用Embedding层从头训练词向量进行文本分类。加载预训练词向量提升小数据集上的性能。使用Keras新APITextVectorization快速构建文本预处理流水线。1.5 行业应用场景情感分析分析社交媒体、商品评论的情感倾向。文本分类新闻分类、垃圾邮件识别。机器翻译预处理源语言和目标语言文本。搜索引擎对查询和文档进行分词及向量化。聊天机器人将用户输入转化为词索引序列。2. 核心理论精讲2.1 文本预处理流程原始文本数据通常包含标点符号、数字、特殊字符、大小写等噪声预处理目标是将文本转化为适合模型输入的数值序列。标准流程清洗去除HTML标签、特殊符号、统一小写、处理数字删除或替换为特定符号。分词Tokenization将句子切分为单词或子词单元。构建词典统计所有单词为每个单词分配唯一整数ID通常从1开始0留作填充或未知词。序列化将每个句子中的单词替换为对应的ID得到整数序列。填充/截断将所有序列统一到相同长度通常取最大长度或分位数。向量化将整数序列通过Embedding层映射为稠密向量或使用独热编码不推荐。2.2 分词方法单词级分词按空格和标点切分简单但会产生巨大词典OOV问题。使用Tokenizer时默认按空格和标点分割。子词分词Subword Tokenization将罕见词分解为常见子词单元解决OOV并缩小词典。典型算法BPEByte Pair Encoding迭代合并最频繁的字符对GPT系列使用。WordPiece类似BPE但基于概率选择合并BERT使用。SentencePiece支持无空格语言中日韩。TensorFlow的TextVectorization适配器可配合tf_text库使用更高级分词。2.3 词典构建与OOV处理从训练语料中统计词频保留高频词例如top 10k低频词或未登录词映射为OOVout-of-vocabulary标记。在Tokenizer中通过参数oov_token设置。2.4 词向量从独热到稠密独热编码每个词用一个长度为词典大小的向量表示仅一位为1其余为0。缺点维度灾难、无法表达语义相似性“猫”和“猫科”正交。词嵌入Word Embedding将每个词映射为低维稠密向量如50、300维通过训练或预训练使语义相近的词在向量空间中距离较近。例如“国王” - “男人” “女人” ≈ “女王”。Embedding层本质是一个可训练的查找表输入整数索引输出对应的向量。训练过程中词向量会针对任务优化学习特定领域的语义。2.5 预训练词向量在大型语料如维基百科、新闻上预训练的词向量GloVe、Word2Vec、FastText可迁移到下游任务尤其适合小数据集。GloVe基于全局词共现矩阵训练词向量。Word2Vec基于局部上下文窗口有CBOW和Skip-gram两种模式。FastText考虑子词信息能处理OOV。加载方式下载预训练向量文件通常是文本格式每行“词 向量值”构建词到向量的字典然后初始化Embedding层的权重。2.6 TensorFlow文本预处理API旧APItf.keras.preprocessing.text.Tokenizer功能完整但需手动处理填充和序列化。新APItf.keras.layers.TextVectorization集成在Keras层中可嵌入模型端到端支持标准化、分词、索引化、填充等。适合生产环境。本课将重点介绍Tokenizer便于理解底层原理和TextVectorization推荐实践。3. 环境搭建与工具配置沿用第28课环境无需额外安装。conda activate tf213 python导入模块importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltfromtensorflow.keras.preprocessing.textimportTokenizerfromtensorflow.keras.preprocessing.sequenceimportpad_sequencesfromtensorflow.kerasimportlayers,models,datasetsimportjson4. 代码实战教学4.1 Tokenizer 基本使用# 示例语料sentences[I love machine learning,Deep learning is amazing,I love TensorFlow,Machine learning loves data]# 创建Tokenizer设置词汇表大小保留高频词并指定OOV标记tokenizerTokenizer(num_words10,oov_tokenOOV)tokenizer.fit_on_texts(sentences)# 查看词索引word_indextokenizer.word_indexprint(Word index:,word_index)print(Index word:,tokenizer.index_word)# 将文本转换为整数序列sequencestokenizer.texts_to_sequences(sentences)print(Sequences:,sequences)# 填充到相同长度paddedpad_sequences(sequences,paddingpost,maxlen5)print(Padded sequences:\n,padded)4.2 Embedding 层演示# 构建一个简单的词嵌入分类模型示例vocab_sizelen(word_index)1# 1 因为索引从1开始0保留给填充embedding_dim16modelmodels.Sequential([layers.Embedding(input_dimvocab_size,output_dimembedding_dim,input_length5),layers.Flatten(),layers.Dense(1,activationsigmoid)])model.summary()# 随机标签演示ynp.array([1,0,1,0])model.compile(optimizeradam,lossbinary_crossentropy)model.fit(padded,y,epochs5,verbose0)4.3 使用TextVectorization层推荐# 定义标准化和分词函数defcustom_standardization(input_data):lowercasetf.strings.lower(input_data)returntf.strings.regex_replace(lowercase,[^\w\s],)# 去除标点# 创建TextVectorization层max_features1000sequence_length10vectorize_layerlayers.TextVectorization(max_tokensmax_features,output_modeint,output_sequence_lengthsequence_length,standardizecustom_standardization)# 适配语料vectorize_layer.adapt(sentences)print(Vocabulary:,vectorize_layer.get_vocabulary()[:10])# 直接转换文本vectorizedvectorize_layer(sentences)print(Vectorized:\n,vectorized.numpy())4.4 使用预训练词向量GloVe示例由于GloVe文件较大演示从本地加载的代码框架。# 假设已下载glove.6B.50d.txt50维词向量defload_glove_embeddings(filepath,word_index,embedding_dim50):embeddings_index{}withopen(filepath,r,encodingutf-8)asf:forlineinf:valuesline.split()wordvalues[0]coefsnp.asarray(values[1:],dtypefloat32)embeddings_index[word]coefs# 构建嵌入矩阵vocab_sizelen(word_index)1embedding_matrixnp.zeros((vocab_size,embedding_dim))forword,iinword_index.items():embedding_vectorembeddings_index.get(word)ifembedding_vectorisnotNone:embedding_matrix[i]embedding_vectorelse:# 随机初始化未知词embedding_matrix[i]np.random.normal(scale0.01,size(embedding_dim,))returnembedding_matrix# 使用在Embedding层设置weights参数embedding_matrixload_glove_embeddings(glove.6B.50d.txt,word_index,50)embedding_layerlayers.Embedding(input_dimvocab_size,output_dim50,weights[embedding_matrix],trainableFalse# 可选是否微调)5. 案例实操演练5.1 案例一IMDb情感分类Tokenizer Embedding使用IMDb数据集从文本到模型的全流程。# 加载IMDb原始文本已预处理的词序列版本也可以但这里演示原始文本# 实际中可以用imdb.load_data()但为了演示Tokenizer我们加载原始文本需要额外代码。# 使用tf.keras.datasets.imdb的原始文本版本需要download# 简便起见我们使用已经预处理的整数序列版本但用Tokenizer重新拟合。# 为了展示完整流程生成模拟文本数据importrandom pos_reviews[great movie,fantastic film,awesome acting,loved it]*250neg_reviews[terrible movie,boring film,bad acting,hated it]*250textspos_reviewsneg_reviews labels[1]*1000[0]*1000# 打乱combinedlist(zip(texts,labels))random.shuffle(combined)texts,labelszip(*combined)# 划分训练集/测试集splitint(0.8*len(texts))train_texts,test_textstexts[:split],texts[split:]train_labels,test_labelslabels[:split],labels[split:]# TokenizertokenizerTokenizer(num_words5000,oov_tokenOOV)tokenizer.fit_on_texts(train_texts)train_seqtokenizer.texts_to_sequences(train_texts)test_seqtokenizer.texts_to_sequences(test_texts)# 填充maxlen20train_padpad_sequences(train_seq,maxlenmaxlen,paddingpost)test_padpad_sequences(test_seq,maxlenmaxlen,paddingpost)# 模型vocab_sizemin(5000,len(tokenizer.word_index))1modelmodels.Sequential([layers.Embedding(vocab_size,32,input_lengthmaxlen),layers.GlobalAveragePooling1D(),layers.Dense(16,activationrelu),layers.Dense(1,activationsigmoid)])model.compile(optimizeradam,lossbinary_crossentropy,metrics[accuracy])historymodel.fit(train_pad,train_labels,epochs10,batch_size32,validation_split0.2,verbose1)# 测试test_loss,test_accmodel.evaluate(test_pad,test_labels,verbose0)print(fTest accuracy:{test_acc:.4f})5.2 案例二使用TextVectorization构建端到端模型# 直接集成TextVectorization层无需手动填充importtensorflowastffromtensorflow.kerasimportlayers# 准备数据同上train_textsnp.array(train_texts)test_textsnp.array(test_texts)train_labelsnp.array(train_labels).astype(np.float32)test_labelsnp.array(test_labels).astype(np.float32)# 定义TextVectorization层max_features5000sequence_length20vectorize_layerlayers.TextVectorization(max_tokensmax_features,output_modeint,output_sequence_lengthsequence_length,standardizelower_and_strip_punctuation)vectorize_layer.adapt(train_texts)# 构建模型model_end2endmodels.Sequential([vectorize_layer,layers.Embedding(max_features1,32),layers.GlobalAveragePooling1D(),layers.Dense(16,activationrelu),layers.Dense(1,activationsigmoid)])model_end2end.compile(optimizeradam,lossbinary_crossentropy,metrics[accuracy])model_end2end.summary()# 训练注意这里直接传入原始字符串history_end2endmodel_end2end.fit(train_texts,train_labels,epochs10,batch_size32,validation_split0.2,verbose1)test_loss,test_accmodel_end2end.evaluate(test_texts,test_labels,verbose0)print(fEnd-to-end test accuracy:{test_acc:.4f})5.3 案例三加载预训练词向量GloVe进行迁移学习使用较小的文本分类数据集如新闻标题分类演示加载GloVe。# 由于文件较大此处仅提供代码框架实际需下载glove.6B.50d.txt# 假设已下载路径为 glove.6B.50d.txtembedding_dim50vocab_size10000tokenizerTokenizer(num_wordsvocab_size,oov_tokenOOV)tokenizer.fit_on_texts(train_texts)word_indextokenizer.word_index# 加载GloVeembeddings_index{}withopen(glove.6B.50d.txt,r,encodingutf-8)asf:forlineinf:valuesline.split()wordvalues[0]coefsnp.asarray(values[1:],dtypefloat32)embeddings_index[word]coefs embedding_matrixnp.zeros((vocab_size1,embedding_dim))forword,iinword_index.items():ifivocab_size:continueembembeddings_index.get(word)ifembisnotNone:embedding_matrix[i]embelse:embedding_matrix[i]np.random.normal(scale0.01,size(embedding_dim,))# 模型model_pretrainedmodels.Sequential([layers.Embedding(vocab_size1,embedding_dim,weights[embedding_matrix],trainableFalse),layers.GlobalAveragePooling1D(),layers.Dense(16,activationrelu),layers.Dense(1,activationsigmoid)])model_pretrained.compile(optimizeradam,lossbinary_crossentropy,metrics[accuracy])# 训练...6. 常见坑点与排错总结6.1 Tokenizer 坑点坑1Tokenizer的num_words参数限制词汇表大小但实际word_index仍包含所有词转换序列时使用num_words截断。注意调用texts_to_sequences时超过num_words的词会被忽略除非设置了oov_token则映射为OOV索引。建议同时设置oov_token。坑2填充时未统一maxlen导致批次内序列长度不一致无法训练。解决使用pad_sequences指定maxlen可取训练集序列长度的90%分位数。坑3pad_sequences的paddingpre默认在序列前补零可能影响RNN对序列起始的记忆。通常文本分类用post也可。6.2 Embedding 层坑点坑4Embedding层的input_dim必须大于等于最大索引值因为索引从0开始但0通常为填充实际最大索引为vocab_size所以input_dim应为vocab_size1。错误示例Embedding(vocab_size, 32)会导致索引vocab_size越界。坑5设置trainableFalse时预训练词向量不更新适合小数据集若有足够数据设置trainableTrue微调效果更好。6.3 TextVectorization 坑点坑6TextVectorization在模型保存时需包含词汇表建议在训练前adapt然后保存模型时词汇表会一同保存。若单独使用需手动set_vocabulary。坑7默认标准化会去除标点但中文等语言需自定义标准化函数。6.4 内存与性能坑8词汇表过大如50万导致Embedding层参数量巨大可减小max_features或使用哈希技巧。坑9在pad_sequences之前序列列表可能占用大量内存建议生成时即时截断。7. 知识点总结 课后作业7.1 核心知识点梳理文本预处理清洗、分词、构建词典、序列化、填充。Tokenizerfit_on_texts、texts_to_sequences、word_index。pad_sequences统一序列长度padding和truncating控制。Embedding层将整数索引映射为稠密向量训练或预训练。TextVectorization端到端文本向量化层集成标准化、分词、索引化。预训练词向量GloVe、Word2Vec等提升小数据性能。7.2 基础作业使用Tokenizer对句子[Hello world, Hello TensorFlow, World of AI]进行拟合输出词索引并将句子转换为序列后填充到长度3。构建一个Embedding层输入维度100输出维度32输入长度10计算该层参数量。使用TextVectorization层将英文句子列表转换为整数序列并打印词汇表。7.3 进阶实操作业任务使用预训练词向量进行新闻分类下载AG News数据集4分类或使用tensorflow_datasets加载。要求使用Tokenizer或TextVectorization进行预处理。加载GloVe 100维词向量初始化Embedding层可训练或冻结。构建LSTM或GRU模型进行新闻分类测试准确率。对比不使用预训练词向量的模型性能差异。7.4 思考拓展题为什么子词分词BPE能有效缓解OOV问题举例说明。在Embedding层中如果将一个词的向量初始化为零会发生什么为什么不应该这样做假设你的语料包含大量领域专有名词如医学词汇普通预训练词向量无法覆盖。你会采用哪些策略下一课预告Embedding词嵌入层原理与实战——我们将深入讲解Embedding层的数学本质、训练过程、以及如何可视化词向量空间并实现词类比和语义相似度计算。《TensorFlow2.x: 深度学习入门到高阶实战教程》系列课程导航去订阅第一部分基础入门1-10 课第二部分神经网络核心11-25 课第三部分进阶网络与框架高阶26-40 课第四部分企业实战与项目落地41-50 课 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见