TextVectorization
classkeras.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
时,可调用对象接收的数据将挤出第1维度 - 而不是[["string to split"], ["another string to split"]]
,可调用对象将看到["string to split", "another string to split"]
.可调用对象应返回dtype为string
的tf.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
.如果ragged
为True
,则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']