Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методички для лабораторных / Лабораторная работа №7 методичка.docx
Скачиваний:
26
Добавлен:
04.06.2023
Размер:
56.07 Кб
Скачать

Лабораторная работа № 7 Генерация текста посредством нейросетевых методов на основе данных о рассматриваемой предметной области Теоретические сведения

С помощью нейросетевых методов должен быть сгенерирован текст на основе данных из рассматриваемой предметной области. Генерация текста будет производиться на языке программирования Python с использованием рекуррентных нейронных сетей, в частности, будут использоваться сети с долгой краткосрочной памятью (LSTM – Long short-term memory), а также библиотеки TensorFlow и Keras.

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

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

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

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

Цель работы

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

Задание

При выполнении лабораторной работы необходимо:

  • ознакомиться с библиотеками TensorFlow и Keras;

  • для своего варианта сделать описание предметной области в текстовом представлении;

  • с помощью библиотек TensorFlow и Keras произвести генерацию текста на основе описания предметной области;

  • составить отчет по лабораторной работе.

Пример выполнения работы

Для выполнения данной лабораторной работы потребуются библиотеки TensorFlow и Keras. При работе в Google Colab нет необходимости в установке данных библиотек, они уже установлены в данной среде. Для дальнейшей работы их нужно просто импортировать:

import tensorflow as tf

import numpy as np

import os

import pickle

import tqdm

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import Dense, LSTM, Dropout

from string import punctuation

Для начала нужно определить параметры модели и очистить набор данных, удалив символы верхнего регистра и знаки препинания, что позволит сократить словарный запас для более эффективного и быстрого обучения:

sequence_length = 100

BATCH_SIZE = 128

EPOCHS = 50

FILE_PATH = "data/wonderland.txt"

BASENAME = os.path.basename(FILE_PATH)

text = open(FILE_PATH, encoding="utf-8").read()

text = text.lower()

text = text.translate(str.maketrans("", "", punctuation))

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

Далее необходимо вывести статистическую информацию о наборе данных:

n_chars = len(text)

vocab = ''.join(sorted(set(text)))

print("unique_chars:", vocab)

n_unique_chars = len(vocab)

print("Number of characters:", n_chars)

print("Number of unique characters:", n_unique_chars)

Вывод:

unique_chars:

abcdefghiklmnopqrstuvwxyz

Number of characters: 1409

Number of unique characters: 27

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

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

char2int = {c: i for i, c in enumerate(vocab)}

int2char = {i: c for i, c in enumerate(vocab)}

Далее их нужно сохранить в файлы, чтобы получить данные из словарей при генерации текста:

pickle.dump(char2int, open(f"{BASENAME}-char2int.pickle", "wb"))

pickle.dump(int2char, open(f"{BASENAME}-int2char.pickle", "wb"))

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

encoded_text = np.array([char2int[c] for c in text])

Поскольку код будет масштабироваться для больших наборов данных, нужно использовать модуль tf.data данный модуль содержит коллекцию классов, которые позволяют легко загружать данные, манипулировать ими и направлять их в модель. Для эффективной обработки набора данных необходимо создать tf.data.Dataset в массиве encoded_text:

char_dataset = tf.data.Dataset.from_tensor_slices(encoded_text)

Теперь char_dataset содержит все символы этого набора данных. Проверяем корректность, выведя первые символы:

for char in char_dataset.take(8):

print(char.numpy(), int2char[char.numpy()])

Вывод:

15 o

14 n

6 e

1

15 o

7 f

1

20 t

Далее необходимо построить последовательности так, чтобы каждый входной образец представлял собой последовательность символов длины sequence_length и вывод одного символа, который является последующим. Для этого можно использовать tf.data.Dataset's batch() – метод сбора символов:

sequences = char_dataset.batch(2*sequence_length + 1, drop_remainder=True)

for sequence in sequences.take(2):

print(''.join([int2char[i] for i in sequence.numpy()]))

Вывод:

one of the urgent problems of any kind of human activity is the problem of processing an increasing flow of information

a promising way to solve this problem is to automate work with information in par

ticular the creation of computer databases that allow storing systematizing and processing data

a hospital is an organization that works with a very large amount of information both about employees and

Теперь мы знаем, как представлен каждый образец. Нужно подготовить входные данные и целевые значения, для этого нужен способ преобразования одного образца (последовательности символов) в несколько (входных, целевых) образцов. Метод flat_map() – принимает функцию callback, которая перебирает все выборки данных:

def split_sample(sample):

ds = tf.data.Dataset.from_tensors((sample[:sequence_length], sample[sequence_length]))

for i in range(1, (len(sample)-1) // 2):

input_ = sample[i: i+sequence_length]

target = sample[i+sequence_length]

other_ds = tf.data.Dataset.from_tensors((input_, target))

ds = ds.concatenate(other_ds)

return ds

# prepare inputs and targets

dataset = sequences.flat_map(split_sample)

После того, как мы сконструировали наши образцы, нужно закодировать как входные данные, так и метки (целевые объекты):

def one_hot_samples(input_, target):

return tf.one_hot(input_, n_unique_chars), tf.one_hot(target, n_unique_chars)

dataset = dataset.map(one_hot_samples)

Здесь был использован метод map() для однократного кодирования каждого образца в наборе данных. Далее нужно осуществить вывод первых двух образцов данных вместе с их формами:

for element in dataset.take(2):

print("Input:", ''.join([int2char[np.argmax(char_vector)] for char_vector in element[0].numpy()]))

print("Target:", int2char[np.argmax(element[1].numpy())])

print("Input shape:", element[0].shape)

print("Target shape:", element[1].shape)

print("="*50, "\n")

Вывод:

Input: one of the urgent problems of any kind of human activity is the problem of processing an increasing

Target: f

Input shape: (100, 27)

Target shape: (27,)

Далее необходимо записать набор данных:

ds = dataset.repeat().shuffle(1024).batch(BATCH_SIZE, drop_remainder=True)