Вы когда-нибудь думали написать лирику или тексты в стиле нобелевского лауреата Рабиндраната Тагора? Вот пример того, как вы можете генерировать литературное содержимое аналогично тому, как Gitanjali был составлен с использованием обработки текста на естественном языке (NLTP).

Сбор данных:

Для этого я собрал все тексты из литературы Гитанджали. Ниже приведены некоторые главы из Gitanjali.

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

— — — — — — — — — — — — — — — — — — —

Эту маленькую тростниковую флейту ты пронес через холмы и долины и вдохнул через нее вечно новые мелодии.

— — — — — — — — — — — — — — — — — — —

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

— — — — — — — — — — — — — — — — — — —

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

Обработка данных:

Во-первых, все текстовое содержимое было токенизировано с помощью Tokenizer от Keras. Вот что я получаю после токенизации текстов из Gitanjali.

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

max_sequence_len = max([len(x) для x в input_sequences])
input_sequences = np.array(pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre'))

Наконец, мы хотим предсказать, какие слова будут наиболее вероятными для данной последовательности. Это можно сделать с помощью keras categorical.

ys = tf.keras.utils.to_categorical (метки, num_classes = total_words)

Моделирование:

Итак, теперь у нас есть все наши функции и метки. Давайте построим модель. Это последовательная модель. Мы рассмотрим LSTM, как мы можем использовать это для генерации текста. Это довольно просто. Сначала мы должны определить, что нам нужен слой стиля LSTM. Он принимает числовой параметр (для этого я использовал 150) для скрытого слоя внутри него, и мы хотим, чтобы он был двунаправленным. Это будет просматривать предложения вперед и назад и изучать лучшие параметры для каждого, а затем объединять их. LSTM может принимать множество параметров, если вы быстро просмотрите сводку модели, вы можете это проверить.

model = Sequential()
model.add(Embedding(total_words, 100, input_length=max_sequence_len-1))
model.add(Двунаправленный(LSTM(150)))
model.add( Плотность (всего_слов, активация = 'softmax'))

Здесь во встраивании total_words — это количество уникальных слов в корпусе, 100 — это количество измерений, а input_length — это максимальная последовательность минус 1, потому что наше конечное значение — это метка. Наконец, наш вывод Dense с общим количеством слов.

Обучение:

И давайте определим функции потерь и оптимизатор. Поскольку это категориальное, мы определили категориальные функции потерь.

Я тренировал свою модель на 1000 эпох, чтобы достичь точности около 92%. К счастью, Google выделил мне хорошую машину, когда я использовал GPU в Google Cola, поэтому время обучения было намного меньше (менее 1,5 часов).

adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', оптимизатор=adam, metrics=['accuracy'])
history = model.fit(xs, ys, epochs= 1000, подробно=1)

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

model.save('sequential_gitanjali.model')

Создание текста:

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

Исходные данные — На берегу бесконечных миров (это один из исходных исходных текстов главы книги)

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

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

И это оригинальная глава.

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

Находите ли вы какое-либо сходство в этих двух наборах текстов?

С заданным входом от моей мысли (думая стать поэтом) я получил следующий текст.

Мои крылья жаждут полета

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

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

Вы можете просмотреть весь код и ввести его в github.