Merge pull request 'zavrazhnova_svetlana_lab_7 is ready' (#99) from zavrazhnova_svetlana_lab_7 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/99
This commit is contained in:
commit
be253bf939
42
zavrazhnova_svetlana_lab_7/README.md
Normal file
42
zavrazhnova_svetlana_lab_7/README.md
Normal 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"
|
||||
|
||||
Вывод: смысл есть, но русскоязычный текст более осмысленный
|
3
zavrazhnova_svetlana_lab_7/eng.txt
Normal file
3
zavrazhnova_svetlana_lab_7/eng.txt
Normal 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.
|
BIN
zavrazhnova_svetlana_lab_7/engRes1.png
Normal file
BIN
zavrazhnova_svetlana_lab_7/engRes1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 62 KiB |
BIN
zavrazhnova_svetlana_lab_7/engRes2.png
Normal file
BIN
zavrazhnova_svetlana_lab_7/engRes2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 27 KiB |
3
zavrazhnova_svetlana_lab_7/rus.txt
Normal file
3
zavrazhnova_svetlana_lab_7/rus.txt
Normal file
@ -0,0 +1,3 @@
|
||||
Я – один из экземпляров коллекции. И когда пытаюсь трепыхать крылышками, чтобы выбиться из ряда вон, он испытывает ко мне глубочайшую ненависть. Надо быть мертвой, наколотой на булавку, всегда одинаковой, всегда красивой, радующей глаз. Он понимает, что отчасти моя красота – результат того, что я живая. Но по-настоящему живая я ему не нужна. Я должна быть живой, но как бы мертвой. Сегодня я почувствовала это особенно ясно. То, что я живая, не всегда одна и та же, думаю не так, как он, бываю в дурном настроении – все это начинает его раздражать.
|
||||
|
||||
Он – чугунный, тяжелый, из цельного куска. Его не сдвинуть. Не переубедить. Как-то он показал мне сосуд. Называется «морилка». Усыплять бабочек. Вот я и сижу в такой морилке. Бьюсь крыльями о стекло. Оттого, что оно прозрачно, мне кажется, что побег возможен. Что есть надежда. Только это всего лишь иллюзия.
|
BIN
zavrazhnova_svetlana_lab_7/rusRes1.png
Normal file
BIN
zavrazhnova_svetlana_lab_7/rusRes1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
BIN
zavrazhnova_svetlana_lab_7/rusRes2.png
Normal file
BIN
zavrazhnova_svetlana_lab_7/rusRes2.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 34 KiB |
86
zavrazhnova_svetlana_lab_7/zavrazhnova_svetlana_lab_7.py
Normal file
86
zavrazhnova_svetlana_lab_7/zavrazhnova_svetlana_lab_7.py
Normal 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)
|
Loading…
Reference in New Issue
Block a user