Что такое увеличение текста?

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

«Увеличение данных в анализе данных — это методы, используемые для увеличения объема данных путем добавления слегка измененных копий уже существующих данных или вновь созданных синтетических данных из существующих данных».

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

То же самое касается текстовых данных. Обычно для обучения языковой модели вводится слишком мало текста. Например, при классификации текста, одной из наиболее распространенных задач обработки естественного языка (NLP), для обучения модели требуется большой объем данных. Вот почему методы увеличения текста обычно используются для повышения производительности моделей НЛП.

В этой статье я покажу вам, как применять текстовую аугментацию с помощью библиотеки Python NLPAUG.

Библиотека увеличения текста NLPAUG

NLPAUG — это библиотека Python с открытым исходным кодом, разработанная Эдвардом Ма, которая делает расширение текста очень простым. Библиотека предлагает ряд текстовых дополнений для символов, слов и предложений, которые можно применить всего за 3 строки кода.

Монтаж

NLPAUG можно установить из PyPI следующим образом:

pip install nlpaug

Его также можно установить поверх Конды:

conda install -c makecedward nlpaug

Если вы планируете выполнять аугментацию синонимов или антонимов, вам необходимо установить Библиотеку NLTK. Вы можете установить его из PyPI следующим образом:

pip install nltk

Если вы планируете выполнять аугментацию встраивания слов, вам необходимо загрузить предварительно обученную модель. Вы можете скачать word2vec, glove или fasttext следующим образом:

from nlpaug.util.file.download import DownloadUtil
DownloadUtil.download_word2vec(dest_dir='.') # Download word2vec model
DownloadUtil.download_glove(model_name='glove.6B', dest_dir='.') # Download GloVe model
DownloadUtil.download_fasttext(model_name='wiki-news-300d-1M', dest_dir='.') # Download fasttext model

pip install gensim

Если вы планируете выполнять аугментацию обратного перевода предложений, вы должны установить библиотеку SacreMoses. Вы можете установить его следующим образом:

pip install sacremoses

Аугментационные операции

Каждый аугментатор NLPAUG использует одну или несколько операций:

  • Вставка: добавление новых символов, слов или предложений в исходный текст.
  • Заменить: замена символов, слов или предложений исходным текстом.
  • Поменять местами: поменять местами соседние символы, слова или предложения на исходный текст.
  • Удалить: удаление символов, слов или предложений из исходного текста.
  • Разделить: разделение слов на две или более частей.
  • Обрезать: удалить часть предложений.

Контур

  1. Расширение символов
    1.1 Расширение клавиатуры
    1.2 Расширение оптического распознавания символов (OCR)
    1.3 Расширение случайных чисел
  2. Расширитель слов
    2.1 Модуль расширения синонимов
    2.2 Модуль расширения антонимов
    2.3 Модуль разделения слов
    2.4 Модуль расширения правописания
    2.5 Модуль расширения зарезервированных слов
    2.6 Модуль расширения вложений слов
    2.7 Модуль расширения контекстных слов
    2.8 Модуль расширения обратного перевода
    2.9 Модуль расширения TF-IDF
    2.10 Модуль расширения случайных слов
  3. Расширитель предложений
    3.1. Модуль абстрактного суммирования
    3.2. Модуль расширения контекстных слов
    3.3. Модуль расширения LAMBADA
    3.4. Модуль случайного увеличения.

1) Аугментер персонажа

Средство увеличения символов — это метод, используемый при расширении текста для создания вариантов текстовых данных путем применения указанных изменений на уровне символов. Аугментаторы персонажей вносят изменения, такие как замена символов, удаление, вставка или другие корректировки.

Аугментация персонажей использует правила или вероятностные подходы, чтобы определить, какие символы следует изменить и как их изменить.

nlpaug.augmenter.charmodule NLPAUG предоставляет три метода увеличения символов: расширение клавиатуры, расширение оптического распознавания символов и случайное увеличение.

1.1 Расширение клавиатуры

Увеличение клавиатуры — это метод увеличения текста, который увеличивает текстовые данные, вставляя опечатки. На уровне символов он заменяет символы в словах на те, которые находятся на близком расстоянии от клавиатуры, имитируя вероятность ошибок клавиатуры при наборе текста.

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

Функция char.KeywordAug() NLPAUG применяет имитацию опечатки к текстовому вводу:

import nlpaug.augmenter.char as nac

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Keyboard 
aug = nac.KeyboardAug()
augmented_text = aug.augment(text)
print(augmented_text)

1.2 Модуль оптического распознавания символов (OCR)

Распознавание символов (OCR) — это технология, которая преобразует изображения или документы в текст, который может быть прочитан компьютерами. Он делает это, анализируя визуальные паттерны изображения, идентифицируя отдельные символы или слова и преобразовывая их в текст.

Модели OCR часто допускают ошибки, например, путают «0» с «o» или «I» с «1». Вот почему при обучении модели OCR важно имитировать ошибки и несоответствия, которые могут возникнуть в процессе OCR.

Расширение NLPAUG char.OcrAug() вводит ошибки OCR на уровне символов в тексте, заменяя символы:

import nlpaug.augmenter.char as nac

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# OCR
aug = nac.OcrAug()
augmented_text = aug.augment(text)
print(augmented_text)

1.3 Случайный усилитель

Случайный аугментатор вводит случайные вариации в текстовые данные. Он имитирует различные типы ошибок, которые могут естественным образом возникать в языке.

Функция RandomCharAug() NLPAUG может заменять символы на похожие, случайным образом менять местами соседние символы, а также удалять или вставлять случайные символы внутри текста. Эти варианты способствуют более диверсифицированному набору обучающих данных и повышают надежность вашей модели при работе с реальными данными.

Вы можете выбрать один тип операции с помощью параметра action: вставить, заменить, заменить, удалить.

import nlpaug.augmenter.char as nac

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Random - Character level - insert
aug = nac.RandomCharAug(action="insert")
augmented_text = aug.augment(text)
print(augmented_text)

2) Усилитель слов

Расширение текста также может выполняться на уровне слов путем внесения вариаций или модификаций в слова.

Методы увеличения слов включают замену слов синонимами, вставку или удаление слов или даже изменение порядка слов в предложении.

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

Модуль nlpaug.augmenter.word NLPAUG предоставляет десять методов увеличения слов: средство увеличения синонимов, средство увеличения антонимов, средство разделения слов, средство расширения орфографии, средство расширения зарезервированных слов, средство расширения встраивания слов, средство расширения контекстных слов, средство увеличения обратного перевода, средство увеличения TF-IDF, средство увеличения случайных слов.

2.1 Увеличитель синонимов

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

SynonymAug() NLPAUG заменяет похожие слова в соответствии с синонимами WordNet/PPDB. Вы можете выбрать, какую модель использовать, используя параметр aug_src:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Synonym
aug = naw.SynonymAug(aug_src='wordnet')
augmented_text = aug.augment(text)
print(augmented_text)

2.2 Антоним Аугментер

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

Функция NLPAUG AntonymAug() заменяет слова противоположного значения в соответствии с антонимами WordNet:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Antonym
aug = naw.AntonymAug()
augmented_text = aug.augment(text)
print(augmented_text)

2.3 Сплит-аугментатор

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

Функция NLPAUG SplitAug() применяет операцию разделения слов к текстовому вводу:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Split
aug = naw.SplitAug()
augmented_text = aug.augment(text)
print(augmented_text)

2.4 Усилитель правописания

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

SpellingAug() NLPAUG заменяет слово в соответствии со словарем орфографических ошибок:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Spelling
aug = naw.SpellingAug()
augmented_text = aug.augment(text)
print(augmented_text)

2.5 Зарезервированный модуль расширения слов

Метод увеличения зарезервированного слова применяет операцию замены целевого слова к тексту.

Этот метод позволяет вам выбирать, какие слова должны оставаться неизменными в процессе увеличения. Этот метод полезен, когда вы хотите применить дополнение к определенным частям текста, сохранив при этом другие.

Функция NLPAUG ReservedAug() заменяет слова, которые не определены в списке, который передается в качестве аргумента параметра reserved_token:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Reserved words
reserved_tokens = ['lion', 'windows']  # Specify the reserved tokens here
aug = naw.ReservedAug(reserved_tokens=reserved_tokens)
augmented_text = aug.augment(text)
print(augmented_text)

2.6 Расширение вложений слов

