tf.keras.layers.experimental.preprocessing.TextVectorization
Слой векторной обработки текста.
tf.keras.layers.experimental.preprocessing.TextVectorization(
max_tokens=None, standardize=LOWER_AND_STRIP_PUNCTUATION,
split=SPLIT_ON_WHITESPACE, ngrams=None, output_mode=INT,
output_sequence_length=None, pad_to_max_tokens=True, **kwargs
)
Этот слой предоставляет базовые возможности управления текстом в модели Keras. Он преобразует пакет строк (один образец = одна строка) в список индексов токенов (один образец = 1D тензор целых индексов токенов) или плотное представление (один образец = 1D тензор числовых значений, представляющих данные о токенах образца).
Если требуется, пользователь может вызвать метод adapt() этого слоя на наборе данных. При адаптации этого слоя он проанализирует набор данных, определит частоту отдельных строковых значений и создаст «словарь» из них. Этот словарь может иметь неограниченный размер или быть ограничен, в зависимости от параметров конфигурации этого слоя; если уникальных значений во входных данных больше, чем максимальный размер словаря, для создания словаря будут использоваться наиболее часто встречающиеся термины.
Обработка каждого образца включает следующие шаги:
- стандартизация каждого образца (обычно приведение к нижнему регистру + удаление знаков препинания)
- разделение каждого образца на подстроки (обычно слова)
- соединение подстрок в токены (обычно n-граммы)
- индексирование токенов (присвоение уникального целочисленного значения каждому токену)
- преобразование каждого образца с использованием этого индекса, либо в вектор целых чисел, либо в плотный вектор с плавающей точкой.
Некоторые замечания по передаче вызываемых функций для настройки разделения и нормализации для этого слоя:
- Любая вызываемая функция может быть передана в этот слой, но если вы хотите сериализовать этот объект, вы должны передавать только функции, зарегистрированные как сериализуемые Keras (см.
tf.keras.utils.register_keras_serializableдля получения более подробной информации). - При использовании пользовательской вызываемой функции для
standardize, данные, полученные вызываемой функцией, будут точно такими же, как переданы в этот слой. Вызываемая функция должна возвращать тензор с такой же формой, как вход. - При использовании пользовательской вызываемой функции для
split, данные, полученные вызываемой функцией, будут иметь сжатую первую размерность - вместо[["string to split"], ["another string to split"]], вызываемая функция увидит["string to split", "another string to split"]. Вызываемая функция должна возвращать тензор с первой размерностью, содержащей разделенные токены - в этом примере мы должны увидеть что-то вроде[["string", "to", "split], ["another", "string", "to", "split"]]. Это делает вызываемую функцию совместимой сtf.strings.split().
Пример:
В этом примере создается слой TextVectorization, который преобразует текст в нижний регистр, разделяет по пробелам, удаляет знаки препинания и выводит целочисленные индексы словаря.
text_dataset = tf.data.Dataset.from_tensor_slices(["foo", "bar", "baz"])
max_features = 5000 # Maximum vocab size.
max_len = 4 # Sequence length to pad the outputs to.
embedding_dims = 2
# Create the layer.
vectorize_layer = TextVectorization(
max_tokens=max_features,
output_mode='int',
output_sequence_length=max_len)
# Now that the vocab layer has been created, call `adapt` on the text-only
# dataset to create the vocabulary. You don't have to batch, but for large
# datasets this means we're not keeping spare copies of the dataset.
vectorize_layer.adapt(text_dataset.batch(64))
# Create the model that uses the vectorize text layer
model = tf.keras.models.Sequential()
# Start by creating an explicit input layer. It needs to have a shape of
# (1,) (because we need to guarantee that there is exactly one string
# input per batch), and the dtype needs to be 'string'.
model.add(tf.keras.Input(shape=(1,), dtype=tf.string))
# The first layer in our model is the vectorization layer. After this
# layer, we have a tensor of shape (batch_size, max_len) containing vocab
# indices.
model.add(vectorize_layer)
# Now, the model can map strings to integers, and you can add an embedding
# layer to map these integers to learned embeddings.
input_data = [["foo qux bar"], ["qux baz"]]
model.predict(input_data)
array([[2, 1, 4, 0],
[1, 3, 0, 0]])
| Атрибуты | |
|---|---|
max_tokens | Максимальный размер словаря для этого слоя. Если None, размер словаря не ограничен. Обратите внимание, что этот словарь содержит 1 токен OOV, поэтому эффективное количество токенов составляет (max_tokens - 1 - (1 if output == "int" else 0)). |
standardize | Необязательная спецификация для стандартизации, применяемой к входному тексту. Значения могут быть None (без стандартизации), 'lower_and_strip_punctuation' (приведение к нижнему регистру и удаление знаков препинания) или вызываемая функция. По умолчанию - 'lower_and_strip_punctuation'. |
split | Необязательная спецификация для разделения входного текста. Значения могут быть None (без разделения), 'whitespace' (разделение по пробелам ASCII) или вызываемая функция. По умолчанию - 'whitespace'. |
ngrams | Необязательная спецификация для создания n-грамм из входного текста, который может быть разделен. Значения могут быть None, целым числом или кортежем целых чисел; передача целого числа создаст n-граммы до этого целого числа, а передача кортежа целых чисел создаст n-граммы для указанных значений в кортеже. Передача None означает, что n-граммы не будут созданы. |
output_mode | Необязательная спецификация для вывода слоя. Значения могут быть "int", "binary", "count" или "tf-idf", конфигурируя слой следующим образом: "int": Выводит целочисленные индексы, один целочисленный индекс на токен разделенной строки. Когда output == "int", 0 зарезервирован для замаскированных позиций; это уменьшает размер словаря до max_tokens-2 вместо max_tokens-1 "binary": Выводит один целочисленный массив на пакет, размером vocab_size или max_tokens, содержащий 1 в всех элементах, где токен, сопоставленный с этим индексом, встречается как минимум один раз в элементе пакета. "count": Как "binary", но целочисленный массив содержит количество раз, когда токен в этом индексе встречался в элементе пакета. "tf-idf": Как "binary", но применяется алгоритм TF-IDF для нахождения значения в каждом слоте токена. |
output_sequence_length | Действительно только в режиме INT. Если задано, выход будет иметь размер временной размерности, заполненной или усеченной до ровно output_sequence_length значений, что приведет к тензору размера [размер_пакета, длина_последовательности_выхода] независимо от того, сколько токенов получилось в результате шага разделения. По умолчанию None. |
pad_to_max_tokens | Действительно только в режимах "binary", "count" и "tf-idf". Если True, ось признаков вывода будет заполнена до max_tokens, даже если количество уникальных токенов в словаре меньше max_tokens, что приведет к тензору размера [размер_пакета, max_tokens] независимо от размера словаря. По умолчанию True. |
Методы
adapt
adapt(
data, reset_state=True
)
Определяет состояние слоя предобработки по набору данных.
Переопределяет метод adapt по умолчанию для применения соответствующей предобработки к входам перед передачей в объединяющий блок.
| Аргументы | |
|---|---|
data | Данные для обучения. Они могут быть переданы как tf.data Dataset, как массив NumPy, строковый тензор или как список текстов. |
reset_state | Необязательный аргумент, определяющий, нужно ли очищать состояние слоя в начале вызова adapt. Это должно быть True для этого слоя, который не поддерживает повторные вызовы adapt. |
get_vocabulary
get_vocabulary()
set_vocabulary
set_vocabulary(
vocab, df_data=None, oov_df_value=None
)
Устанавливает данные словаря (и, необязательно, частоты документов) для этого слоя.
Этот метод непосредственно устанавливает данные словаря и DF для этого слоя вместо анализа набора данных через 'adapt'. Он должен использоваться всякий раз, когда информация о словаре (и, необязательно, частотах документов) уже известна. Если данные словаря уже присутствуют в слое, этот метод заменит их.
| Аргументы | |
|---|---|
vocab | Массив строковых токенов. |
df_data | Массив данных частоты документов. Необходим только в том случае, если режим вывода слоя - TFIDF. |
oov_df_value | Частота документа токена OOV. Необходим только в том случае, если режим вывода - TFIDF. |
| Исключения | |
|---|---|
ValueError | Если входов слишком много, входы не совпадают или данные входа отсутствуют. |
RuntimeError | Если словарь не может быть установлен при вызове этой функции. Это происходит, когда режимы "binary", "count" и "tfidf", если "pad_to_max_tokens" False и сам слой уже был вызван. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/keras/layers/experimental/preprocessing/TextVectorization