Spaces:
Running
Running
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()
|