Расширение встраивания слов — это метод увеличения текста, который заменяет определенные слова семантически сопоставимыми альтернативами. Этот прием помогает разнообразить язык текста.

Функция WordEmbsAug() NLPAUG применяет операцию к текстовому вводу на основе встраивания слов. С помощью параметра action можно указать один тип операции: вставить или заменить. Вы также можете указать используемую модель встраивания слов, например Word2Vec, GloVe или fastText.

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Word embeddings
aug = naw.WordEmbsAug(model_type='word2vec', model_path=gn_vec_path, action='insert')
augmented_text = aug.augment(text)
print(augmented_text)

2.7 Расширение контекстных вложений слов

Расширение контекстуального встраивания слов — это метод увеличения текста, который понимает значение и контекст слов в предложении и либо передает их окружение, либо заменяет их n лучшими похожими словами из предварительно обученных языковых моделей, таких как BERT, DistilBERT, RoBERTa или XLNet.

Функция NLPAUG context_word_embs() использует контекстные вложения слов, чтобы найти n первых похожих слов для увеличения. С помощью параметра action можно указать один тип операции: вставить или заменить.

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Contextual Word Embeddings - Word level
aug = naw.ContextualWordEmbsAug()
augmented_text = aug.augment(text)
print(augmented_text)

2.8 Усилитель обратного перевода

Расширение обратного перевода — это метод увеличения текста, в котором используется предварительно обученная модель машинного обучения для перевода текста с одного языка на другой, а затем обратно на исходный язык.

Модуль обратного перевода добавляет разнообразия в текст, выполняя этот круговой перевод. Этот метод увеличения текста может быть полезен, когда вам нужно увеличить размер ваших обучающих данных.

Функция Back_TranslationAug() NLPAUG использует две модели перевода для увеличения:

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Back translation
aug = naw.BackTranslationAug()
augmented_text = aug.augment(text)
print(augmented_text)

2.9 Увеличитель TF-IDF

Другим методом увеличения текста является частота термина, обратная частоте документа (TF-IDF).

Этот аугментатор вычисляет оценки TF-IDF слов в тексте путем умножения частоты терминов (TF) на обратную частоту документа (IDF). Эти баллы указывают на значимость слова в тексте.

Считается, что слова с низким баллом TF-IDF менее релевантны смыслу текста и с большей вероятностью будут заменены другими словами с низким баллом. Этот прием создает вариации, не меняющие смысла исходного текста.

Модель TF-IDF необходимо обучить на наборе данных, после чего вы можете использовать функцию NLPAUG TfIdfAug() для вставки или замены слов на основе оценок.

В следующем примере я обучаю модель TF-IDF на наборе данных 20 групп новостей Scikit-Learn и использую его для дополнения нашего предложения с помощью модуля расширения NLPAUG TF-IDF:

import sklearn.datasets
import re
import nlpaug.augmenter.word as naw
import nlpaug.model.word_stats as nmw

# Defining a tokenizer function to extract word tokens
def _tokenizer(text, token_pattern=r"(?u)\b\w\w+\b"):
    token_pattern = re.compile(token_pattern)
    return token_pattern.findall(text)

# Load sample data (Scikit Learn 20 News Groups)
train_data = sklearn.datasets.fetch_20newsgroups(subset='train', remove=('headers', 'footers', 'quotes'))
train_x = train_data.data

# Tokenize input
train_x_tokens = [_tokenizer(x) for x in train_x]

# Train TF-IDF model
tfidf_model = nmw.TfIdf()
tfidf_model.train(train_x_tokens)
tfidf_model.save('.')

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Augment the text with TFIDF augmenter
aug = naw.TfIdfAug(model_path='.', tokenizer=_tokenizer)
augmented_text = aug.augment(text)
print(augmented_text)

2.10 Увеличитель случайных слов

Средство увеличения случайных слов применяет к входному тексту поведение случайного увеличения на уровне слов. Он вносит разнообразие в текст за счет случайного использования нескольких методов увеличения текста.

Функция RandomWordAug() NLPAUG может произвольно менять местами, обрезать или удалять слова. Эти вариации способствуют более диверсифицированному набору обучающих данных.

Вы можете выбрать один тип операции с помощью параметра action: поменять местами, обрезать, удалить.

