Merge pull request 'savenkov_alexander_lab_7 is done' (#171) from savenkov_alexander_lab_7 into main

Reviewed-on: http://student.git.athene.tech/Alexey/IIS_2023_1/pulls/171
This commit is contained in:
Alexey 2023-12-07 16:25:39 +04:00
commit f2c100ae07
5 changed files with 8206 additions and 0 deletions

View File

@ -0,0 +1,111 @@
from flask import Flask, render_template, request
from keras.models import Sequential
from keras.layers import LSTM, Dense, Embedding
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
import numpy as np
app = Flask(__name__)
def load_text_data(file_path):
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read().lower()
return text
def create_sequences(text, sequence_length=100):
sequences = []
for i in range(sequence_length, len(text)):
seq = text[i - sequence_length:i + 1]
sequences.append(seq)
return sequences
def prepare_data(sequences):
input_sequences = []
output_sequences = []
for sequence in sequences:
if len(sequence) > 1:
input_seq = sequence[:-1]
output_seq = sequence[-1]
input_sequences.append(input_seq)
output_sequences.append(output_seq)
x = np.array(input_sequences)
y = np.array(output_sequences)
return x, y
def build_model(total_words):
model = Sequential()
model.add(Embedding(total_words, 50, input_length=100, trainable=True))
model.add(LSTM(100, return_sequences=True))
model.add(LSTM(100))
model.add(Dense(100, activation='relu'))
model.add(Dense(total_words, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
return model
def generate_text(seed_text, model, tokenizer, max_sequence_len=100, temperature=1.0):
for _ in range(max_sequence_len):
token_list = tokenizer.texts_to_sequences([seed_text])[0]
token_list = pad_sequences([token_list], maxlen=100, padding='pre', truncating='post')[0]
predicted_probs = model.predict(np.array([token_list]), verbose=0)[0]
# Нормализация вероятностей
predicted_probs = np.array(predicted_probs).astype('float64')
predicted_probs /= np.sum(predicted_probs)
# Проверка на temperature не равное 0
if temperature != 0:
predicted_id = np.argmax(np.random.multinomial(1, predicted_probs, 1))
else:
predicted_id = np.argmax(predicted_probs)
output_word = tokenizer.index_word[predicted_id]
seed_text += " " + output_word
return seed_text
# Загрузка русского текста
russian_text = load_text_data('russian_text.txt')
tokenizer_russian = Tokenizer()
tokenizer_russian.fit_on_texts([russian_text])
total_words_russian = len(tokenizer_russian.word_index) + 1
# Создание последовательных последовательностей для русского текста
russian_sequences = create_sequences(tokenizer_russian.texts_to_sequences([russian_text])[0])
russian_x, russian_y = prepare_data(russian_sequences)
# Построение и обучение модели для русского текста
model_russian = build_model(total_words_russian)
model_russian.fit(russian_x, russian_y, epochs=5, batch_size=32)
# Загрузка английского текста
english_text = load_text_data('english_text.txt')
tokenizer_english = Tokenizer()
tokenizer_english.fit_on_texts([english_text])
total_words_english = len(tokenizer_english.word_index) + 1
# Создание последовательных последовательностей для английского текста
english_sequences = create_sequences(tokenizer_english.texts_to_sequences([english_text])[0])
english_x, english_y = prepare_data(english_sequences)
# Построение и обучение модели для английского текста
model_english = build_model(total_words_english)
model_english.fit(english_x, english_y, epochs=5, batch_size=32)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/generate', methods=['POST'])
def generate():
seed_text = request.form['seed_text']
language = request.form['language']
temperature = float(request.form['temperature'])
if language == 'russian':
generated_text = generate_text(seed_text, model_russian, tokenizer_russian, temperature=temperature)
else:
generated_text = generate_text(seed_text, model_english, tokenizer_english, temperature=temperature)
return render_template('index.html', seed_text=seed_text, generated_text=generated_text)
if __name__ == '__main__':
app.run(debug=True)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,58 @@
Общее задание:
Выбрать художественный текст (четные варианты русскоязычный, нечетные англоязычный) и обучить на нем рекуррентную нейронную сеть
для решения задачи генерации. Подобрать архитектуру и параметры так,чтобы приблизиться к максимально осмысленному результату. Далее
разбиться на пары четный-нечетный вариант, обменяться разработанными сетями и проверить, как архитектура товарища справляется с вашим текстом. В завершении подобрать компромиссную архитектуру, справляющуюся достаточно хорошо с обоими видами текстов.
Задание по вариантам:
у меня четный вариант, художественным текстом был выбран фрагмент произведения "Преступление и наказание"
После завершении проверки и работы с русскоязычным текстом, проверил свою архитектуру на англоязычном, работает правильно
Но я решил реадизовать, чтобы можно было генерировать и русский текст и английски обучая на русскоязычном художественном тексте и англоязычном для англоязычного был выбран фрагмент произведения "Шерлока Холмса" А.К. Дойля
Запуск приложения осуществляется запуском файла app.py
Использованные технологии:
Среда программирования Pycharm
Версия языка python: 3.11
Flask: Flask - это веб-фреймворк для Python, который используется для создания веб-приложений. Он предоставляет простой способ организации веб-приложения и обработки HTTP-запросов.
Keras: Keras - высокоуровневый интерфейс для работы с нейронными сетями. Он предоставляет удобный способ определения, обучения и оценки моделей глубокого обучения.
LSTM (Long Short-Term Memory): LSTM - это тип рекуррентных нейронных сетей (RNN), который хорошо подходит для работы с последовательными данными, такими как текст. LSTM способен учитывать долгосрочные зависимости в последовательных данных.
Embedding Layer: Вложенный слой используется для отображения слов в векторы фиксированной размерности. Это часто используется в задачах обработки естественного языка (Natural Language Processing, NLP).
Tokenizer: Tokenizer - это инструмент для векторизации и предобработки текста. Он разбивает текст на токены и преобразует их в числовые последовательности.
numpy: Numpy - это библиотека для работы с многомерными массивами и математическими функциями. Она широко используется для эффективной работы с данными в Python.
HTML: HTML используется для создания шаблонов веб-страниц.
Краткое описание работы программы:
Загрузка данных: Русский и английский художественные тексты загружаются из файлов, затем производится токенизация для подготовки данных для обучения.
Обучение моделей: Две отдельные модели RNN (для русского и английского текстов) строятся с использованием библиотеки Keras. Обучение моделей происходит на подготовленных данных, где LSTM слои позволяют моделям учитывать последовательный характер текста.
Веб-интерфейс: Flask обеспечивает веб-интерфейс, где пользователь может ввести начальный текст ("Seed Text"), выбрать язык ("Language") и настроить параметры генерации, такие как температура ("Temperature").
Генерация текста: При отправке формы, введенный текст передается в соответствующую модель, и она генерирует последующий текст. Результат отображается на веб-странице для пользователя.
Повторение процесса: Пользователь может многократно использовать веб-интерфейс для генерации текста с различными входными данными и параметрами.
Пример входных данных:
4000 строк из произведения "Преступление и наказание" и 4000 строк из произведения "Шерлока Холмса" А.К. Дойля
для более правильного текста стоит увеличить количество эпох и размер текста на котором обучается, но это приведет к увеличения времени на обучение
Seed Text: 1)Преступление 2)Sherlok
Select Language: 1)Russian 2)English
Temperature: 1)0.5 2) 2.0
Пример выходных данных:
1)Преступление тут шел знаете он тоже в все становясь по другой мир у него лужин шаги были сдерживая большие везде я для извольте романыч а для… человек заборы взгляды все молодой собрал я был стыдился в припадочного он лба здесь и них прелестная распорядиться ли душевном батюшки к секущих послушайте и же даже себя да… внимания получишь… он к тебя алену с кармане обнажил вас прошу так его глянул мимо состоянии и хозяин и говорил отправился леший и единого не собственноручно да и правду в мою дверь на правде удовольствие хоть смотрите протянула ведут можешь он определенный вода сильнее
2)Sherlok away with the assistant soon staying swiftly which has die but it and possible with its air and the breath of his thumb he had find reading you quite away said you an young street mr to asked i bye by a visitor was can for louder i have returned as to the door of disguises my problems during i you not presume to be line to my cover let he came very i connection to they seemed to this sheet was really to not speak with their ferguson goes upon his view it has weak easier during a long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Text Generation App</title>
</head>
<body>
<h1>Text Generation App</h1>
<form action="/generate" method="post">
<label for="seed_text">Seed Text:</label>
<input type="text" name="seed_text" id="seed_text" required>
<label for="language">Select Language:</label>
<select name="language" id="language">
<option value="russian">Russian</option>
<option value="english">English</option>
</select>
<label for="temperature">Temperature:</label>
<input type="number" name="temperature" id="temperature" step="0.1" value="1.0" required>
<button type="submit">Generate Text</button>
</form>
{% if seed_text %}
<h2>Seed Text:</h2>
<p>{{ seed_text }}</p>
{% endif %}
{% if generated_text %}
<h2>Generated Text:</h2>
<p>{{ generated_text }}</p>
{% endif %}
</body>
</html>