Лабораторная работа №7 ИБД
.docxМинистерство цифрового развития, связи и массовых коммуникаций Российской Федерации
Ордена Трудового Красного Знамени
федеральное государственное бюджетное образовательное учреждение высшего образования
«Московский технический университет связи и информатики»
(МТУСИ)
Кафедра Сетевых Информационных Технологий и Сервисов
Лабораторная работа № 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. Выводы
В ходе лабораторной работы использовали генерацию текста посредством нейросетевых методов на основе данных о рассматриваемой предметной области.