import nlpaug.augmenter.word as naw

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Random
aug = naw.RandomWordAug()
augmented_text = aug.augment(text)
print(augmented_text)

3) Увеличитель предложения

Расширение текста также может выполняться на уровне предложений, что включает в себя внесение изменений или корректировок в предложения при сохранении общего контекста и смысла текста.

Примеры методов увеличения предложения включают вставку слов в зависимости от контекста или изменение порядка слов в предложении с сохранением грамматической точности.

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

Модуль nlpaug.augmenter.sentence NLPAUG предоставляет четыре модуля расширения предложений:

nlpaug.augmenter.sentence

3.1 Абстрактное суммирование Augmenter

Средство увеличения абстрактного суммирования — это метод расширения текста, который использует абстрактное суммирование для внесения изменений в текстовый ввод.

Абстрактное обобщение - это задача создания краткого изложения данного текста, которое охватывает ключевые понятия и значение исходного содержания. Резюме может включать новые фразы и предложения, которых нет в исходном тексте.

Дополнение текста абстрактным обобщением может привнести разнообразие и различия в структуру и содержание фраз, что может быть полезно для обучения модели НЛП.

AbstSummAug() Резюме статьи NLPAUG методом абстрактного обобщения:

import nlpaug.augmenter.sentence as nas

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Abstractive Summarization
aug = nas.AbstSummAug()
augmented_text = aug.augment(text)
print(augmented_text)

3.2 Расширение контекстных вложений слов

Расширение контекстных вложений слов — это методы увеличения текста, которые понимают значение и контекст слов в предложении, чтобы вставлять новые слова.

В контексте расширения на уровне предложений контекстные вложения слов добавляют новые предложения с n лучшими похожими словами из предварительно обученных моделей, таких как XLNet, GPT2 или DistilGPT2.

Функция ContextualWordEmbsForSentenceAug() от NLPAUG использует контекстное встраивание слов для вставки новых предложений:

import nlpaug.augmenter.sentence as nas

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Contextual Word Embeddings - Sentence level
aug = nas.ContextualWordEmbsForSentenceAug()
augmented_text = aug.augment(text)
print(augmented_text)

3.3 Аугментатор ЛАМБАДА

Расширение данных на основе языковой модели (LAMBADA) — это метод расширения текста, в котором используется предварительно обученная языковая модель для прогнозирования отсутствующих слов в предложении и создания альтернативных вариантов предложения.

Техника LAMBADA (Anaby-Tavor et al., 2019) вдохновлена ​​набором данных LAMBADA, который состоит из отрывков из книг, где удалено последнее слово. Цель состоит в том, чтобы предсказать пропущенное слово, что требует глубокого понимания контекста. Расширение текста LAMBADA использует языковые модели, такие как GPT или BERT, для создания новых предложений, предсказывая пропущенное слово с учетом контекста.

Использование модуля расширения LAMBADA — отличный способ внести разнообразие в структуру предложений и улучшить качество ваших обучающих данных для вашей модели НЛП.

Модель LAMBADA должна быть обучена на наборе данных, после чего вы можете использовать функцию NLPAUG LambadaAug() для применения увеличения на уровне предложения. Обратитесь к Примеру репозитория GitHUb на LAMBADA от NLPAUG.

3.4 Случайный усилитель

Случайный аугментатор применяет к входному тексту случайное поведение аугментации на уровне предложения.

Функция RandomSentAug() NLPAUG может произвольно менять местами, обрезать или удалять предложения. Эти вариации способствуют более диверсифицированному набору обучающих данных.

import nlpaug.augmenter.sentence as nas

text = "It was a dark and stormy night. I was alone at home when I saw a lion's face followed by a scary thunderous roar at the windows."

# Random Augmenter - Sentence level 
aug = nas.RandomSentAug()
augmented_text = aug.augment(text)
print(augmented_text)

Заключение

В заключение, библиотека Python NLPAUG предоставляет разнообразный набор методов увеличения текста, которые могут значительно улучшить качество и разнообразие текстовых данных для задач НЛП. От простых операций, таких как замена синонимов, до продвинутых методов, таких как контекстуальное встраивание слов, NLPAUG предоставляет широкий набор инструментов для ученых и практиков в этой дисциплине.