趋近智
包括RNN在内的机器学习模型需要处理数值数据,而非字符串。为了将文本转换为这些模型可用的格式,首先需要将文本分解为分词并建立一个一致的词汇表。整数编码是将分词序列转换为数字序列的过程,它通过用词汇表中对应的唯一整数ID替换序列中的每个分词来实现。
您可以将上一步中建立的词汇表视为查找表或字典。每个独特的分词(单词、子词或字符)都是一个键,其分配的整数是对应的值。
例如,假设我们处理了句子“the quick brown fox”并构建了以下简单词汇表:
vocabulary = {'<UNK>': 0, '<PAD>': 1, 'the': 2, 'quick': 3, 'brown': 4, 'fox': 5, 'jumps': 6}
这里,<UNK>代表未知分词(在词汇表创建过程中未出现的分词),而<PAD>代表填充分词,我们稍后将讨论它们如何处理可变序列长度。
分词后的序列是:
['the', 'quick', 'brown', 'fox']
为了执行整数编码,我们遍历这个分词序列,并将每个分词替换为它在vocabulary中的整数ID:
2345得到的整数编码序列是:
[2, 3, 4, 5]
这个数字序列保留了分词的原始顺序,这对于序列模型来说是根本。
使用词汇表将分词映射到整数ID。
这种转换系统地应用于数据集中的每个序列,确保所有文本输入都被转换为模型可以处理的数值格式。
在Python中,这种映射通常通过字典查找来完成。给定一个分词序列列表和一个词汇表字典,您可以像这样进行转换:
# 示例词汇表(已构建)
vocabulary = {'<UNK>': 0, '<PAD>': 1, 'the': 2, 'quick': 3, 'brown': 4, 'fox': 5, 'jumps': 6, 'over': 7, 'lazy': 8, 'dog': 9}
# 示例分词句子
token_sequences = [
['the', 'quick', 'brown', 'fox'],
['the', 'lazy', 'dog'],
['fox', 'jumps', 'over', 'dog']
]
# 执行整数编码
encoded_sequences = []
for seq in token_sequences:
encoded_seq = [vocabulary.get(token, vocabulary['<UNK>']) for token in seq]
encoded_sequences.append(encoded_seq)
# 打印结果
# encoded_sequences 将会是:
# [[2, 3, 4, 5], [2, 8, 9], [5, 6, 7, 9]]
print(encoded_sequences)
请注意vocabulary.get(token, vocabulary['<UNK>'])的用法。这是一种常见模式:它会尝试在词汇表中查找分词。如果分词存在,则返回其ID。如果未找到分词(即“词汇表外”或OOV分词),它会默认返回分配给特殊<UNK>分词的ID(在此示例中为0)。这确保了在测试或部署过程中遇到新词时,您的过程不会崩溃,尽管模型处理许多未知词的能力取决于其训练情况。
这一步非常重要,因为数学模型不能直接处理字符串。通过将分词转换为整数,我们创建了可输入到神经网络后续层的数值表示。
需要理解的是,这些整数ID(2、3、4、5等)是任意的标识符。模型最初并不知道整数3('quick')在语义上比9('dog')更接近5('fox')。ID本身的数值不带有词语之间的关系含义。这个局限性将在流水线的下一步得到处理:嵌入层。
这些整数序列构成了通常会传递给嵌入层的输入,我们将在接下来介绍嵌入层。嵌入层将在模型训练期间为每个整数ID学习密集向量表示,捕获分词之间的语义关系。
这部分内容有帮助吗?
TextVectorization 等层将原始文本转换为数值序列作为模型输入。© 2026 ApX Machine Learning用心打造