Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -3,7 +3,7 @@ import random
|
|
| 3 |
from vocab import get_sources, get_words_from_source
|
| 4 |
from sentences import generate_sentences
|
| 5 |
from ai_sentence import MODEL_LIST
|
| 6 |
-
from quiz import generate_fill_in_blank_exam, check_exam
|
| 7 |
|
| 8 |
def process_sentence(mode, word, source, num, use_ai, model_name):
|
| 9 |
try:
|
|
@@ -36,6 +36,7 @@ def project_description():
|
|
| 36 |
- 查詢單字 → 獲取例句
|
| 37 |
- 抽取單字 → 批量獲取例句
|
| 38 |
- 可選 AI 生成句子(模型:GPT2 / Pythia)
|
|
|
|
| 39 |
## 🧑💻 技術架構
|
| 40 |
- Gradio Blocks + Transformers (Hugging Face)
|
| 41 |
- SQLite 句庫管理
|
|
@@ -114,12 +115,19 @@ with gr.Blocks(css="""
|
|
| 114 |
)
|
| 115 |
|
| 116 |
with gr.Tab("英文小考"):
|
|
|
|
|
|
|
| 117 |
quiz_source_dropdown = gr.Dropdown(
|
| 118 |
choices=get_sources(),
|
| 119 |
value="common3000",
|
| 120 |
label="選擇單字庫"
|
| 121 |
)
|
| 122 |
quiz_num_slider = gr.Slider(minimum=1, maximum=5, value=2, step=1, label="題目數量")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 123 |
|
| 124 |
quiz_generate_button = gr.Button("📄 生成試卷")
|
| 125 |
quiz_submit_button = gr.Button("✅ 提交試卷")
|
|
@@ -127,21 +135,20 @@ with gr.Blocks(css="""
|
|
| 127 |
quiz_score_display = gr.HTML()
|
| 128 |
quiz_questions_state = gr.State([])
|
| 129 |
|
| 130 |
-
radios = []
|
| 131 |
-
|
| 132 |
-
|
| 133 |
-
|
| 134 |
-
|
|
|
|
| 135 |
|
| 136 |
-
def display_exam(source, num):
|
| 137 |
questions = generate_fill_in_blank_exam(source, num)
|
| 138 |
quiz_questions_state.value = questions
|
| 139 |
|
| 140 |
updates = []
|
| 141 |
for i, q in enumerate(questions):
|
| 142 |
-
updates.append(
|
| 143 |
-
gr.update(choices=q["options"], label=f"第 {i + 1} 題:{q['sentence']}", visible=True)
|
| 144 |
-
)
|
| 145 |
for i in range(len(questions), 5):
|
| 146 |
updates.append(gr.update(visible=False))
|
| 147 |
|
|
@@ -152,16 +159,7 @@ with gr.Blocks(css="""
|
|
| 152 |
score_html = check_exam(user_answers[:len(questions)], questions)
|
| 153 |
return score_html
|
| 154 |
|
| 155 |
-
quiz_generate_button.click(
|
| 156 |
-
|
| 157 |
-
inputs=[quiz_source_dropdown, quiz_num_slider],
|
| 158 |
-
outputs=radios
|
| 159 |
-
)
|
| 160 |
-
|
| 161 |
-
quiz_submit_button.click(
|
| 162 |
-
submit_exam,
|
| 163 |
-
inputs=radios,
|
| 164 |
-
outputs=quiz_score_display
|
| 165 |
-
)
|
| 166 |
|
| 167 |
demo.launch()
|
|
|
|
| 3 |
from vocab import get_sources, get_words_from_source
|
| 4 |
from sentences import generate_sentences
|
| 5 |
from ai_sentence import MODEL_LIST
|
| 6 |
+
from quiz import generate_fill_in_blank_exam, check_exam, render_exam_interface
|
| 7 |
|
| 8 |
def process_sentence(mode, word, source, num, use_ai, model_name):
|
| 9 |
try:
|
|
|
|
| 36 |
- 查詢單字 → 獲取例句
|
| 37 |
- 抽取單字 → 批量獲取例句
|
| 38 |
- 可選 AI 生成句子(模型:GPT2 / Pythia)
|
| 39 |
+
- 英文小考 → 單字填空選擇題,自動批改計分
|
| 40 |
## 🧑💻 技術架構
|
| 41 |
- Gradio Blocks + Transformers (Hugging Face)
|
| 42 |
- SQLite 句庫管理
|
|
|
|
| 115 |
)
|
| 116 |
|
| 117 |
with gr.Tab("英文小考"):
|
| 118 |
+
model_note = gr.Markdown(visible=True)
|
| 119 |
+
|
| 120 |
quiz_source_dropdown = gr.Dropdown(
|
| 121 |
choices=get_sources(),
|
| 122 |
value="common3000",
|
| 123 |
label="選擇單字庫"
|
| 124 |
)
|
| 125 |
quiz_num_slider = gr.Slider(minimum=1, maximum=5, value=2, step=1, label="題目數量")
|
| 126 |
+
quiz_model_dropdown = gr.Dropdown(
|
| 127 |
+
choices=MODEL_LIST,
|
| 128 |
+
value="gpt2",
|
| 129 |
+
label="選擇 AI 模型"
|
| 130 |
+
)
|
| 131 |
|
| 132 |
quiz_generate_button = gr.Button("📄 生成試卷")
|
| 133 |
quiz_submit_button = gr.Button("✅ 提交試卷")
|
|
|
|
| 135 |
quiz_score_display = gr.HTML()
|
| 136 |
quiz_questions_state = gr.State([])
|
| 137 |
|
| 138 |
+
radios = [gr.Radio(choices=[], label=f"第 {i + 1} 題", visible=False, interactive=True) for i in range(5)]
|
| 139 |
+
|
| 140 |
+
def update_model_note(model):
|
| 141 |
+
return f"本功能目前使用 **{model}** 作為語言模型生成題目。"
|
| 142 |
+
|
| 143 |
+
quiz_model_dropdown.change(update_model_note, inputs=[quiz_model_dropdown], outputs=[model_note])
|
| 144 |
|
| 145 |
+
def display_exam(source, num, model):
|
| 146 |
questions = generate_fill_in_blank_exam(source, num)
|
| 147 |
quiz_questions_state.value = questions
|
| 148 |
|
| 149 |
updates = []
|
| 150 |
for i, q in enumerate(questions):
|
| 151 |
+
updates.append(gr.update(choices=q["options"], label=f"第 {i + 1} 題:{q['sentence']}", visible=True))
|
|
|
|
|
|
|
| 152 |
for i in range(len(questions), 5):
|
| 153 |
updates.append(gr.update(visible=False))
|
| 154 |
|
|
|
|
| 159 |
score_html = check_exam(user_answers[:len(questions)], questions)
|
| 160 |
return score_html
|
| 161 |
|
| 162 |
+
quiz_generate_button.click(display_exam, inputs=[quiz_source_dropdown, quiz_num_slider, quiz_model_dropdown], outputs=radios)
|
| 163 |
+
quiz_submit_button.click(submit_exam, inputs=radios, outputs=quiz_score_display)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 164 |
|
| 165 |
demo.launch()
|