Обработка текстовых данных в TensorFlow

Будучи одним из самых популярных фреймворков глубокого обучения сегодня, TensorFlow предоставляет мощные возможности обработки текстовых данных. В этой статье подробно описывается, как использовать TensorFlow для обработки текстовых данных, включая ключевые этапы, такие как предварительная обработка текста, векторизация и ввод данных в модель.

Текстовые данные — один из самых распространённых типов данных в машинном обучении, но компьютеры не могут напрямую понимать необработанный текст, поэтому его необходимо преобразовать в числовую форму. TensorFlow предоставляет ряд инструментов и API, упрощающих этот процесс.


Основы предобработки текста

Зачем нужна предобработка текста

Необработанные текстовые данные обычно содержат много шума и несогласованности, например:

  • Непоследовательное использование регистра
  • Пунктуация
  • Стоп-слова (такие как "the", "is" и т.д.)
  • Специальные символы
  • Орфографические ошибки

Цель предобработки — преобразовать исходный текст в чистый, согласованный формат, что упрощает последующее извлечение признаков и обучение модели.


Инструменты TensorFlow для обработки текста

TensorFlow предоставляет несколько модулей для обработки текста:

  1. tf.strings: Базовые операции со строками
  2. tf.keras.layers.TextVectorization: Слой векторизации текста
  3. tf.data.TextLineDataset: Создание наборов данных из текстовых файлов
  4. tensorflow_text: Библиотека расширенной обработки текста (требуется отдельная установка)

Установка необходимых библиотек

Пример

import tensorflow as tf
from tensorflow.keras.layers import TextVectorization
import tensorflow_text as tf_text  # Необязательно, для расширенной обработки

Базовые операции с текстом

1. Базовые операции со строками

TensorFlowtf.stringsмодуль предоставляет общие строковые операции:

Пример

# Создание строковых тензоров
text = tf.constant(["Обработка текста TensorFlow", Глубокое обучение и обработка естественного языка])

# Преобразовать в нижний регистр
lower_case = tf.strings.lower(text)
# Вывод: ['tensorflow text processing', 'deep learning natural language processing']

# Разделить строку
words = tf.strings.split(text)
# Вывод: [['TensorFlow', 'Text Processing'], ['Deep Learning', 'Natural Language Processing']]

# Длина строки
length = tf.strings.length(text)
# Вывод: [10, 11]

2. Обработка регулярных выражений

Пример

# Удалить знаки препинания
def remove_punctuation(text):
    return tf.strings.regex_replace(text, '[%s]' % re.escape(string.punctuation), '')

text = tf.constant("Hello, World!")
clean_text = remove_punctuation(text)
# Вывод: "Hello World"

Векторизация текста

Преобразование текста в числовое представление — ключевой этап обработки текста. TensorFlow предоставляетTextVectorizationслой для реализации этой функциональности.

1. Создание слоя векторизации

Пример

# Определить слой векторизации текста
vectorize_layer = TextVectorization(
    max_tokens=10000,        # Максимальный размер словаря
    output_mode='int',       # Вывод целочисленных индексов
    output_sequence_length=50  # Одинаковая длина последовательности
)

# Пример текстовых данных
text_dataset = tf.data.Dataset.from_tensor_slices([
    "Это первое предложение",
    Это ещё одно отличающееся предложение.,
    "Добавьте третье предложение-пример"
])

# Адаптируйте данные и постройте словарь
vectorize_layer.adapt(text_dataset)

2. Векторизация текста

Пример

# Векторизовать одно предложение
vectorized_text = vectorize_layer("Это пример предложения")
print(vectorized_text)
# Вывод примерно такой: [5, 3, 10, 8, 0, 0, ...] (дополнено нулями до длины 50)

# Получить словарь
vocab = vectorize_layer.get_vocabulary()
print(vocab[:10])  # Вывести первые 10 элементов словаря

3. Параметры режима векторизации

TextVectorizationСлой поддерживает несколько режимов вывода:

Mode Описание Сценарий применения
'int' Вывод индексов слов Вход слоя встраивания
'binary' Мульти-hot кодирование Классификация с небольшим словарём
'count' Подсчёт частоты слов Модель мешка слов
'tf-idf' Веса TF-IDF Поиск информации

Продвинутая обработка текста

Для более сложных задач обработки текста можно использоватьtensorflow_textбиблиотека:

1. Токенизатор

Пример

