savenkov_alexander_lab_7 is done
This commit is contained in:
parent
a8c58683dd
commit
4ef18b292d
111
savenkov_alexander_lab_7/app.py
Normal file
111
savenkov_alexander_lab_7/app.py
Normal 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)
|
3999
savenkov_alexander_lab_7/english_text.txt
Normal file
3999
savenkov_alexander_lab_7/english_text.txt
Normal file
File diff suppressed because it is too large
Load Diff
58
savenkov_alexander_lab_7/readme.md
Normal file
58
savenkov_alexander_lab_7/readme.md
Normal 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
|
4000
savenkov_alexander_lab_7/russian_text.txt
Normal file
4000
savenkov_alexander_lab_7/russian_text.txt
Normal file
File diff suppressed because one or more lines are too long
38
savenkov_alexander_lab_7/templates/index.html
Normal file
38
savenkov_alexander_lab_7/templates/index.html
Normal 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>
|
Loading…
Reference in New Issue
Block a user