Spaces:
Running
Running
File size: 15,891 Bytes
2609fac 8cde930 2609fac 8cde930 2609fac 8cde930 2609fac 8cde930 2609fac 8cde930 2609fac 8cde930 2609fac 85c4b9b 2609fac 8cde930 2609fac 8cde930 2609fac 8cde930 2609fac 5864c0d 2609fac 8cde930 2609fac 85c4b9b 2609fac 8cde930 2609fac 8cde930 2609fac 85c4b9b 2609fac 8cde930 861e39c 2609fac 8cde930 2609fac |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 |
import datetime
import streamlit as st
from utilities_database.user_database_utils import load_user_tasks_data
from utilities_database.user_database_utils import save_data_in_database
from utilities_database.user_database_widgets import user_save_text_table
from utilities_database.user_database_utils import load_users_particular_task
# Interface
if st.session_state.get('-LOGGED_IN_BOOL-'):
st.set_page_config(page_title='GenLexTasks', layout="wide", page_icon=':es:')
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=False)
INSTRUCTION.markdown(
'**_I. Выберите режим работы._**'
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
'\n\n1. Придумайте **название** для файла с заданиями. '
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
' введенного Вами текста.'
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
' создать задания. '
'\n\n3. Укажите *способ выбора целевых слов*:'
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
' подборе дистракторов.'
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
' поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
'\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
'\n7. Выберите **способы вывода** готовых материалов.'
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
' которые Вы сохранили, языковой уровень и дата их создания.'
' Для загрузки определенного файла с заданиями:'
'\n1. Введите (или скопируйте из таблицы) название.'
'\n2. Укажите соответсвующий языковой уровень.'
'\n3. Нажмите на кнопку **"Загрузить"**.'
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
'\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
WHAT_TO_DO = st.radio(
label='**Выберите режим работы**',
options=[
'Создать новые задания',
'Загрузить задания из моего архива'],
key='-WHAT_TO_DO_MODE-',
horizontal=True)
if WHAT_TO_DO == 'Загрузить задания из моего архива':
LOAD_FORM = st.form('LOAD_FORM')
UPLOAD_CLOUD_USER_NAME = st.session_state.get('-USER_NAME-')
loaded_data = load_user_tasks_data(
user_task_database=user_save_text_table,
save_type='download',
creator_name=UPLOAD_CLOUD_USER_NAME)
LOAD_FORM.table(loaded_data)
COL1, COL2 = LOAD_FORM.columns([1, 1])
UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
with COL2:
UPLOAD_CLOUD_CEFR_LEVEL = st.selectbox(
label='Выберите языковой уровень',
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
index=None,
placeholder='-Выберите языковой уровень-')
st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
if LOAD_BUTTON:
if UPLOAD_CLOUD_USER_NAME in (None, '') or UPLOAD_CLOUD_FILE_NAME in (None, ''):
st.error('Вы не заполнили все поля')
st.stop()
__TASK_DATA__ = load_users_particular_task(
user_task_database=user_save_text_table,
load_mode='download',
creator_name=UPLOAD_CLOUD_USER_NAME,
save_name=UPLOAD_CLOUD_FILE_NAME,
cefr_level=UPLOAD_CLOUD_CEFR_LEVEL)
# In order to bypass further
st.session_state['UPLOAD_CLOUD_USER_NAME'] = UPLOAD_CLOUD_USER_NAME
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = UPLOAD_CLOUD_FILE_NAME
st.session_state['RESULT'] = __TASK_DATA__
st.session_state['-LOADED_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
st.session_state['-DISPLAY_READY-'] = True
st.session_state['-DISPLAY_VERSION-'] = True
st.session_state['-DOWNLOAD_VERSION-'] = True
st.session_state['-ONLINE_TEST_READY-'] = True
st.success('Данные загружены. Можете переходить на следующие страницы.')
else:
# Upload text form
FORM = st.form('CREATE_FORM')
USER__SAVE_IN_CLOUD_FILE_NAME = FORM.text_input(
'**Введите название**',
placeholder='Жду название',
key='-USER__SAVE_IN_CLOUD_FILE_NAME-')
UPLOAD_TEXT = FORM.text_area(
label='**Вставьте текст:**',
value='',
placeholder='Жду текст',
key='-USER_INPUT_TEXT-')
UPLOAD_FILE = FORM.file_uploader(
label='**Или выберите файл:**',
type='txt',
key='-USER_INPUT_FILE-')
TW_MODE_COL, DISTRACTOR_MODEL_COL = FORM.columns(2)
TARGET_WORDS_MODE = TW_MODE_COL.radio(
label='**Как выбирать целевые слова?**',
options=['Автоматически', 'Самостоятельно'],
key='-TARGET_WORDS_MODE-', horizontal=True)
DISTRACTOR_MODEL = DISTRACTOR_MODEL_COL.radio(
label='**Модель для выбора неправильных вариантов**',
options=['Модель-1', 'Модель-2', 'Модель-3'],
key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
with CEFR_NUM_DISTRACTORS_COL:
CEFR_TEXT_LEVEL = st.selectbox(
label='Выберите языковой уровень',
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
index=None,
placeholder='-Выберите языковой уровень-')
st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
label='**Выберите количество дистракторов в задании:**',
min_value=1,
max_value=9,
value=3,
key='-NUM_DISTRACTORS-')
TARGET_WORDS = UTW_COL.text_area(
label='**Если "Самостоятельно", введите целевые слова:**',
value='',
height=120,
placeholder='Через запятую',
key='-INPUT_TARGET_WORDS-')
FORM.markdown('**Выберите формат(-ы) вывода:**')
col1, col2, col3 = FORM.columns(3)
SAVE_IN_CLOUD = col1.checkbox(
label='**Сохранить в облаке**',
value=False,
key='-SAVE_IN_CLOUD-')
DOWNLOAD_VERSION = col2.checkbox(
label='**Скачать**',
value=False,
key='-DOWNLOAD_VERSION-')
ONLINE_TEST_VERSION = col3.checkbox(
label='**Онлайн тест**',
value=True,
key='-ONLINE_TEST_VERSION-')
START_COL, RERUN_COL, EXIT_COL = FORM.columns([1, 1, 1])
START_BUTTON = START_COL.form_submit_button(
label='**Запуск**',
use_container_width=True)
RERUN_BUTTON = RERUN_COL.form_submit_button(
label='**Перезагрузка**',
use_container_width=True)
EXIT_BUTTON = EXIT_COL.form_submit_button(
label='**Выход**',
use_container_width=True)
if START_BUTTON:
# Initiate interface structure
LOGS = st.status(label='Прогресс выполнения', expanded=True)
PROGRESS_BAR = LOGS.progress(0)
PROGRESS_BAR_DISTRACTORS = LOGS.progress(0)
# Start generation process. Everything happens inside main_workflow func
if DISTRACTOR_MODEL == 'Модель-3':
from utilities_language_bert.esp_main_workflow_bert import main_workflow
__TASK_DATA__ = main_workflow(
file=UPLOAD_FILE,
text=UPLOAD_TEXT,
logs=LOGS,
progress=PROGRESS_BAR,
progress_d=PROGRESS_BAR_DISTRACTORS,
level=CEFR_TEXT_LEVEL,
tw_mode_automatic_mode=TARGET_WORDS_MODE,
target_words=TARGET_WORDS,
num_distractors=NUMBER_DISTRACTORS,
save_name=USER__SAVE_IN_CLOUD_FILE_NAME)
else:
from utilities_language_w2v.esp_main_workflow_w2v import main_workflow
__TASK_DATA__ = main_workflow(
file=UPLOAD_FILE,
text=UPLOAD_TEXT,
logs=LOGS,
progress=PROGRESS_BAR,
progress_d=PROGRESS_BAR_DISTRACTORS,
level=CEFR_TEXT_LEVEL,
tw_mode_automatic_mode=TARGET_WORDS_MODE,
target_words=TARGET_WORDS,
num_distractors=NUMBER_DISTRACTORS,
save_name=USER__SAVE_IN_CLOUD_FILE_NAME,
model_name=DISTRACTOR_MODEL)
# In order to bypass further
USER__SAVE_IN_CLOUD_FILE_NAME = USER__SAVE_IN_CLOUD_FILE_NAME if USER__SAVE_IN_CLOUD_FILE_NAME != '' \
else __TASK_DATA__['name']
st.session_state['RESULT'] = __TASK_DATA__
st.session_state['-DISPLAY_READY-'] = True
st.session_state['-DISPLAY_VERSION-'] = True
st.session_state['-ONLINE_TEST_READY-'] = True
st.session_state['-LOADED_CEFR_LEVEL-'] = CEFR_TEXT_LEVEL
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
PROGRESS_BAR.progress(100)
PROGRESS_BAR_DISTRACTORS.progress(100)
LOGS.update(label='**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**',
state='complete', expanded=False)
save_data_in_database(
user_task_database=user_save_text_table,
save_type='download',
save_name=USER__SAVE_IN_CLOUD_FILE_NAME,
cefr_level=CEFR_TEXT_LEVEL,
time_stamp=str(datetime.datetime.now())[:-7],
creator_name=st.session_state.get('-USER_NAME-'),
generated_result=__TASK_DATA__,
distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
if EXIT_BUTTON:
for key in st.session_state:
del st.session_state[key]
st.error('Я устал. Я ухожу')
st.session_state["START_GENERATION"] = False
st.stop()
if RERUN_BUTTON:
for key in st.session_state:
del st.session_state[key]
st.error('Что-то пошло не так?! Перезагружаюсь!')
st.session_state["START_GENERATION"] = False
st.stop()
st.rerun()
# LABEL
st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
' 3 курс, бакалавриат, "Прикладная, компьютерная и математическая лингвистика (английский язык)"*'
'\n\n*Научный руководитель: канд. филол. наук, доц. О.А.Митрофанова*')
st.markdown('*E-mail: st087202@student.spbu.ru*')
else:
st.warning('**Войдите или зарегистрируйтесь**')
|