almukhammetov_bulat_lab_7

This commit is contained in:
BulatReznik 2023-12-02 11:45:17 +04:00
parent a8c58683dd
commit 132834e075
2 changed files with 125 additions and 0 deletions

View File

@ -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
Выводы:
Результаты генерации текстов на русском и английском языках демонстрируют, что обученные модели способны создавать относительно осмысленные последовательности слов, на английском языке текст получился лучше, возможно следует выбрать другие художественные тексты на русском языке для обучения модели.

View File

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