# Установите tensorflow_text (если нужно)
# !pip install tensorflow-text

import tensorflow_text as tf_text

# Создайте токенизатор
tokenizer = tf_text.WhitespaceTokenizer()

# Токенизировать
tokens = tokenizer.tokenize(["TensorFlow Text Processing", "Deep learning NLP"])
print(tokens)
# Вывод: [['TensorFlow', 'text processing'], ['deep learning', 'NLP']]

2. Токенизация подслов

Пример

# Использовать токенизатор BERT
bert_tokenizer = tf_text.BertTokenizer(
    vocab_lookup_table="path/to/vocab.txt",
    token_out_type=tf.int32
)

tokens = bert_tokenizer.tokenize(["Обработка естественного языка очень интересна"])
print(tokens)

Построение конвейеров обработки текста

Полная обработка текста обычно включает несколько шагов, которые можно выполнить с помощьюtf.dataи слоёв предобработки для построения конвейера:

Пример

def preprocess_text(text):
    # Преобразовать в нижний регистр
    text = tf.strings.lower(text)
    # Удалить знаки препинания
    text = tf.strings.regex_replace(text, '[^a-zA-Z0-9\u4e00-\u9fa5]', ' ')
    return text

# Создание конвейера обработки
def make_text_pipeline(text_ds, batch_size=32):
    # Предобработка
    text_ds = text_ds.map(preprocess_text)
    # Векторизация
    text_ds = text_ds.map(vectorize_layer)
    # Пакетная обработка
    text_ds = text_ds.batch(batch_size)
    return text_ds

# Использование конвейера
processed_ds = make_text_pipeline(text_dataset)

Примеры практического применения

Обработка данных анализа тональности

Пример

# 1. Загрузить данные
(train_text, train_labels), (test_text, test_labels) = tf.keras.datasets.imdb.load_data()

# 2. Создать слой векторизации
max_features = 10000
sequence_length = 250

vectorize_layer = TextVectorization(
    max_tokens=max_features,
    output_mode='int',
    output_sequence_length=sequence_length
)

# 3. Адаптировать данные (построить словарь, используя только обучающие данные)
text_ds = tf.data.Dataset.from_tensor_slices(train_text).batch(128)
vectorize_layer.adapt(text_ds)

# 4. Построить модель
model = tf.keras.Sequential([
    vectorize_layer,
    tf.keras.layers.Embedding(max_features, 16),
    tf.keras.layers.GlobalAveragePooling1D(),
    tf.keras.layers.Dense(1, activation='sigmoid')
])

# 5. Скомпилировать и обучить модель
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])
model.fit(train_text, train_labels, epochs=10)

Лучшие практики и типичные проблемы

Лучшие практики

  1. Размер словаря: Выберите подходящий размер словаря в зависимости от размера набора данных; обычно достаточно 10,000-50,000.
  2. Длина последовательности: Проанализируйте распределение длин текстов и выберите длину, которая покрывает большинство примеров.
  3. Согласованность предобработки: Убедитесь, что одни и те же шаги предобработки используются при обучении и инференсе.
  4. Оптимизация памяти: Для больших наборов данных используйте генераторы или средства кэширования tf.data.

Распространённые проблемы

1. Обработка слов вне словаря (OOV):

Пример

vectorize_layer = TextVectorization(
    max_tokens=10000,
    output_mode='int',
    output_sequence_length=50,
    pad_to_max_tokens=True  # Убедитесь, что все длины вывода согласованы
)

2. Обработка многоязычного текста:

  • Единообразное кодирование в UTF-8
  • Рассмотрите предварительную обработку с учётом языка (например, сегментацию китайских слов)

3. Оптимизация производительности:

  • Используйтеtf.data: предварительная выборка и кэш
  • Рассмотрите офлайн-предобработку для больших наборов данных

Итог

TensorFlow предоставляет комплексный инструментарий для обработки текста — от базовых строковых операций до продвинутых методов векторизации. Правильно используя эти инструменты, вы можете эффективно преобразовывать необработанный текст в числовые представления, подходящие для входных данных моделей глубокого обучения. Ключевые шаги включают:

  1. Очистка и стандартизация текста
  2. Выбор подходящей стратегии векторизации
  3. Создание переиспользуемых конвейеров обработки
  4. Интеграция с рабочим процессом обучения модели

Освоение этих навыков заложит прочную основу для задач обработки естественного языка.

Другие расширения