Добавил:
Developer Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №7 ИБД

.docx
Скачиваний:
17
Добавлен:
04.06.2023
Размер:
166.67 Кб
Скачать

Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации

Ордена Трудового Красного Знамени

федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»

(МТУСИ)

Кафедра Сетевых Информационных Технологий и Сервисов

Лабораторная работа № 7

по дисциплине: «Интеллектуальные базы данных»

по теме:

«Генерация текста посредством нейросетевых методов на основе данных о рассматриваемой предметной области»

Вариант №5

Выполнил: студент группы МБТС0000

Иванов Иван Иванович

Проверил:

Кандидат технических наук, доцент Фатхулин Тимур Джалиевич

Москва, 2024

1 Цель работы

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

2 Задание

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

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

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

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

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

3 Краткая теория

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

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

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

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

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

4. Выполнение лабораторной работы

Для исходного образца использована предметная область 5 варианта, описанная в №1 Лабораторной работе:

5. Ведение заказов. Компания занимается оптовой продажей различных товаров. Каждый из товаров характеризуется ценой, справочной информацией и признаком наличия или отсутствия доставки. В компанию обращаются заказчики. Для каждого из них в базе данных запоминаются стандартные данные (наименование, адрес, телефон, контактное лицо). По каждому заказу составляется документ, в котором наряду с заказчиком фиксируются количество купленного им товара и дата покупки. Доставка товаров может производиться способами, различными по цене и скорости. Нужно хранить информацию о том, какими способами может осуществляться доставка каждого товара, и информацию о том, какой вид доставки (и какую стоимость доставки) выбрал клиент при заключении сделки

Данный текст был переведёт на английский язык и записан в файл wonderland.txt .

Рисунок 1 – Предметная область введения заказов, записанная в файл wonderland.txt

Для выполнения данной лабораторной работы потребуются библиотеки 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 = 500

FILE_PATH = "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))

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)

Рисунок 2 - Статистическая информацию о наборе данных

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])

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

for char in char_dataset.take(8):

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

Рисунок 3 - Проверяем корректность, выведя первые символы

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()]))

Рисунок 4 – Вывод исходного образца

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)

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")

Рисунок 5 – Вывод первых двух образцов данных вместе с их формами

4.1 Построение модели

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

model = Sequential([

LSTM(256, input_shape=(sequence_length, n_unique_chars), return_sequences=True),

Dropout(0.3),

LSTM(256),

Dense(n_unique_chars, activation="softmax"),])

model_weights_path = f"results/{BASENAME}-{sequence_length}.h5"

model.summary()

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Рисунок 6 – Модель

4.2 Обучение модели

if not os.path.isdir("results"):

os.mkdir("results")

model.fit(ds, steps_per_epoch=(len(encoded_text) - sequence_length) // BATCH_SIZE, epochs=EPOCHS)

model.save(model_weights_path)

Рисунок 7 – Обучение нейронной сети (Использовалось 500 эпох)

seed = "the company is engaged"

char2int = pickle.load(open(f"{BASENAME}-char2int.pickle", "rb"))

int2char = pickle.load(open(f"{BASENAME}-int2char.pickle", "rb"))

vocab_size = len(char2int)

model = Sequential([

LSTM(256, input_shape=(sequence_length, vocab_size), return_sequences=True),

Dropout(0.3),

LSTM(256),

Dense(vocab_size, activation="softmax"),

])

model.load_weights(f"results/{BASENAME}-{sequence_length}.h5")

s = seed

n_chars = 400

generated = ""

for i in tqdm.tqdm(range(n_chars), "Generating text"):

X = np.zeros((1, sequence_length, vocab_size))

for t, char in enumerate(seed):

X[0, (sequence_length - len(seed)) + t, char2int[char]] = 1

predicted = model.predict(X, verbose=0)[0]

next_index = np.argmax(predicted)

next_char = int2char[next_index]

generated += next_char

seed = seed[1:] + next_char

print("Seed:", s)

print("Generated text:")

print(generated)

Рисунок 8 – Вывод сгенерированного текста

5. Выводы

В ходе лабораторной работы использовали генерацию текста посредством нейросетевых методов на основе данных о рассматриваемой предметной области.