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

TextVectorization 层

[源代码]

TextVectorization

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 模型中管理文本的基本选项。它将一批字符串(一个样本 = 一个字符串)转换为令牌索引列表(一个样本 = 包含整数令牌索引的一维张量)或稠密表示(一个样本 = 包含表示样本令牌数据的浮点值的一维张量)。此层用于处理自然语言输入。要处理简单的字符串输入(分类字符串或预分词字符串),请参阅 kers_core.layers.StringLookup

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

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

  1. 标准化每个样本(通常是小写 + 去除标点符号)
  2. 将每个样本分割成子字符串(通常是词)
  3. 将子字符串重组为令牌(通常是 n-gram)
  4. 索引令牌(为每个令牌关联一个唯一的整数值)
  5. 使用此索引转换每个样本,转换为整数向量或稠密浮点向量。

关于传递可调用对象来自定义此层的分割和标准化的注意事项

  1. 任何可调用对象都可以传递给此层,但如果您想序列化此对象,则应仅传递注册为 Keras 可序列化的函数(有关详细信息,请参阅 keras.saving.register_keras_serializable)。
  2. 当对 standardize 使用自定义可调用对象时,可调用对象接收的数据将与传递给此层的数据完全相同。可调用对象应返回与输入具有相同形状的张量。
  3. 当对 split 使用自定义可调用对象时,可调用对象接收的数据将移除第一个维度 - Callable 将看到 ["string to split", "another string to split"],而不是 [["string to split"], ["another string to split"]]。可调用对象应返回一个 dtype 为 stringtf.Tensor,其中第一个维度包含分割后的令牌 - 在此示例中,我们应该看到类似 [["string", "to", "split"], ["another", "string", "to", "split"]] 的内容。

注意:此层内部使用 TensorFlow。它不能与 TensorFlow 之外的任何后端一起用作模型编译计算图的一部分。但是,在急切模式下运行时,它可以与任何后端一起使用。它还可以始终与任何后端一起用作输入预处理流水线的一部分(在模型本身之外),我们建议以这种方式使用此层。

注意:此层可在 tf.data 流水线中安全使用(无论您使用哪个后端)。

参数

  • max_tokens: 此层词汇表的最大大小。仅在适应词汇表或设置 pad_to_max_tokens=True 时应指定此值。请注意,此词汇表包含 1 个 OOV(Out-Of-Vocabulary,未知词)令牌,因此有效令牌数为 (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 - 1 减小到 max_tokens - 2
    • "multi_hot": 每批次输出一个整数数组,大小为词汇表大小或 max_tokens,其中令牌映射到的索引在批次项中至少存在一次的所有元素都包含 1。
    • "count": 与 "multi_hot" 类似,但整数数组包含该索引处的令牌在批次项中出现的次数计数。
    • "tf_idf": 与 "multi_hot" 类似,但应用 TF-IDF 算法来查找每个令牌槽位中的值。对于 "int" 输出,支持任何形状的输入和输出。对于所有其他输出模式,目前仅支持 rank 1 输入(以及分割后的 rank 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: 可选。可以是字符串数组或文本文件路径。如果传递数组,可以传递包含字符串词汇项的元组、列表、一维 NumPy 数组或一维张量。如果传递文件路径,该文件应每行包含一个词汇项。如果设置了此参数,则无需对层进行 adapt()
  • idf_weights: 仅当 output_mode"tf_idf" 时有效。与词汇表长度相同的元组、列表、一维 NumPy 数组或一维张量,包含浮点逆文档频率权重,这些权重将乘以每个样本的项计数以获得最终的 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  # Maximum vocab size.
>>> max_len = 4  # Sequence length to pad the outputs to.
>>> # Create the layer.
>>> vectorize_layer = TextVectorization(
...     max_tokens=max_tokens,
...     output_mode='int',
...     output_sequence_length=max_len)
>>> # Now that the vocab layer has been created, call `adapt` on the
>>> # list of strings to create the vocabulary.
>>> vectorize_layer.adapt(["foo bar", "bar baz", "baz bada boom"])
>>> # Now, the layer can map strings to integers -- you can use an
>>> # embedding layer to map these integers to learned embeddings.
>>> 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  # Sequence length to pad the outputs to.
>>> # Create the layer, passing the vocab directly. You can also pass the
>>> # vocabulary arg a path to a file containing one vocabulary word per
>>> # line.
>>> vectorize_layer = keras.layers.TextVectorization(
...     max_tokens=max_tokens,
...     output_mode='int',
...     output_sequence_length=max_len,
...     vocabulary=vocab_data)
>>> # Because we've passed the vocabulary directly, we don't need to adapt
>>> # the layer - the vocabulary is already set. The vocabulary contains the
>>> # padding token ('') and OOV token ('[UNK]')
>>> # as well as the passed tokens.
>>> vectorize_layer.get_vocabulary()
['', '[UNK]', 'earth', 'wind', 'and', 'fire']