zavrazhnova_svetlana_lab_7 is ready

This commit is contained in:
Svetlnkk 2023-10-27 22:44:30 +04:00
parent 9644582307
commit 78bec04c10
8 changed files with 134 additions and 0 deletions

View File

@ -0,0 +1,42 @@
# Задание
Выбрать художественный текст русскоязычный и англоязычный и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату
### Как запустить лабораторную работу:
ЛР запускается в файле zavrazhnova_svetlana_lab_7.py через Run, а затем в консоли должны появится вычисления
### Технологии
Библиотека Keras, которая используются для создания и тренировки рекуррентных нейронных сетей (RNN) с использованием LSTM-ячеек.
- Sequential: это класс из Keras, который представляет собой последовательную модель нейронной сети. Он позволяет добавлять слои один за другим для построения модели.
- Embedding: это слой встраивания, который используется для преобразования индексов слов в векторы низкой размерности. Он принимает в качестве входных данных целочисленные идентификаторы слов и выдает их векторное представление.
- LSTM: это слой с долгой краткосрочной памятью (LSTM), который является одним из типов рекуррентных слоев. LSTM позволяет модели учитывать долгосрочные зависимости в последовательностях данных.
- Dense: это полносвязный слой, который используется для прогнозирования следующего слова в тексте на основе предыдущих слов.
- Tokenizer: это класс для токенизации текста на отдельные слова или символы, а также для преобразования слов в числовые идентификаторы.
- pad_sequences: это функция, которая выполняет нормализацию длины последовательностей путем заполнения нулями или обрезки их до заданной длины.
### Что делает лабораторная:
Создаются и тренируются две рекуррентные нейронные сети (RNN) с долгой краткосрочной памятью (LSTM) для генерации текста на русском и английском языках.
В результате генерируется текст, основываясь на предсказаниях модели.
### Пример выходных значений:
Результаты вычислений для русскоязычного текста:
![rusRes1.png](rusRes1.png)
![rusRes2.png](rusRes2.png)
Получившийся текст:
"я живая один из экземпляров коллекции и когда пытаюсь трепыхать крылышками чтобы выбиться из ряда вон он испытывает ко мне глубочайшую ненависть надо быть мертвой наколотой на булавку всегда одинаковой всегда красивой радующей глаз он понимает что отчасти моя красота результат того что я живая но по настоящему живая я"
Вывод: очень осмысленный результат
Результаты вычислений для англоязычного текста:
![engRes1.png](engRes1.png)
![engRes2.png](engRes2.png)
Получившийся текст:
"I am alive is made of iron heavy carved from a single block he cannot be moved he cannot be persuaded once he showed me a vessel it's called the stainer it puts butterflies to sleep and here i am sitting in such a stainer beating my wings against the glass because it"
Вывод: смысл есть, но русскоязычный текст более осмысленный

View File

@ -0,0 +1,3 @@
I am one of the specimens in the collection. And when I try to flutter my little wings to break free from the line, he harbors the deepest hatred towards me. I must be dead, impaled on a pin, always the same, always beautiful, pleasing to the eye. He understands that part of my beauty is a result of being alive. But he doesn't truly want me to be alive. I must be alive, but as if I were dead. Today I felt this especially clearly. The fact that I am alive, not always the same, that I don't think like he does, that I can be in a bad mood - all of this starts to irritate him.
He is made of iron, heavy, carved from a single block. He cannot be moved. He cannot be persuaded. Once he showed me a vessel. It's called "the stainer". It puts butterflies to sleep. And here I am, sitting in such a stainer. Beating my wings against the glass. Because it is transparent, it seems to me that escape is possible. That there is hope. But it is all just an illusion.

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -0,0 +1,3 @@
Я один из экземпляров коллекции. И когда пытаюсь трепыхать крылышками, чтобы выбиться из ряда вон, он испытывает ко мне глубочайшую ненависть. Надо быть мертвой, наколотой на булавку, всегда одинаковой, всегда красивой, радующей глаз. Он понимает, что отчасти моя красота результат того, что я живая. Но по-настоящему живая я ему не нужна. Я должна быть живой, но как бы мертвой. Сегодня я почувствовала это особенно ясно. То, что я живая, не всегда одна и та же, думаю не так, как он, бываю в дурном настроении все это начинает его раздражать.
Он чугунный, тяжелый, из цельного куска. Его не сдвинуть. Не переубедить. Как-то он показал мне сосуд. Называется «морилка». Усыплять бабочек. Вот я и сижу в такой морилке. Бьюсь крыльями о стекло. Оттого, что оно прозрачно, мне кажется, что побег возможен. Что есть надежда. Только это всего лишь иллюзия.

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@ -0,0 +1,86 @@
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
with open('rus.txt', encoding='utf-8') as file:
text = file.read()
with open('eng.txt', 'r', encoding='utf-8') as f:
eng_text = f.read()
tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
total_words = len(tokenizer.word_index) + 1
tokenizer_eng = Tokenizer()
tokenizer_eng.fit_on_texts([eng_text])
total_words_eng = len(tokenizer_eng.word_index) + 1
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]
#eng
input_sequences_eng = []
for line in eng_text.split('\n'):
token_list = tokenizer_eng.texts_to_sequences([line])[0]
for i in range(1, len(token_list)):
n_gram_sequence = token_list[:i + 1]
input_sequences_eng.append(n_gram_sequence)
max_sequence_length_eng = max([len(x) for x in input_sequences_eng])
input_sequences_eng = pad_sequences(input_sequences_eng, maxlen=max_sequence_length_eng, padding='pre')
predictors_eng, labels_eng = input_sequences_eng[:, :-1], input_sequences_eng[:, -1]
# создание RNN модели
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'])
# тренировка модели
model.fit(predictors, labels, epochs=150, verbose=1)
# создание RNN модели eng
model_eng = Sequential()
model_eng.add(Embedding(total_words_eng, 100, input_length=max_sequence_length_eng - 1))
model_eng.add(LSTM(150))
model_eng.add(Dense(total_words_eng, activation='softmax'))
model_eng.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# тренировка модели eng
model_eng.fit(predictors_eng, labels_eng, epochs=150, verbose=1)
# генерация текста на основе модели
def generate_text(seed_text, next_words, model, max_sequence_length, tokenizer):
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
generated_text = generate_text("я живая", 50, model, max_sequence_length, tokenizer)
print(generated_text)
generated_text_eng = generate_text("I am alive", 50, model_eng, max_sequence_length_eng, tokenizer_eng)
print(generated_text_eng)