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"]
。该可调用对象应返回一个 tf.Tensor
,其数据类型为 string
,第一维包含拆分的令牌 - 在此示例中,我们应该看到类似 [["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 元组,传递整数元组将创建元组中指定值的 n 元组。传递 None
表示不创建任何 n 元组。"int"
、"multi_hot"
、"count"
或 "tf_idf"
,配置层如下"int"
:输出整数索引,每个拆分的字符串令牌对应一个整数索引。当 output_mode == "int"
时,0 保留用于掩码位置;这将词汇表大小减少到 max_tokens - 2
而不是 max_tokens - 1
。"multi_hot"
:输出每个批次的单个 int 数组,大小为 vocab_size 或 max_tokens,在批次项中存在令牌映射到该索引的每个元素中都包含 1。"count"
:与 "multi_hot"
相似,但 int 数组包含该索引处的令牌在批次项中出现的次数。"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']