From ca2abe9bb4755d49cf51e43d11e27bdd2b524942 Mon Sep 17 00:00:00 2001 From: superhugebetformiladze Date: Thu, 30 Nov 2023 23:53:21 +0400 Subject: [PATCH] simonov_nikita_lab7 --- simonov_nikita_lab_7/eng.txt | 4 ++ simonov_nikita_lab_7/eng_generated.txt | 1 + simonov_nikita_lab_7/lab7.py | 72 +++++++++++++++++++++++ simonov_nikita_lab_7/readme.md | 81 ++++++++++++++++++++++++++ simonov_nikita_lab_7/rus.txt | 4 ++ simonov_nikita_lab_7/rus_generated.txt | 1 + 6 files changed, 163 insertions(+) create mode 100644 simonov_nikita_lab_7/eng.txt create mode 100644 simonov_nikita_lab_7/eng_generated.txt create mode 100644 simonov_nikita_lab_7/lab7.py create mode 100644 simonov_nikita_lab_7/readme.md create mode 100644 simonov_nikita_lab_7/rus.txt create mode 100644 simonov_nikita_lab_7/rus_generated.txt diff --git a/simonov_nikita_lab_7/eng.txt b/simonov_nikita_lab_7/eng.txt new file mode 100644 index 0000000..2c07298 --- /dev/null +++ b/simonov_nikita_lab_7/eng.txt @@ -0,0 +1,4 @@ +In a quiet town, where time flows slowly, each day begins with the soft light of the rising sun painting the sky in shades of pink and purple. +The locals are friendly, knowing each other by name. +Narrow streets are adorned with blooming flower beds, creating a sense of comfort and a unique atmosphere. +In the evening, residents gather at cafes to share impressions of the day and enjoy the warm ambiance. \ No newline at end of file diff --git a/simonov_nikita_lab_7/eng_generated.txt b/simonov_nikita_lab_7/eng_generated.txt new file mode 100644 index 0000000..5a3b69c --- /dev/null +++ b/simonov_nikita_lab_7/eng_generated.txt @@ -0,0 +1 @@ +In the a quiet town time flows slowly each day begins with the soft light of the rising sun painting the sky in shades of pink and purple the locals are friendly knowing each other by name narrow streets are adorned with blooming flower beds creating a sense of comfort and a unique atmosphere in the evening residents gather at cafes to share impressions of the day and enjoy the ambiance \ No newline at end of file diff --git a/simonov_nikita_lab_7/lab7.py b/simonov_nikita_lab_7/lab7.py new file mode 100644 index 0000000..ed266c0 --- /dev/null +++ b/simonov_nikita_lab_7/lab7.py @@ -0,0 +1,72 @@ +import numpy as np +from tensorflow import keras +from tensorflow.keras.preprocessing.text import Tokenizer +from tensorflow.keras.preprocessing.sequence import pad_sequences + +# функция подготовки текста, создания и тренировки модели +def train_model(file_path, epochs): + # cчитывание данных из файла + with open(file_path, encoding='utf-8') as f: + data = f.read() + + # создание токенизатора + tokenizer = Tokenizer() + tokenizer.fit_on_texts([data]) + + # преобразование текста в последовательности чисел + sequences = tokenizer.texts_to_sequences([data]) + + # создание обучающих данных + input_sequences = [] + for sequence in sequences: + for i in range(1, len(sequence)): + n_gram_sequence = sequence[:i+1] + input_sequences.append(n_gram_sequence) + + # предобработка для получения одинаковой длины последовательностей + max_sequence_len = max([len(sequence) for sequence in input_sequences]) + input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_len, padding='pre') + + # разделение на входные и выходные данные + x = input_sequences[:, :-1] + y = input_sequences[:, -1] + + # создание модели рекуррентной нейронной сети + model = keras.Sequential() + model.add(keras.layers.Embedding(len(tokenizer.word_index)+1, 100, input_length=max_sequence_len-1)) + model.add(keras.layers.Dropout(0.2)) + model.add(keras.layers.LSTM(150)) + model.add(keras.layers.Dense(len(tokenizer.word_index)+1, activation='softmax')) + + # компиляция и обучение модели + model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) + model.fit(x, y, epochs=epochs, verbose=1) + + return model, tokenizer, max_sequence_len + +# функция генерации текста +def generate_text(model, tokenizer, max_sequence_len, seed_text, next_words): + for _ in range(next_words): + token_list = tokenizer.texts_to_sequences([seed_text])[0] + token_list = pad_sequences([token_list], maxlen=max_sequence_len-1, padding='pre') + predicted = model.predict(token_list) + predict_index = np.argmax(predicted, axis=-1) + word = tokenizer.index_word.get(predict_index[0]) + seed_text += " " + word + + return seed_text + +# русский текст +model_rus, tokenizer_rus, max_sequence_len_rus = train_model('rus.txt', 150) +rus_text_generated = generate_text(model_rus, tokenizer_rus, max_sequence_len_rus, "В", 55) + +# английский текст +model_eng, tokenizer_eng, max_sequence_len_eng = train_model('eng.txt', 150) +eng_text_generated = generate_text(model_eng, tokenizer_eng, max_sequence_len_eng, "In the", 69) + +# Сохранение в файлы +with open('rus_generated.txt', 'w', encoding='utf-8') as f_rus: + f_rus.write(rus_text_generated) + +with open('eng_generated.txt', 'w', encoding='utf-8') as f_eng: + f_eng.write(eng_text_generated) diff --git a/simonov_nikita_lab_7/readme.md b/simonov_nikita_lab_7/readme.md new file mode 100644 index 0000000..d5efccb --- /dev/null +++ b/simonov_nikita_lab_7/readme.md @@ -0,0 +1,81 @@ +# Лабораторная работа №7 Вариант 25. + +## Задание + +Выбрать художественный текст (русскоязычный и англоязычный) и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. +Подобрать архитектуру, справляющуюся достаточно хорошо с обоими видами текстов, и параметры так, чтобы приблизиться к максимально осмысленному результату. + +## Содержание +- [Лабораторная работа №7 Вариант 25.](#лабораторная-работа-7-вариант-25) + - [Задание](#задание) + - [Содержание](#содержание) + - [Введение](#введение) + - [Зависимости](#зависимости) + - [Запуск приложения](#запуск-приложения) + - [Описание кода](#описание-кода) + - [Заключение](#заключение) + +## Введение + +Этот код создает и обучает рекуррентные нейронные сети для генерации текста на русском и английском языках. Он использует библиотеку TensorFlow и Keras для построения модели и обучения. + +## Зависимости + +Для работы этого приложения необходимы следующие библиотеки Python: + +- NumPy +- TensorFlow + + +Вы можете установить их с помощью pip: + +```bash +pip install numpy tensorflow +``` + +## Запуск приложения + +Чтобы запустить эту программу, выполните следующую команду: + +```bash +python lab7.py +``` +Результат выведется в файлы. + +## Описание кода + +1. Подготовка текста: + +- Текст читается из файла и токенизируется. +- Создаются обучающие данные с использованием n-грамм. +- Проводится предобработка для унификации длины последовательностей. + +2. Создание и обучение модели: + +- Создается рекуррентная нейронная сеть с использованием слоев Embedding, Dropout, LSTM и Dense. +- Модель компилируется с выбранными параметрами. +- Обучение модели на входных и выходных данных. + +3. Генерация текста: + +- Модель используется для предсказания следующего слова на основе введенного текста. +- Сгенерированный текст постепенно увеличивается, добавляя новые слова. +- Сохранение результатов: + +Сгенерированный текст сохраняется в новые файлы для дальнейшего использования или анализа. + +## Заключение + +После выполнения кода будут созданы два файла: + +- rus_generated.txt: Сгенерированный текст на русском языке. + +``` +В тихом городе городе время течет медленно медленно каждый день начинается с мягкого света восходящего солнца окрашивающего небо в оттенки розового и фиолетового местные жители приветливы и знают друг друга по именам узкие улочки украшены цветущими клумбами создавая уют и неповторимый колорит вечером в горожане собираются чтобы поделиться впечатлениями от прошедшего дня и насладиться теплой атмосферой +``` + +- eng_generated.txt: Сгенерированный текст на английском языке. + +``` +In the a quiet town time flows slowly each day begins with the soft light of the rising sun painting the sky in shades of pink and purple the locals are friendly knowing each other by name narrow streets are adorned with blooming flower beds creating a sense of comfort and a unique atmosphere in the evening residents gather at cafes to share impressions of the day and enjoy the ambiance +``` diff --git a/simonov_nikita_lab_7/rus.txt b/simonov_nikita_lab_7/rus.txt new file mode 100644 index 0000000..039bb83 --- /dev/null +++ b/simonov_nikita_lab_7/rus.txt @@ -0,0 +1,4 @@ +В тихом городе, где время течет медленно, каждый день начинается с мягкого света восходящего солнца, окрашивающего небо в оттенки розового и фиолетового. +Местные жители приветливы и знают друг друга по именам. +Узкие улочки украшены цветущими клумбами, создавая уют и неповторимый колорит. +Вечером в кафе горожане собираются, чтобы поделиться впечатлениями от прошедшего дня и насладиться теплой атмосферой. \ No newline at end of file diff --git a/simonov_nikita_lab_7/rus_generated.txt b/simonov_nikita_lab_7/rus_generated.txt new file mode 100644 index 0000000..6331c22 --- /dev/null +++ b/simonov_nikita_lab_7/rus_generated.txt @@ -0,0 +1 @@ +В тихом городе городе время течет медленно медленно каждый день начинается с мягкого света восходящего солнца окрашивающего небо в оттенки розового и фиолетового местные жители приветливы и знают друг друга по именам узкие улочки украшены цветущими клумбами создавая уют и неповторимый колорит вечером в горожане собираются чтобы поделиться впечатлениями от прошедшего дня и насладиться теплой атмосферой \ No newline at end of file