From 132834e075c9971f3295929c69fef2747e519079 Mon Sep 17 00:00:00 2001 From: BulatReznik <90419704+BulatReznik@users.noreply.github.com> Date: Sat, 2 Dec 2023 11:45:17 +0400 Subject: [PATCH] almukhammetov_bulat_lab_7 --- almukhammetov_bulat_lab_7/README.md | 36 ++++++++++++ almukhammetov_bulat_lab_7/lab7.py | 89 +++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 almukhammetov_bulat_lab_7/README.md create mode 100644 almukhammetov_bulat_lab_7/lab7.py diff --git a/almukhammetov_bulat_lab_7/README.md b/almukhammetov_bulat_lab_7/README.md new file mode 100644 index 0000000..92f9d3c --- /dev/null +++ b/almukhammetov_bulat_lab_7/README.md @@ -0,0 +1,36 @@ +Вариант 2 + +Задание: +Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться +к максимально осмысленному результату. Далее разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов. + +Данные: +Русский текст: Рассказ «Хлеб для собаки» - Владимир Тендряков +Английский текст: The Tell-Tale Heart - Edgar Allan Poe + +Запуск: +Запустите файл lab7.py + +Описание программы: +1. В начале программы задается функция `load_text(file_path)`, которая загружает текст из указанного файла с учетом кодировки UTF-8. +2. Функция `create_tokenizer(text)` создает токенизатор для обработки текста с использованием библиотеки Keras. +3. `generate_input_sequences(text, tokenizer)` генерирует входные последовательности для обучения модели, разбивая текст на n-граммы. +4. Создается рекуррентная нейронная сеть с использованием функции `create_model(total_words, max_sequence_length)`. +5. Модель содержит слои Embedding, LSTM и Dense, предназначенные для обработки последовательностей и генерации текста. +6. В функции `train_model(model, predictors, labels, epochs)` модель компилируется и обучается на входных последовательностях с заданным числом эпох. +7. После обучения модели используется функция `generate_text(seed_text, next_words, model, tokenizer, max_sequence_length)` для генерации текста на основе заданной начальной строки. +8. Программа предоставляет возможность генерации текста на основе обученной модели для продемонстрированного языка (русского или английского). +9. Загружаются тексты на разных языках (русском и английском), обучаются модели, генерируется текст, что позволяет проверить, как обученная модель справляется с текстом на другом языке. + +Результаты: + +Результат генерации на русском языке: + +Парень увидел собаку же куркули грызут кору ты жалеешь «если враг не сдается его уничтожают » а это «уничтожают» вот так наверное и должно выглядеть черепа с глазами слоновьи ноги пена из черного рта ты просто боишься смотреть правде в глаза и хрипом те который готов меня на пустыре возле единого на моих + +Результат генерации на английском языке: +Old man i kept quite still and said nothing for a whole hour i did not move a muscle and in the meantime i did not hear him lie down he was still sitting up in the bed listening just as i have done night after night hearkening to the death watches + +Выводы: + +Результаты генерации текстов на русском и английском языках демонстрируют, что обученные модели способны создавать относительно осмысленные последовательности слов, на английском языке текст получился лучше, возможно следует выбрать другие художественные тексты на русском языке для обучения модели. diff --git a/almukhammetov_bulat_lab_7/lab7.py b/almukhammetov_bulat_lab_7/lab7.py new file mode 100644 index 0000000..bae4996 --- /dev/null +++ b/almukhammetov_bulat_lab_7/lab7.py @@ -0,0 +1,89 @@ +# Выбрать художественный текст (четные варианты – русскоязычный, нечетные – англоязычный) и обучить на нем +# рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться +# к максимально осмысленному результату. Далее разбиться на пары четный-нечетный вариант, обменяться разработанными +# сетями и проверить, как архитектура товарища справляется с вашим текстом. В завершении подобрать компромиссную +# архитектуру, справляющуюся достаточно хорошо с обоими видами текстов. + +import numpy as np +from keras.models import Sequential +from keras.layers import Embedding, LSTM, Dense +from keras.preprocessing.text import Tokenizer +from keras.preprocessing.sequence import pad_sequences + +def load_text(file_path): + with open(file_path, encoding='utf-8') as file: + return file.read() + + +def create_tokenizer(text): + tokenizer = Tokenizer() + tokenizer.fit_on_texts([text]) + return tokenizer + + +def generate_input_sequences(text, tokenizer): + input_sequences = [] + for line in text.split('\n'): + token_list = tokenizer.texts_to_sequences([line])[0] + for i in range(1, len(token_list)): + n_gram_sequence = token_list[:i + 1] + input_sequences.append(n_gram_sequence) + + max_sequence_length = max([len(x) for x in input_sequences]) + input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length, padding='pre') + + predictors, labels = input_sequences[:, :-1], input_sequences[:, -1] + return predictors, labels, max_sequence_length + + +def create_model(total_words, max_sequence_length): + model = Sequential() + model.add(Embedding(total_words, 100, input_length=max_sequence_length - 1)) + model.add(LSTM(150)) + model.add(Dense(total_words, activation='softmax')) + + model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) + return model + + +def train_model(model, predictors, labels, epochs): + model.fit(predictors, labels, epochs=epochs, verbose=1) + + +def generate_text(seed_text, next_words, model, tokenizer, max_sequence_length): + for _ in range(next_words): + token_list = tokenizer.texts_to_sequences([seed_text])[0] + token_list = pad_sequences([token_list], maxlen=max_sequence_length - 1, padding='pre') + predicted = np.argmax(model.predict(token_list), axis=-1) + output_word = "" + for word, index in tokenizer.word_index.items(): + if index == predicted: + output_word = word + break + seed_text += " " + output_word + return seed_text + + +# Загрузка текста +#file_path = 'russian_text.txt' +file_path = 'english_text.txt' +text = load_text(file_path) + +# Создание токенизатора +tokenizer = create_tokenizer(text) +total_words = len(tokenizer.word_index) + 1 + +# Генерация входных последовательностей +predictors, labels, max_sequence_length = generate_input_sequences(text, tokenizer) + +# Создание модели +model = create_model(total_words, max_sequence_length) + +# Тренировка модели +train_model(model, predictors, labels, epochs=150) + +# Генерация текста +seed_text = "Old man" +next_words = 50 +generated_text = generate_text(seed_text, next_words, model, tokenizer, max_sequence_length) +print(generated_text)