循环神经网络(与大多数机器学习模型一样)需要数值输入。原始文本由字符、单词和标点符号组成,与这些网络所需的结构化张量相去甚远。因此,处理文本的一个重要部分是将其转换为合适的数值格式。此处概述了为LSTM和GRU等序列模型准备文本数据常用的流程。总目标是将符号序列(单词、字符)转换为数值序列,通常表示为多维数组或张量。可以将其视为将人类语言翻译成机器可读的格式,同时保持原始文本的序列特性。此过程通常包含几个阶段:"1. 清洗(可选但建议): 文本常包含噪声,例如HTML标签、特殊字符或无关标点。初步的清洗步骤可以删除或标准化这些元素,简化后续处理。" 2. 分词: 这是将原始文本分解成称为“词元”的更小单元的过程。这些词元通常是单词,但它们也可以是子词或单个字符,具体取决于任务和所需的粒度。例如,句子“RNNs process sequences.”可能会被分词为 ["RNNs", "process", "sequences", "."]。 3. 构建词表: 分词后,我们创建一个词表,它是训练数据中所有词元的唯一集合。每个唯一词元都被分配一个特定的整数索引。这会创建一个映射,例如 {"RNNs": 1, "process": 2, "sequences": 3, ".": 4, ...}。通常会添加特殊词元,例如用于未知词的 <UNK> 或用于填充的 <PAD>。 4. 整数编码: 使用词表映射,每个词元序列都被转换为相应的整数序列。我们的示例句子变为 [1, 2, 3, 4]。这是从文本中获得的基本数值表示。 5. 处理变长序列(填充/截断): 循环神经网络通常以批次形式训练以提高效率。然而,一个批次中的序列通常需要具有相同的长度。由于实际文本的长度各异,我们应用填充(添加特殊 <PAD> 词元,通常用0表示)或截断(删除词元)来标准化批次内所有整数序列的长度。掩码是一种与填充结合使用的技术,用于向模型指示序列的哪些部分是实际数据,哪些只是填充,从而确保填充不会不适当地影响模型的学习过程。这些步骤的输出通常是整数序列的批次,准备好进入下一阶段。虽然这些整数序列有时可以直接输入到循环神经网络中,但更常见的是,尤其是在自然语言处理(NLP)中,首先将它们通过嵌入层。该层通常作为主模型的一部分进行训练,将每个整数索引转换为一个密集的低维向量(即一个嵌入)。这些向量能够捕捉词元之间的语义相似性(例如,'king' 和 'queen' 可能具有相似的向量),并提供比原始整数或稀疏独热编码更丰富、更有效的表示。本章后面我们将更详细地讨论嵌入层。下图展示了这种通用的文本预处理流程:digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; raw_text [label="原始文本\n(例如, 'RNNs process sequences.')", fillcolor="#ffc9c9"]; tokenizer [label="分词", shape=ellipse, fillcolor="#a5d8ff"]; tokens [label="词元\n(['RNNs', 'process', 'sequences', '.'])"]; vocab [label="词表构建\n& 整数编码", shape=ellipse, fillcolor="#a5d8ff"]; int_seq [label="整数序列\n([1, 2, 3, 4])"]; padding [label="填充 / 截断\n& 掩码", shape=ellipse, fillcolor="#a5d8ff"]; tensor [label="填充后的整数张量\n(例如, [1, 2, 3, 4, 0, 0])\n形状: (批次, 时间步)", fillcolor="#b2f2bb"]; embedding [label="嵌入层\n(可选, 章内细述)", shape=ellipse, fillcolor="#bac8ff", style="filled,dashed"]; model_input [label="模型输入张量\n(密集向量)\n形状: (批次, 时间步, 特征)", fillcolor="#b2f2bb", style="filled,dashed"]; raw_text -> tokenizer; tokenizer -> tokens; tokens -> vocab; vocab -> int_seq; int_seq -> padding; padding -> tensor; tensor -> embedding [style=dashed]; embedding -> model_input [style=dashed]; }一个将原始文本转换为适合循环神经网络输入的数值张量的典型流程。图中虚线所示的嵌入层步骤,通常作为模型本身的一部分而非独立的预处理阶段。本章后续部分将详细阐述每个重要的步骤,提供使用常用库实现它们的实践指导和代码示例。掌握这些技术对于将循环神经网络有效地应用于任何基于文本的任务来说是不可或缺的。