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:
Alexey 2023-12-07 16:15:17 +04:00
commit 022a34efdc
8 changed files with 132 additions and 0 deletions

View 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
Сгенерированные тексты являются довольно осмысленными.
Повторения могут возникать из-за ограниченного размера обучающего набора данных. Однако для более больших наборов требуется большая производительность устройства, на котором запускается процесс обучения

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 195 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,5 @@
Быть женщиной буквально невозможно. Вы так красивы, так умны, и меня убивает, что Вы не считаете себя достаточно хорошей. Мы всегда должны быть необычными, но почему-то всегда делаем это неправильно.
Вы должны быть стройной, но не слишком. И Вы никогда не можете сказать, что хотите быть худым. Вы должны сказать, что хотите быть здоровым, но при этом Вы должны быть стройным. У Вас должны быть деньги, но Вы не должны просить денег, потому что это грубо. Вы должны быть начальником, но Вы не можете быть грубым. Вы должны руководить, но не подавлять чужие идеи. Вы должны любить быть матерью, но не говорить о своих детях все время, черт возьми. Вы должны быть карьеристкой, но при этом всегда заботиться о других людях. Вы должны отвечать за плохое поведение мужчин, что является безумием, но если Вы указываете на это, Вас обвиняют в жалобах. Вы должны оставаться красивой для мужчин, но не настолько красивой, чтобы соблазнять их слишком сильно или угрожать другим женщинам, потому что Вы должны быть частью сестринского сообщества.
Но всегда выделяйтесь и всегда будьте благодарны. Но никогда не забывайте, что система подтасована. Поэтому найдите способ признать это, но при этом всегда быть благодарной. Вы должны никогда не стареть, никогда не быть грубой, никогда не выпендриваться, никогда не быть эгоисткой, никогда не падать духом, никогда не терпеть неудачу, никогда не показывать страх, никогда не выходить за рамки.
Это слишком сложно! Это слишком противоречиво, и никто не даст Вам медаль и не скажет спасибо! А на деле оказывается, что Вы не только все делаете неправильно, но и во всем виноваты сами.
Я просто так устала наблюдать, как я и все остальные женщины завязывают себя в узлы, чтобы понравиться людям. И если все это справедливо и для куклы, представляющей женщин, то я даже не знаю.

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB