Merge pull request 'shestakova_maria_lab_7' (#226) from shestakova_maria_lab_7 into main
Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/226
This commit is contained in:
commit
022a34efdc
33
shestakova_maria_lab_7/README.md
Normal file
33
shestakova_maria_lab_7/README.md
Normal file
@ -0,0 +1,33 @@
|
||||
### Задание:
|
||||
|
||||
Выбрать русскоязычный и англоязычный художественный текст и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. Подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату.
|
||||
|
||||
### Технологии:
|
||||
|
||||
Библиотека keras, библиотека numpy
|
||||
|
||||
### Что делает лабораторная:
|
||||
|
||||
Лабораторная работа создает и тренирует две рекуррентные нейронные сети для генерации текста на русском и английском языках.
|
||||
|
||||
### Как запустить:
|
||||
|
||||
Лабораторная работа запускается в файле `shestakova_maria_lab_7.py` через Run: появляется вывод в консоли
|
||||
|
||||
### Вывод:
|
||||
|
||||
Консоль:
|
||||
|
||||
![начало](start.png)
|
||||
![конец](finish.png)
|
||||
![русский текст](rus.png)
|
||||
![английский текст](eng.png)
|
||||
|
||||
Сгенерированный текст:
|
||||
|
||||
Русский: Я устала наблюдать как я и все остальные женщины завязывают себя в узлы чтобы понравиться людям и если все это справедливо и для куклы представляющей женщин то я даже не знаю знаю знаю знаю знаю знаю неправильно но не всем виноваты сами сами сами и во всем виноваты сами сами сами я
|
||||
|
||||
Английский: I'm tired of watching myself and every single other woman tie herself into knots so that people will like us and if all of that is also true for a doll just representing women then i don't even know know know know know know even know know part of the sisterhood even
|
||||
|
||||
Сгенерированные тексты являются довольно осмысленными.
|
||||
Повторения могут возникать из-за ограниченного размера обучающего набора данных. Однако для более больших наборов требуется большая производительность устройства, на котором запускается процесс обучения
|
BIN
shestakova_maria_lab_7/eng.png
Normal file
BIN
shestakova_maria_lab_7/eng.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
6
shestakova_maria_lab_7/eng.txt
Normal file
6
shestakova_maria_lab_7/eng.txt
Normal file
@ -0,0 +1,6 @@
|
||||
It is literally impossible to be a woman. You are so beautiful, and so smart, and it kills me that you don't think you're good enough. Like, we have to always be extraordinary, but somehow we're always doing it wrong.
|
||||
You have to be thin, but not too thin. And you can never say you want to be thin. You have to say you want to be healthy, but also you have to be thin. You have to have money, but you can't ask for money because that's crass. You have to be a boss, but you can't be mean. You have to lead, but you can't squash other people's ideas. You're supposed to love being a mother, but don't talk about your kids all the damn time. You have to be a career woman but also always be looking out for other people.
|
||||
You have to answer for men's bad behavior, which is insane, but if you point that out, you're accused of complaining. You're supposed to stay pretty for men, but not so pretty that you tempt them too much or that you threaten other women because you're supposed to be a part of the sisterhood.
|
||||
But always stand out and always be grateful. But never forget that the system is rigged. So find a way to acknowledge that but also always be grateful.
|
||||
You have to never get old, never be rude, never show off, never be selfish, never fall down, never fail, never show fear, never get out of line. It's too hard! It's too contradictory and nobody gives you a medal or says thank you! And it turns out in fact that not only are you doing everything wrong, but also everything is your fault.
|
||||
I'm just so tired of watching myself and every single other woman tie herself into knots so that people will like us. And if all of that is also true for a doll just representing women, then I don't even know.
|
BIN
shestakova_maria_lab_7/finish.png
Normal file
BIN
shestakova_maria_lab_7/finish.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 195 KiB |
BIN
shestakova_maria_lab_7/rus.png
Normal file
BIN
shestakova_maria_lab_7/rus.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
5
shestakova_maria_lab_7/rus.txt
Normal file
5
shestakova_maria_lab_7/rus.txt
Normal file
@ -0,0 +1,5 @@
|
||||
Быть женщиной буквально невозможно. Вы так красивы, так умны, и меня убивает, что Вы не считаете себя достаточно хорошей. Мы всегда должны быть необычными, но почему-то всегда делаем это неправильно.
|
||||
Вы должны быть стройной, но не слишком. И Вы никогда не можете сказать, что хотите быть худым. Вы должны сказать, что хотите быть здоровым, но при этом Вы должны быть стройным. У Вас должны быть деньги, но Вы не должны просить денег, потому что это грубо. Вы должны быть начальником, но Вы не можете быть грубым. Вы должны руководить, но не подавлять чужие идеи. Вы должны любить быть матерью, но не говорить о своих детях все время, черт возьми. Вы должны быть карьеристкой, но при этом всегда заботиться о других людях. Вы должны отвечать за плохое поведение мужчин, что является безумием, но если Вы указываете на это, Вас обвиняют в жалобах. Вы должны оставаться красивой для мужчин, но не настолько красивой, чтобы соблазнять их слишком сильно или угрожать другим женщинам, потому что Вы должны быть частью сестринского сообщества.
|
||||
Но всегда выделяйтесь и всегда будьте благодарны. Но никогда не забывайте, что система подтасована. Поэтому найдите способ признать это, но при этом всегда быть благодарной. Вы должны никогда не стареть, никогда не быть грубой, никогда не выпендриваться, никогда не быть эгоисткой, никогда не падать духом, никогда не терпеть неудачу, никогда не показывать страх, никогда не выходить за рамки.
|
||||
Это слишком сложно! Это слишком противоречиво, и никто не даст Вам медаль и не скажет спасибо! А на деле оказывается, что Вы не только все делаете неправильно, но и во всем виноваты сами.
|
||||
Я просто так устала наблюдать, как я и все остальные женщины завязывают себя в узлы, чтобы понравиться людям. И если все это справедливо и для куклы, представляющей женщин, то я даже не знаю.
|
88
shestakova_maria_lab_7/shestakova_maria_lab_7.py
Normal file
88
shestakova_maria_lab_7/shestakova_maria_lab_7.py
Normal file
@ -0,0 +1,88 @@
|
||||
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 file1:
|
||||
text = file1.read()
|
||||
with open('eng.txt', 'r', encoding='utf-8') as file2:
|
||||
eng_text = file2.read()
|
||||
|
||||
# Создание объектов Tokenizer для обработки текста на русском и английском языках
|
||||
tokenizer_rus = Tokenizer()
|
||||
tokenizer_rus.fit_on_texts([text])
|
||||
total_words_rus = len(tokenizer_rus.word_index) + 1
|
||||
|
||||
tokenizer_eng = Tokenizer()
|
||||
tokenizer_eng.fit_on_texts([eng_text])
|
||||
total_words_eng = len(tokenizer_eng.word_index) + 1
|
||||
|
||||
# rus
|
||||
input_sequences = []
|
||||
for line in text.split('\n'):
|
||||
# Преобрахование текста в последовательности чисел
|
||||
token_list = tokenizer_rus.texts_to_sequences([line])[0]
|
||||
# Создает последовательности для обучения модели, добавляя по одному слову на каждой итерации цикла
|
||||
for i in range(1, len(token_list)):
|
||||
n_gr_sequence = token_list[:i + 1]
|
||||
input_sequences.append(n_gr_sequence)
|
||||
|
||||
max_sequence_length_rus = max([len(x) for x in input_sequences])
|
||||
# Вычисление максимальной длины последовательности и приведение всей последовательности к одной длине
|
||||
input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length_rus, 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_gr_sequence = token_list[:i + 1]
|
||||
input_sequences_eng.append(n_gr_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) с использованием слоев Embedding, LSTM и Dense
|
||||
model_rus = Sequential()
|
||||
model_rus.add(Embedding(total_words_rus, 100, input_length=max_sequence_length_rus - 1))
|
||||
model_rus.add(LSTM(150))
|
||||
model_rus.add(Dense(total_words_rus, activation='softmax'))
|
||||
model_rus.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
|
||||
|
||||
# Обучение модели
|
||||
model_rus.fit(predictors, labels, epochs=150, verbose=1)
|
||||
|
||||
# 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'])
|
||||
|
||||
model_eng.fit(predictors_eng, labels_eng, epochs=100, verbose=1)
|
||||
|
||||
# Генерация текста
|
||||
def generate_text(seed_text, next_words, model_rus, max_sequence_length_rus, tokenizer_rus):
|
||||
for _ in range(next_words):
|
||||
token_list = tokenizer_rus.texts_to_sequences([seed_text])[0]
|
||||
token_list = pad_sequences([token_list], maxlen=max_sequence_length_rus - 1, padding='pre')
|
||||
predicted = np.argmax(model_rus.predict(token_list), axis=-1)
|
||||
output_word = ""
|
||||
for word, index in tokenizer_rus.word_index.items():
|
||||
if index == predicted:
|
||||
output_word = word
|
||||
break
|
||||
seed_text += " " + output_word
|
||||
return seed_text
|
||||
|
||||
|
||||
generated_text_rus = generate_text("Я устала", 50, model_rus, max_sequence_length_rus, tokenizer_rus)
|
||||
print(generated_text_rus)
|
||||
|
||||
generated_text_eng = generate_text("I'm tired", 50, model_eng, max_sequence_length_eng, tokenizer_eng)
|
||||
print(generated_text_eng)
|
BIN
shestakova_maria_lab_7/start.png
Normal file
BIN
shestakova_maria_lab_7/start.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 111 KiB |
Loading…
Reference in New Issue
Block a user