Spaces:
Sleeping
Sleeping
a-v-bely
commited on
Commit
•
8cde930
1
Parent(s):
2285feb
Update interface
Browse files- app.py +2 -2
- pages/1_⚙️_Инструкция.py +33 -33
- pages/2_👨🏫_Начало_работы.py +43 -65
- pages/3_📥_Скачать.py +1 -1
- pages/{4_📝_Онлайн-тест (эксперимент).py → 4_📝_Онлайн-тест.py} +13 -12
app.py
CHANGED
@@ -5,8 +5,8 @@ from utilities_database.user_database_widgets import LogIn
|
|
5 |
|
6 |
warnings.filterwarnings('ignore')
|
7 |
st.header('Добро пожаловать!')
|
8 |
-
st.subheader('Вы используете инструмент по автоматической генерации лексико-грамматических заданий по
|
9 |
-
'испанскому языку!')
|
10 |
st.write('**Зарегистрируйтесь или войдите в аккаунт**')
|
11 |
__login__obj = LogIn(auth_token=st.secrets['COURIER_AUTH_TOKEN'],
|
12 |
company_name=st.secrets['COMPANY_NAME'],
|
|
|
5 |
|
6 |
warnings.filterwarnings('ignore')
|
7 |
st.header('Добро пожаловать!')
|
8 |
+
st.subheader('Вы используете инструмент по автоматической генерации лексико-грамматических заданий по'
|
9 |
+
' испанскому языку!')
|
10 |
st.write('**Зарегистрируйтесь или войдите в аккаунт**')
|
11 |
__login__obj = LogIn(auth_token=st.secrets['COURIER_AUTH_TOKEN'],
|
12 |
company_name=st.secrets['COMPANY_NAME'],
|
pages/1_⚙️_Инструкция.py
CHANGED
@@ -5,18 +5,18 @@ st.set_page_config(page_title='GenLexTasks', layout="wide", page_icon=':es:')
|
|
5 |
if st.session_state.get('-LOGGED_IN_BOOL-'):
|
6 |
ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=True)
|
7 |
ANNOUNCES.success(
|
8 |
-
'**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест"
|
9 |
-
'и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
|
10 |
ANNOUNCES.warning(
|
11 |
-
'**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество
|
12 |
-
'данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием
|
13 |
-
'к излишне большому количеству заданий.**')
|
14 |
ANNOUNCES.warning(
|
15 |
-
'**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на
|
16 |
-
'другие вкладки до выведения соответствующего сообщения.**')
|
17 |
ANNOUNCES.warning(
|
18 |
-
'**❗ㅤВ случае появления
|
19 |
-
'повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
|
20 |
|
21 |
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=True)
|
22 |
INSTRUCTION.markdown(
|
@@ -24,38 +24,38 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
24 |
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
|
25 |
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
|
26 |
'\n\n1. Придумайте **название** для файла с заданиями. '
|
27 |
-
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов
|
28 |
-
'введенного Вами текста.'
|
29 |
-
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите
|
30 |
'создать задания. '
|
31 |
'\n\n3. Укажите *способ выбора целевых слов*:'
|
32 |
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
|
33 |
-
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,
|
34 |
-
'в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда
|
35 |
-
'дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
|
36 |
-
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите
|
37 |
-
'*:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при
|
38 |
-
'подборе дистракторов.'
|
39 |
-
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее
|
40 |
-
'поле. ️ \n❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
|
41 |
-
'\n\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_
|
42 |
-
'дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_
|
43 |
-
'вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
|
44 |
'\n7. Выберите **способы вывода** готовых материалов.'
|
45 |
-
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,
|
46 |
-
'начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
|
47 |
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
|
48 |
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
|
49 |
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
|
50 |
-
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,
|
51 |
-
'которые Вы сохранили, языковой уровень и дата их создания.'
|
52 |
' Для загрузки определенного файла с заданиями:'
|
53 |
'\n1. Введите (или скопируйте из таблицы) название.'
|
54 |
'\n2. Укажите соответсвующий языковой уровень.'
|
55 |
'\n3. Нажмите на кнопку **"Загрузить"**.'
|
56 |
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
|
57 |
-
'\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,
|
58 |
-
'кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
|
59 |
|
60 |
INSTRUCTION_ONLINE_TEST = st.expander(label='**ИНСТРУКЦИЯ ОНЛАЙН-ТЕСТ**', expanded=True)
|
61 |
INSTRUCTION_ONLINE_TEST.markdown(
|
@@ -64,10 +64,10 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
64 |
'\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
|
65 |
'\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
|
66 |
'\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
|
67 |
-
'\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,
|
68 |
-
'**:red[не уместны]**. '
|
69 |
-
'\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют
|
70 |
-
'следующим условиям в рамках языкового уровня, для которого они созданы:'
|
71 |
'\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
|
72 |
'\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
|
73 |
)
|
|
|
5 |
if st.session_state.get('-LOGGED_IN_BOOL-'):
|
6 |
ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=True)
|
7 |
ANNOUNCES.success(
|
8 |
+
'**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест"'
|
9 |
+
' и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
|
10 |
ANNOUNCES.warning(
|
11 |
+
'**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество'
|
12 |
+
' данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием'
|
13 |
+
' к излишне большому количеству заданий.**')
|
14 |
ANNOUNCES.warning(
|
15 |
+
'**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на'
|
16 |
+
' другие вкладки до выведения соответствующего сообщения.**')
|
17 |
ANNOUNCES.warning(
|
18 |
+
'**❗ㅤВ случае появления сообщений об ошибке, как правило, проблема решается'
|
19 |
+
' повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
|
20 |
|
21 |
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=True)
|
22 |
INSTRUCTION.markdown(
|
|
|
24 |
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
|
25 |
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
|
26 |
'\n\n1. Придумайте **название** для файла с заданиями. '
|
27 |
+
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
|
28 |
+
' введенного Вами текста.'
|
29 |
+
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
|
30 |
'создать задания. '
|
31 |
'\n\n3. Укажите *способ выбора целевых слов*:'
|
32 |
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
|
33 |
+
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
|
34 |
+
' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
|
35 |
+
' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
|
36 |
+
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
|
37 |
+
' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
|
38 |
+
' подборе дистракторов.'
|
39 |
+
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
|
40 |
+
' поле. ️ \n❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
|
41 |
+
'\n\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
|
42 |
+
' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
|
43 |
+
' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
|
44 |
'\n7. Выберите **способы вывода** готовых материалов.'
|
45 |
+
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
|
46 |
+
' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
|
47 |
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
|
48 |
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
|
49 |
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
|
50 |
+
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
|
51 |
+
' которые Вы сохранили, языковой уровень и дата их создания.'
|
52 |
' Для загрузки определенного файла с заданиями:'
|
53 |
'\n1. Введите (или скопируйте из таблицы) название.'
|
54 |
'\n2. Укажите соответсвующий языковой уровень.'
|
55 |
'\n3. Нажмите на кнопку **"Загрузить"**.'
|
56 |
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
|
57 |
+
'\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
|
58 |
+
' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
|
59 |
|
60 |
INSTRUCTION_ONLINE_TEST = st.expander(label='**ИНСТРУКЦИЯ ОНЛАЙН-ТЕСТ**', expanded=True)
|
61 |
INSTRUCTION_ONLINE_TEST.markdown(
|
|
|
64 |
'\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
|
65 |
'\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
|
66 |
'\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
|
67 |
+
'\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,'
|
68 |
+
' **:red[не уместны]**. '
|
69 |
+
'\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют'
|
70 |
+
' следующим условиям в рамках языкового уровня, для которого они созданы:'
|
71 |
'\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
|
72 |
'\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
|
73 |
)
|
pages/2_👨🏫_Начало_работы.py
CHANGED
@@ -4,7 +4,6 @@ from utilities_database.user_database_utils import load_user_tasks_data
|
|
4 |
from utilities_database.user_database_utils import save_data_in_database
|
5 |
from utilities_database.user_database_widgets import user_save_text_table
|
6 |
from utilities_database.user_database_utils import load_users_particular_task
|
7 |
-
from streamlit_extras.no_default_selectbox import selectbox as custom_select_box
|
8 |
|
9 |
# Interface
|
10 |
if st.session_state.get('-LOGGED_IN_BOOL-'):
|
@@ -15,52 +14,38 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
15 |
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
|
16 |
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
|
17 |
'\n\n1. Придумайте **название** для файла с заданиями. '
|
18 |
-
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов
|
19 |
-
'введенного Вами текста.'
|
20 |
-
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите
|
21 |
-
'создать задания. '
|
22 |
'\n\n3. Укажите *способ выбора целевых слов*:'
|
23 |
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
|
24 |
-
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,
|
25 |
-
'в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда
|
26 |
-
'дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
|
27 |
-
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите
|
28 |
-
'*:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при
|
29 |
-
'подборе дистракторов.'
|
30 |
-
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее
|
31 |
-
'поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
|
32 |
-
'\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_
|
33 |
-
'дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_
|
34 |
-
'вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
|
35 |
'\n7. Выберите **способы вывода** готовых материалов.'
|
36 |
-
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,
|
37 |
-
'начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
|
38 |
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
|
39 |
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
|
40 |
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
|
41 |
-
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,
|
42 |
-
'которые Вы сохранили, языковой уровень и дата их создания.'
|
43 |
' Для загрузки определенного файла с заданиями:'
|
44 |
'\n1. Введите (или скопируйте из таблицы) название.'
|
45 |
'\n2. Укажите соответсвующий языковой уровень.'
|
46 |
'\n3. Нажмите на кнопку **"Загрузить"**.'
|
47 |
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
|
48 |
-
'\n\n\nДля того,
|
49 |
-
'кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
|
50 |
-
ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=False)
|
51 |
-
ANNOUNCES.success(
|
52 |
-
'**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест" '
|
53 |
-
'и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**')
|
54 |
-
ANNOUNCES.warning(
|
55 |
-
'**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество '
|
56 |
-
'данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием '
|
57 |
-
'к излишне большому количеству заданий.**')
|
58 |
-
ANNOUNCES.warning(
|
59 |
-
'**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на '
|
60 |
-
'другие вкладки до выведения соответствующего сообщения.**')
|
61 |
-
ANNOUNCES.warning(
|
62 |
-
'**❗ㅤВ случае появления красных сообщений об ошибке, как правило, проблема решается '
|
63 |
-
'повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**')
|
64 |
WHAT_TO_DO = st.radio(
|
65 |
label='**Выберите режим работы**',
|
66 |
options=[
|
@@ -79,10 +64,11 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
79 |
COL1, COL2 = LOAD_FORM.columns([1, 1])
|
80 |
UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
|
81 |
with COL2:
|
82 |
-
UPLOAD_CLOUD_CEFR_LEVEL =
|
83 |
-
'Выберите языковой уровень',
|
84 |
-
['A1', 'A2', 'B1', 'B2', 'C1', '
|
85 |
-
|
|
|
86 |
st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
|
87 |
LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
|
88 |
if LOAD_BUTTON:
|
@@ -132,22 +118,23 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
132 |
key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
|
133 |
CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
|
134 |
with CEFR_NUM_DISTRACTORS_COL:
|
135 |
-
CEFR_TEXT_LEVEL =
|
136 |
-
'
|
137 |
-
['
|
138 |
-
|
|
|
139 |
st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
|
140 |
NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
|
141 |
label='**Выберите количество дистракторов в задании:**',
|
142 |
min_value=1,
|
143 |
max_value=9,
|
144 |
-
value=
|
145 |
key='-NUM_DISTRACTORS-')
|
146 |
TARGET_WORDS = UTW_COL.text_area(
|
147 |
label='**Если "Самостоятельно", введите целевые слова:**',
|
148 |
value='',
|
149 |
height=120,
|
150 |
-
placeholder='Через запятую
|
151 |
key='-INPUT_TARGET_WORDS-')
|
152 |
FORM.markdown('**Выберите формат(-ы) вывода:**')
|
153 |
col1, col2, col3 = FORM.columns(3)
|
@@ -176,14 +163,11 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
176 |
use_container_width=True)
|
177 |
|
178 |
if START_BUTTON:
|
179 |
-
LOGS = st.empty()
|
180 |
-
LOGS.success('**Готовые задания или онлайн-тест появятся на отдельных страницах**')
|
181 |
-
|
182 |
# Initiate interface structure
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
|
188 |
# Start generation process. Everything happens inside main_workflow func
|
189 |
if DISTRACTOR_MODEL == 'Модель-3':
|
@@ -192,9 +176,8 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
192 |
file=UPLOAD_FILE,
|
193 |
text=UPLOAD_TEXT,
|
194 |
logs=LOGS,
|
195 |
-
logs_d=LOGS_D,
|
196 |
progress=PROGRESS_BAR,
|
197 |
-
|
198 |
level=CEFR_TEXT_LEVEL,
|
199 |
tw_mode_automatic_mode=TARGET_WORDS_MODE,
|
200 |
target_words=TARGET_WORDS,
|
@@ -206,10 +189,8 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
206 |
file=UPLOAD_FILE,
|
207 |
text=UPLOAD_TEXT,
|
208 |
logs=LOGS,
|
209 |
-
logs_d=LOGS_D,
|
210 |
progress=PROGRESS_BAR,
|
211 |
-
progress_d=
|
212 |
-
progress_s=PROGRESS_BAR_S,
|
213 |
level=CEFR_TEXT_LEVEL,
|
214 |
tw_mode_automatic_mode=TARGET_WORDS_MODE,
|
215 |
target_words=TARGET_WORDS,
|
@@ -228,8 +209,9 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
228 |
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
|
229 |
|
230 |
PROGRESS_BAR.progress(100)
|
231 |
-
|
232 |
-
LOGS.
|
|
|
233 |
save_data_in_database(
|
234 |
user_task_database=user_save_text_table,
|
235 |
save_type='download',
|
@@ -240,10 +222,6 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
240 |
generated_result=__TASK_DATA__,
|
241 |
distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
|
242 |
|
243 |
-
PROGRESS_BAR = ''
|
244 |
-
PROGRESS_BAR_S = ''
|
245 |
-
LOGS_D = ''
|
246 |
-
|
247 |
if EXIT_BUTTON:
|
248 |
for key in st.session_state:
|
249 |
del st.session_state[key]
|
@@ -256,7 +234,7 @@ if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
256 |
st.error('Что-то пошло не так?! Перезагружаюсь!')
|
257 |
st.session_state["START_GENERATION"] = False
|
258 |
st.stop()
|
259 |
-
st.
|
260 |
|
261 |
# LABEL
|
262 |
st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
|
|
|
4 |
from utilities_database.user_database_utils import save_data_in_database
|
5 |
from utilities_database.user_database_widgets import user_save_text_table
|
6 |
from utilities_database.user_database_utils import load_users_particular_task
|
|
|
7 |
|
8 |
# Interface
|
9 |
if st.session_state.get('-LOGGED_IN_BOOL-'):
|
|
|
14 |
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**'
|
15 |
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:'
|
16 |
'\n\n1. Придумайте **название** для файла с заданиями. '
|
17 |
+
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов'
|
18 |
+
' введенного Вами текста.'
|
19 |
+
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите'
|
20 |
+
' создать задания. '
|
21 |
'\n\n3. Укажите *способ выбора целевых слов*:'
|
22 |
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.'
|
23 |
+
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме,'
|
24 |
+
' в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда'
|
25 |
+
' дистракторы будут полностью случайными и несоотнесёнными с уровнем.'
|
26 |
+
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите'
|
27 |
+
' *:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при'
|
28 |
+
' подборе дистракторов.'
|
29 |
+
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее'
|
30 |
+
' поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.'
|
31 |
+
'\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_'
|
32 |
+
' дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_'
|
33 |
+
' вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.'
|
34 |
'\n7. Выберите **способы вывода** готовых материалов.'
|
35 |
+
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно,'
|
36 |
+
' начнется процесс генерации заданий. Прогресс будет отображаться на экране.'
|
37 |
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. '
|
38 |
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.'
|
39 |
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**'
|
40 |
+
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий,'
|
41 |
+
' которые Вы сохранили, языковой уровень и дата их создания.'
|
42 |
' Для загрузки определенного файла с заданиями:'
|
43 |
'\n1. Введите (или скопируйте из таблицы) название.'
|
44 |
'\n2. Укажите соответсвующий языковой уровень.'
|
45 |
'\n3. Нажмите на кнопку **"Загрузить"**.'
|
46 |
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.'
|
47 |
+
'\n\n\nДля того, чтоб�� свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
|
48 |
+
' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
WHAT_TO_DO = st.radio(
|
50 |
label='**Выберите режим работы**',
|
51 |
options=[
|
|
|
64 |
COL1, COL2 = LOAD_FORM.columns([1, 1])
|
65 |
UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название')
|
66 |
with COL2:
|
67 |
+
UPLOAD_CLOUD_CEFR_LEVEL = st.selectbox(
|
68 |
+
label='Выберите языковой уровень',
|
69 |
+
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
|
70 |
+
index=None,
|
71 |
+
placeholder='-Выберите языковой уровень-')
|
72 |
st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL
|
73 |
LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить')
|
74 |
if LOAD_BUTTON:
|
|
|
118 |
key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
|
119 |
CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
|
120 |
with CEFR_NUM_DISTRACTORS_COL:
|
121 |
+
CEFR_TEXT_LEVEL = st.selectbox(
|
122 |
+
label='Выберите языковой уровень',
|
123 |
+
options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
|
124 |
+
index=None,
|
125 |
+
placeholder='-Выберите языковой уровень-')
|
126 |
st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL
|
127 |
NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input(
|
128 |
label='**Выберите количество дистракторов в задании:**',
|
129 |
min_value=1,
|
130 |
max_value=9,
|
131 |
+
value=3,
|
132 |
key='-NUM_DISTRACTORS-')
|
133 |
TARGET_WORDS = UTW_COL.text_area(
|
134 |
label='**Если "Самостоятельно", введите целевые слова:**',
|
135 |
value='',
|
136 |
height=120,
|
137 |
+
placeholder='Через запятую',
|
138 |
key='-INPUT_TARGET_WORDS-')
|
139 |
FORM.markdown('**Выберите формат(-ы) вывода:**')
|
140 |
col1, col2, col3 = FORM.columns(3)
|
|
|
163 |
use_container_width=True)
|
164 |
|
165 |
if START_BUTTON:
|
|
|
|
|
|
|
166 |
# Initiate interface structure
|
167 |
+
LOGS = st.status(label='Прогресс выполнения', expanded=True)
|
168 |
+
|
169 |
+
PROGRESS_BAR = LOGS.progress(0)
|
170 |
+
PROGRESS_BAR_DISTRACTORS = LOGS.progress(0)
|
171 |
|
172 |
# Start generation process. Everything happens inside main_workflow func
|
173 |
if DISTRACTOR_MODEL == 'Модель-3':
|
|
|
176 |
file=UPLOAD_FILE,
|
177 |
text=UPLOAD_TEXT,
|
178 |
logs=LOGS,
|
|
|
179 |
progress=PROGRESS_BAR,
|
180 |
+
progress_d=PROGRESS_BAR_DISTRACTORS,
|
181 |
level=CEFR_TEXT_LEVEL,
|
182 |
tw_mode_automatic_mode=TARGET_WORDS_MODE,
|
183 |
target_words=TARGET_WORDS,
|
|
|
189 |
file=UPLOAD_FILE,
|
190 |
text=UPLOAD_TEXT,
|
191 |
logs=LOGS,
|
|
|
192 |
progress=PROGRESS_BAR,
|
193 |
+
progress_d=PROGRESS_BAR_DISTRACTORS,
|
|
|
194 |
level=CEFR_TEXT_LEVEL,
|
195 |
tw_mode_automatic_mode=TARGET_WORDS_MODE,
|
196 |
target_words=TARGET_WORDS,
|
|
|
209 |
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME
|
210 |
|
211 |
PROGRESS_BAR.progress(100)
|
212 |
+
PROGRESS_BAR_DISTRACTORS.progress(100)
|
213 |
+
LOGS.update(label='**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**',
|
214 |
+
state='complete', expanded=False)
|
215 |
save_data_in_database(
|
216 |
user_task_database=user_save_text_table,
|
217 |
save_type='download',
|
|
|
222 |
generated_result=__TASK_DATA__,
|
223 |
distractor_model=DISTRACTOR_MODEL, allow=SAVE_IN_CLOUD)
|
224 |
|
|
|
|
|
|
|
|
|
225 |
if EXIT_BUTTON:
|
226 |
for key in st.session_state:
|
227 |
del st.session_state[key]
|
|
|
234 |
st.error('Что-то пошло не так?! Перезагружаюсь!')
|
235 |
st.session_state["START_GENERATION"] = False
|
236 |
st.stop()
|
237 |
+
st.rerun()
|
238 |
|
239 |
# LABEL
|
240 |
st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
|
pages/3_📥_Скачать.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import streamlit as st
|
2 |
from utilities_ui.custom_download_button import download_button as d_button
|
3 |
|
4 |
-
st.set_page_config(page_title='Скачать', layout="wide", page_icon=':es:')
|
5 |
if st.session_state.get('-LOGGED_IN_BOOL-') and (st.session_state.get('-DISPLAY_READY-')
|
6 |
or st.session_state.get('-DOWNLOAD_VERSION-')):
|
7 |
result = st.session_state.get('RESULT')
|
|
|
1 |
import streamlit as st
|
2 |
from utilities_ui.custom_download_button import download_button as d_button
|
3 |
|
4 |
+
st.set_page_config(page_title='Скачать', layout="wide", page_icon=':es:', initial_sidebar_state='collapsed')
|
5 |
if st.session_state.get('-LOGGED_IN_BOOL-') and (st.session_state.get('-DISPLAY_READY-')
|
6 |
or st.session_state.get('-DOWNLOAD_VERSION-')):
|
7 |
result = st.session_state.get('RESULT')
|
pages/{4_📝_Онлайн-тест (эксперимент).py → 4_📝_Онлайн-тест.py}
RENAMED
@@ -4,19 +4,19 @@ import streamlit as st
|
|
4 |
from utilities_database.user_database_utils import save_data_in_database
|
5 |
from utilities_database.user_database_widgets import user_save_text_table
|
6 |
|
7 |
-
st.set_page_config(page_title='Онлайн-тест', layout="wide", page_icon=':es:')
|
8 |
if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED_IN_BOOL-'):
|
9 |
-
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=
|
10 |
INSTRUCTION.markdown(
|
11 |
'Уважаемые пользователи, предлагаем Вам заполнить опросник по оценке качества созданных заданий. '
|
12 |
'\n\nНиже находится анкета с заданиями в таблице.'
|
13 |
'\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
|
14 |
'\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
|
15 |
'\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
|
16 |
-
'\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,
|
17 |
-
'**:red[не уместны]**. '
|
18 |
-
'\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют
|
19 |
-
'следующим условиям в рамках языкового уровня, для которого они созданы:'
|
20 |
'\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
|
21 |
'\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
|
22 |
)
|
@@ -30,18 +30,19 @@ if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED
|
|
30 |
st.header('Онлайн-тест')
|
31 |
ONLINE_TEST = st.form('Онлайн тест')
|
32 |
ONLINE_TEST.write(result['TEXT_WITH_GAPS'].replace('_', '\_'))
|
33 |
-
BAD_DISTRACTORS_AND_ANSWERS_temp = ONLINE_TEST.
|
34 |
-
pd.DataFrame([{"Задание №": i+1,
|
35 |
"Ответ": [answers[i][1]],
|
36 |
"Задание уместно": False,
|
37 |
"Дистракторы": tasks[i][1],
|
38 |
"Неуместные дистракторы": ''}
|
39 |
for i in range(len(tasks))]),
|
40 |
num_rows="fixed",
|
41 |
-
height=
|
|
|
42 |
use_container_width=True)
|
43 |
-
COMMENTS = ONLINE_TEST.
|
44 |
-
|
45 |
SUBMIT = ONLINE_TEST.form_submit_button('READY')
|
46 |
if SUBMIT:
|
47 |
points = test_mark = 'Teacher'
|
@@ -49,7 +50,7 @@ if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED
|
|
49 |
inappropriate_distractors = BAD_DISTRACTORS_AND_ANSWERS_temp["Неуместные дистракторы"].values.tolist()
|
50 |
RETURN_TEST_DATA = [{'ANSWER': answers[i],
|
51 |
'APPROPRIATE_TASK': appropriate_tasks[i],
|
52 |
-
|
53 |
save_data_in_database(user_task_database=user_save_text_table,
|
54 |
save_type='online_test',
|
55 |
save_name=st.session_state['-UPLOAD_CLOUD_FILE_NAME-'],
|
|
|
4 |
from utilities_database.user_database_utils import save_data_in_database
|
5 |
from utilities_database.user_database_widgets import user_save_text_table
|
6 |
|
7 |
+
st.set_page_config(page_title='Онлайн-тест', layout="wide", page_icon=':es:', initial_sidebar_state='collapsed')
|
8 |
if st.session_state.get('-ONLINE_TEST_READY-') and st.session_state.get('-LOGGED_IN_BOOL-'):
|
9 |
+
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=False)
|
10 |
INSTRUCTION.markdown(
|
11 |
'Уважаемые пользователи, предлагаем Вам заполнить опросник по оценке качества созданных заданий. '
|
12 |
'\n\nНиже находится анкета с заданиями в таблице.'
|
13 |
'\n\n- В **первом столбце** приводится ответ - слово, удаленное из оригинального текста.'
|
14 |
'\n\n- Отметьте во **втором столбце**, уместно ли создавать задание с данным словом.'
|
15 |
'\n\n- В **третьем столбце** приведены подобранные программой дистракторы.'
|
16 |
+
'\n\n- Введите в **четвертый столбец** дистракторы (целиком или букву), которые, по Вашему мнению,'
|
17 |
+
' **:red[не уместны]**. '
|
18 |
+
'\n\n**:green[Уместными дистракторами]** мы предлагаем считать те, которые одновременно удовлетворяют'
|
19 |
+
' следующим условиям в рамках языкового уровня, для которого они созданы:'
|
20 |
'\n\n1. не слишком очевидно являются неправильными вариантами (*варить суп/стол*);'
|
21 |
'\n\n2. и при этом не могут быть полноценной заменой удаленного слова (*варить суп/кашу*)'
|
22 |
)
|
|
|
30 |
st.header('Онлайн-тест')
|
31 |
ONLINE_TEST = st.form('Онлайн тест')
|
32 |
ONLINE_TEST.write(result['TEXT_WITH_GAPS'].replace('_', '\_'))
|
33 |
+
BAD_DISTRACTORS_AND_ANSWERS_temp = ONLINE_TEST.data_editor(
|
34 |
+
pd.DataFrame([{"Задание №": i + 1,
|
35 |
"Ответ": [answers[i][1]],
|
36 |
"Задание уместно": False,
|
37 |
"Дистракторы": tasks[i][1],
|
38 |
"Неуместные дистракторы": ''}
|
39 |
for i in range(len(tasks))]),
|
40 |
num_rows="fixed",
|
41 |
+
height=40 * len_answers,
|
42 |
+
hide_index=True,
|
43 |
use_container_width=True)
|
44 |
+
COMMENTS = ONLINE_TEST.text_area(label='**Прокомментировать**',
|
45 |
+
placeholder='Напишите комментарий')
|
46 |
SUBMIT = ONLINE_TEST.form_submit_button('READY')
|
47 |
if SUBMIT:
|
48 |
points = test_mark = 'Teacher'
|
|
|
50 |
inappropriate_distractors = BAD_DISTRACTORS_AND_ANSWERS_temp["Неуместные дистракторы"].values.tolist()
|
51 |
RETURN_TEST_DATA = [{'ANSWER': answers[i],
|
52 |
'APPROPRIATE_TASK': appropriate_tasks[i],
|
53 |
+
'INAPPROPRIATE_DISTRACTORS': inappropriate_distractors[i]} for i in range(len_answers)]
|
54 |
save_data_in_database(user_task_database=user_save_text_table,
|
55 |
save_type='online_test',
|
56 |
save_name=st.session_state['-UPLOAD_CLOUD_FILE_NAME-'],
|