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 模型中文本的基本选项。它将一批字符串(一个示例 = 一个字符串)转换为令牌索引列表(一个示例 = 整数令牌索引的 1D 张量)或密集表示(一个示例 = 表示示例令牌数据的浮点值 1D 张量)。此层旨在处理自然语言输入。要处理简单的字符串输入(分类字符串或预分词字符串),请参阅 kers_core.layers.StringLookup。
层的词汇表必须在构造时提供,或者通过 adapt() 学习。当此层被适配时,它将分析数据集,确定单个字符串值的频率,并从中创建词汇表。此词汇表的大小可以是无限的,也可以是有限的,具体取决于此层的配置选项;如果输入中的唯一值多于词汇表的最大大小,则将使用最频繁的项来创建词汇表。
每个示例的处理包含以下步骤:
关于将可调用对象传递给此层以自定义分割和标准化的说明
keras.saving.register_keras_serializable)。standardize 时,传递给可调用对象的数据将与传递给此层的完全相同。可调用对象应返回与输入形状相同的张量。split 时,传递给可调用对象的数据将去除第一维 - 而不是 [["string to split"], ["another string to split"]],可调用对象将看到 ["string to split", "another string to split"]。可调用对象应返回一个 string 类型的 tf.Tensor,其中第一个维度包含拆分后的令牌 - 在此示例中,我们应该看到类似 [["string", "to", "split"], ["another", "string", "to", "split"]] 的内容。注意:此层内部使用 TensorFlow。它不能用作带有 TensorFlow 以外任何后端的模型的编译计算图的一部分。但是,在使用急切执行时,它可以与任何后端一起使用。它也可以始终用作任何后端(模型外部)的输入预处理管道的一部分,这是我们推荐使用此层的方式。
注意:此层可以在 tf.data 管道中使用(与您使用的后端无关)。
参数
pad_to_max_tokens=True 时指定。请注意,此词汇表包含 1 个 OOV 令牌,因此有效令牌数为 (max_tokens - 1 - (1 if output_mode == "int" else 0))。None:不进行标准化。"lower_and_strip_punctuation":文本将被转换为小写并去除所有标点符号。"lower":文本将被转换为小写。"strip_punctuation":将去除所有标点符号。None:不进行分割。"whitespace":按空格分割。"character":按每个 Unicode 字符分割。None、一个整数或一个整数元组;传递一个整数将创建最多该整数的 n-gram,传递一个整数元组将为元组中指定的 n-gram 值创建 n-gram。传递 None 表示不创建 n-gram。"int"、"multi_hot"、"count" 或 "tf_idf",配置层如下:"int":输出整数索引,每个拆分后的字符串令牌一个整数索引。当 output_mode == "int" 时,0 保留用于掩码位置;这会将词汇表大小减少到 max_tokens - 2 而不是 max_tokens - 1。"multi_hot":为每个批次输出一个单一的整数数组,大小为 vocab_size 或 max_tokens,其中对于令牌映射到该索引的元素,如果该令牌至少在一个批次项中出现,则为 1。"count":类似于 "multi_hot",但整数数组包含令牌在批次项中出现的次数。"tf_idf":类似于 "multi_hot",但会应用 TF-IDF 算法来查找每个令牌槽中的值。对于 "int" 输出,支持任何形状的输入和输出。对于所有其他输出模式,目前仅支持秩 1 输入(以及拆分后的秩 2 输出)。output_sequence_length 个值,从而得到一个形状为 (batch_size, output_sequence_length) 的张量,而不管分割步骤产生了多少个令牌。默认为 None。如果 ragged 为 True,则 output_sequence_length 仍可能截断输出。"multi_hot"、"count" 和 "tf_idf" 模式下有效。如果为 True,即使词汇表中唯一令牌的数量少于 max_tokens,输出的特征轴也将被填充到 max_tokens,从而得到一个形状为 (batch_size, max_tokens) 的张量,而与词汇表大小无关。默认为 False。adapt() 该层。output_mode 为 "tf_idf" 时有效。一个元组、列表、1D NumPy 数组或与词汇表长度相同的 1D 张量,包含浮点逆文档频率权重,这些权重将乘以每个样本的术语计数以获得最终的 tf_idf 权重。如果设置了 vocabulary 参数,并且 output_mode 为 "tf_idf",则必须提供此参数。"int" 输出模式。仅受 TensorFlow 后端支持。如果为 True,则返回 RaggedTensor 而不是密集 Tensor,其中每个序列在字符串分割后可以具有不同的长度。默认为 False。"multi_hot"、"count" 和 "tf_idf" 输出模式。仅受 TensorFlow 后端支持。如果为 True,则返回 SparseTensor 而不是密集 Tensor。默认为 False。"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']