File size: 3,241 Bytes
bec29d2
 
 
 
 
 
72fa046
bec29d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

import gradio as gr
import pandas as pd
from mcq_generator import ImprovedMCQGenerator, is_suitable_for_students
import io


# Load MCQ generator once
mcq_generator = ImprovedMCQGenerator()

def generate_mcqs_ui(paragraph, num_questions):
    if not paragraph.strip():
        return None, None, "⚠️ Please enter a valid paragraph."

    if not is_suitable_for_students(paragraph):
        return None, None, "❌ The paragraph is not suitable for MCQ generation (due to bias/toxicity/short length)."

    try:
        mcqs = mcq_generator.generate_mcqs(paragraph, num_questions)

        # Create pretty formatted MCQ list
        pretty_mcqs = []
        for idx, mcq in enumerate(mcqs):
            options = ""
            for opt_idx, option in enumerate(mcq['options']):
                options += f"<b>{chr(65+opt_idx)}.</b> {option}<br>"
            question_html = f"<div style='margin-bottom:20px; padding:10px; border:1px solid #ccc; border-radius:10px; background:#f9f9f9;'>"
            question_html += f"<b>Q{idx+1}:</b> {mcq['question']}<br><br>{options}"
            question_html += f"<i><b>Answer:</b> {chr(65+mcq['answer_index'])}</i>"
            question_html += "</div>"
            pretty_mcqs.append(question_html)

        # Prepare download files
        txt_output = ""
        csv_data = []

        for idx, mcq in enumerate(mcqs):
            txt_output += f"Q{idx+1}: {mcq['question']}\n"
            for opt_idx, option in enumerate(mcq['options']):
                txt_output += f"   {chr(65+opt_idx)}. {option}\n"
            txt_output += f"Answer: {chr(65+mcq['answer_index'])}\n\n"

            csv_data.append({
                'Question': mcq['question'],
                'Option A': mcq['options'][0],
                'Option B': mcq['options'][1],
                'Option C': mcq['options'][2],
                'Option D': mcq['options'][3],
                'Answer': chr(65+mcq['answer_index'])
            })

        # Create file objects
        txt_file = io.BytesIO(txt_output.encode('utf-8'))
        csv_file = io.BytesIO()
        pd.DataFrame(csv_data).to_csv(csv_file, index=False)
        csv_file.seek(0)

        return pretty_mcqs, [("mcqs.txt", txt_file), ("mcqs.csv", csv_file)], "βœ… MCQs generated successfully!"

    except Exception as e:
        return None, None, f"❌ Error generating MCQs: {str(e)}"

# Gradio Interface
with gr.Blocks(theme=gr.themes.Default()) as demo:
    gr.Markdown("<h1 style='text-align:center;'>πŸ“š Smart MCQ Generator</h1>")
    with gr.Row():
        paragraph_input = gr.Textbox(lines=8, label="Enter Paragraph for MCQs", placeholder="Paste your study material here...")
    with gr.Row():
        num_questions_slider = gr.Slider(1, 10, step=1, value=5, label="Number of Questions")
    with gr.Row():
        generate_btn = gr.Button("πŸš€ Generate MCQs")
    status = gr.Textbox(label="Status", interactive=False)

    with gr.Row():
        mcq_output = gr.HTML()

    with gr.Row():
        download_output = gr.File(label="Download MCQs (TXT/CSV)")

    generate_btn.click(
        fn=generate_mcqs_ui,
        inputs=[paragraph_input, num_questions_slider],
        outputs=[mcq_output, download_output, status]
    )

demo.launch()