AM: Не верьте этой шумихе.
AI: Ну ..

Введение.

Генераторы текста - это круто, правда? Когда два года назад я впервые наткнулся на нечто похожее на «генератор Шекспира», я был потрясен.

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

Поэтому я решил создать лирический генератор на основе лирики Arctic Monkeys. Идея была разделена на три основных компонента

  • Создание корпуса данных и очистка данных
  • Увеличение текстовых данных
  • Языковые модели и генераторы

Создание корпуса данных

Я нашел блог Джонатана Дейтона действительно полезным. Он использует spotifyAPI для получения идентификатора исполнителя в Spotify, перечисления всех идентификаторов альбомов, получения списка всех идентификаторов треков. Затем все тексты песен сохраняются с помощью GeniusAPI. Вот фрагмент кода для получения данных.

Зависимости:

  • lyricsgenius

Увеличение текста

Набор данных состоял из 144 песен, что составляет 167887 слов. Я действительно хотел прокомментировать количество песен, написанных Алексом, и они даже не включают песни из последнего Shadow Puppets и его сольного альбома - я отвлекаюсь!

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

Здесь использовались два типа увеличения текста:

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

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

Я использовал два типа аугментации - BertAug и FasttextAug. Они оба вставляют / заменяют похожие слова в зависимости от контекста. BertAug использует языковую модель BERT для предсказания заменяемого слова или предсказания следующего слова в случае вставки. FasstextAug заменяет или вставляет слова на основе контекстных вложений слов.

Результаты после BERTAug вставить и заменить

in: всегда есть кто-то выше с большим умом
out: это всегда кто-то выше с большей темпом умом

weeeirrrdddd ... но звучит примерно правильно.

Результаты после вставки и замены FasttextAug

in: всегда есть кто-то более высокий с большим остроумием
out: Всегда есть кто-то более высокий с большим остроумием

Также произошла интересная вещь: не было исключений ValueError для неизвестных слов для FasttestAug из-за встраивания вложенных слов - я использовал wiki-news-300d-1M-subword.vec для загрузки модели -

Кроме - ну - «i.d.s.t. i.d.s.t. i.d.s.t i.d.s.t »,« чу-чу! чу-чу! чу-чу! »и« шу-шу-шу-шу-шу-шу ». Честно говоря, я не виню в этом.

После увеличения в корпусе было 334524 слова. Это означает, что новые данные вдвое превышают исходные.

Создание расширенного набора данных заняло довольно много времени. (около часа ish) У меня есть файл .txt окончательного корпуса, загруженный на диск Google.

Модель LSTM

Идеальная модель генерации текста будет принимать начальное слово / предложение и с учетом истории слов w0,…, wk предсказывать следующие слова wn + p. Поскольку рекуррентные нейронные сети и LSTM имеют память, они вычисляют следующее наблюдение на основе предыдущего состояния.

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

В настоящее время существуют нерекурсивные модели, которые действительно хорошо работают при языковом моделировании с использованием преобразователей, таких как OpenAI Модель генерации текста GPT-2.

Полученные результаты:

Полученные результаты:

Тонкая настройка с использованием OpenAI's GPT-2

Я использовал gpt_2_simple - Простой пакет Python, который обертывает существующие сценарии точной настройки и генерации модели для« режима генерации текста GPT-2 в OpenAI l».

Исходный набор данных с BERTAug и FasttextAug был объединен и экспортирован в текст в виде am_corpus.txt

Результаты со случайным префиксом:

Для оценки этого результата я использовал ROUGE. Это расшифровывается как отзыв-ориентированный дублер для оценки предложения. Я нашел - Что такое ROUGE и как он работает для оценки задач обобщения? - действительно полезно для понимания ROUGE.

По сути, тексты, созданные моделью GPT-2, более значимы, чем по сравнению с моделью LSTM! Хотя, честно говоря, у модели LSTM не было хороших шансов на тренировку всего за 5 эпох.

использованная литература

Изменить: добавлены показатели оценки и другие результаты.