Keras 3 API 文档 / 层 API / 预处理层 / 文本预处理 / TextVectorization层

TextVectorization层

[source]

TextVectorization class

keras.layers.TextVectorization(
    max_tokens=None,
    standardize="lower_and_strip_punctuation",
    split="whitespace",
    ngrams=None,
    output_mode="int",
    output_sequence_length=None,
    pad_to_max_tokens=False,
    vocabulary=None,
    idf_weights=None,
    sparse=False,
    ragged=False,
    encoding="utf-8",
    name=None,
    **kwargs
)

一个预处理层,将文本特征映射为整数序列.

该层具有在Keras模型中管理文本的基本选项.它将一批字符串(一个样本 = 一个字符串)转换为标记索引列表(一个样本 = 整数标记索引的1D张量)或密集表示(一个样本 = 表示样本标记数据的浮点值的1D张量).该层旨在处理自然语言输入.要处理简单的字符串输入(分类字符串或预分词字符串),请参见kers_core.layers.StringLookup.

层的词汇表必须在构造时提供或在通过adapt()学习.当该层被适应时,它将分析数据集,确定单个字符串值的频率,并从中创建词汇表.该词汇表可以具有无限大小或被限制,具体取决于该层的配置选项;如果输入中的唯一值多于最大词汇表大小,则将使用最频繁的术语来创建词汇表.

每个样本的处理包含以下步骤:

  1. 标准化每个样本(通常是小写 + 标点符号去除)
  2. 将每个样本拆分为子字符串(通常是单词)
  3. 将子字符串重新组合为标记(通常是n-gram)
  4. 索引标记(将唯一的整数值与每个标记关联)
  5. 使用此索引转换每个样本,要么转换为整数向量,要么转换为密集浮点向量.

关于传递可调用对象以自定义拆分和标准化的注意事项:

  1. 任何可调用对象都可以传递给该层,但如果您希望序列化此对象,则应仅传递已注册的Keras可序列化函数(有关更多详细信息,请参见keras.saving.register_keras_serializable).
  2. 当使用自定义可调用对象进行standardize时,可调用对象接收的数据将完全如传递给该层的数据.可调用对象应返回与输入形状相同的张量.
  3. 当使用自定义可调用对象进行split时,可调用对象接收的数据将挤出第1维度 - 而不是[["string to split"], ["another string to split"]],可调用对象将看到["string to split", "another string to split"].可调用对象应返回dtype为stringtf.Tensor,第1维度包含拆分标记 - 在这个例子中,我们应该看到类似[["string", "to", "split"], ["another", "string", "to", "split"]]的内容.

注意: 该层在内部使用TensorFlow.它不能用作具有除TensorFlow之外的任何后端的模型的编译计算图的一部分.然而,当 eagerly 运行时,它可以与任何后端一起使用.它也可以始终作为任何后端的输入预处理管道的一部分使用(在模型本身之外),这是我们推荐使用该层的方式.

注意: 该层在tf.data管道中使用是安全的(与您使用的后端无关).

参数: max_tokens:该层的词汇表的最大大小.这仅在适应词汇表或设置pad_to_max_tokens=True时指定.请注意,此词汇表包含1个OOV标记,因此有效标记数为(max_tokens - 1 - (1 if output_mode == "int" else 0)). standardize:应用于输入文本的标准化的可选规范.值可以是: - None:不进行标准化. - "lower_and_strip_punctuation":文本将小写并去除所有标点符号. - "lower":文本将小写. - "strip_punctuation":所有标点符号将被去除. - 可调用对象:输入将传递给可调用函数,该函数应标准化并返回. split:拆分输入文本的可选规范.值可以是: - None:不进行拆分. - "whitespace":按空格拆分. - "character":按每个unicode字符拆分. - 可调用对象:标准化输入将传递给可调用函数,该函数应拆分并返回. ngrams:从可能拆分的输入文本创建的n-gram的可选规范.值可以是None、整数或整数元组;传递整数将创建最多该整数的n-gram,传递整数元组将创建元组中指定值的n-gram.传递None意味着不会创建n-gram. output_mode:层的输出的可选规范.值可以是"int""multi_hot""count""tf_idf",配置层如下: - "int":输出整数索引,每个拆分字符串标记一个整数索引.当output_mode == "int"时,0保留用于掩码位置;这使得词汇表大小为max_tokens - 2而不是max_tokens - 1. - "multi_hot":每个批次输出一个整数数组,词汇表大小或最大标记数大小,在所有元素中包含1,其中标记映射到该索引在批次项中至少存在一次. - "count":像"multi_hot",但整数数组包含标记在该索引处出现的次数. - "tf_idf":像"multi_hot",但TF-IDF算法应用于查找每个标记槽中的值. 对于"int"输出,支持任何形状的输入和输出.对于所有其他输出模式,目前仅支持秩1输入(和拆分后的秩2输出). output_sequence_length:仅在INT模式下有效.如果设置,输出将在时间维度上填充或截断为恰好output_sequence_length值,导致张量形状为(batch_size, output_sequence_length),无论从拆分步骤中产生了多少标记.默认为None.如果raggedTrue,则output_sequence_length可能仍会截断输出. pad_to_max_tokens:仅在"multi_hot""count""tf_idf"模式下有效.如果为True,输出将在特征轴上填充到max_tokens,即使词汇表中的唯一标记数少于max_tokens,导致张量形状为(batch_size, max_tokens),无论词汇表大小如何.默认为False. vocabulary:可选.可以是字符串数组或包含词汇表术语的文本文件路径.如果传递数组,可以传递元组、列表、1D NumPy数组或包含字符串词汇表术语的1D张量.如果传递文件路径,文件应包含每行一个词汇表术语.如果设置了此参数,则无需adapt()该层. idf_weights:仅在output_mode"tf_idf"时有效.元组、列表、1D NumPy数组或与词汇表长度相同的1D张量,包含浮点逆文档频率权重,将乘以每个样本术语计数以获得最终的tf_idf权重.如果设置了vocabulary参数且output_mode"tf_idf",则必须提供此参数. ragged:布尔值.仅适用于"int"输出模式.仅支持TensorFlow后端.如果为True,返回RaggedTensor而不是密集Tensor,其中每个序列可能在字符串拆分后具有不同的长度.默认为False. sparse:布尔值.仅适用于"multi_hot""count""tf_idf"输出模式.仅支持TensorFlow后端.如果为True,返回SparseTensor而不是密集Tensor.默认为False. encoding:可选.解释输入字符串的文本编码.默认为"utf-8".

示例:

此示例实例化一个TextVectorization层,该层将文本小写,按空格拆分,去除标点符号,并输出整数词汇表索引.

max_tokens = 5000  # 最大词汇表大小.
max_len = 4  # 将输出填充到的序列长度.
# 创建层.
vectorize_layer = TextVectorization(
    max_tokens=max_tokens,
    output_mode='int',
    output_sequence_length=max_len)

# 现在词汇表层已创建,调用`adapt`在字符串列表上创建词汇表.
vectorize_layer.adapt(["foo bar", "bar baz", "baz bada boom"])

# 现在,该层可以将字符串映射为整数——您可以使用嵌入层将这些整数映射为学习嵌入.
input_data = [["foo qux bar"], ["qux baz"]]
vectorize_layer(input_data)
array([[4, 1, 3, 0],
       [1, 2, 0, 0]])

此示例通过将词汇表术语列表传递给层的__init__()方法来实例化一个TextVectorization层.

vocab_data = ["earth", "wind", "and", "fire"]
max_len = 4  # 将输出填充到的序列长度.
# 创建层,直接传递词汇表.您还可以将词汇表参数传递给包含每行一个词汇表术语的文件路径.
vectorize_layer = keras.layers.TextVectorization(
    max_tokens=max_tokens,
    output_mode='int',
    output_sequence_length=max_len,
    vocabulary=vocab_data)

# 因为我们直接传递了词汇表,所以不需要适应层——词汇表已经设置好了.词汇表包含填充标记('')和OOV标记('[UNK]')以及传递的标记.
vectorize_layer.get_vocabulary()
['', '[UNK]', 'earth', 'wind', 'and', 'fire']