File size: 6,219 Bytes
6c6acc8
f5b5690
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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

from transformers import pipeline
import gradio as gr
import easyocr
import pdfplumber
import random 

#適用於Interface、Block
title = "<h1>產生英文題目</h1>"
description = """這是一個利用hugging face 產生英文題目的小專案"""
textbox = gr.Textbox(label="請輸入英文文章:", placeholder="While lily is setting...", lines=5)

#加入磚
demo = gr.Blocks()

# 加載 Hugging Face 上的問答模型
question_generator = pipeline("text2text-generation", model="valhalla/t5-base-qg-hl")

# def question_generate(context):
#     # 讓模型根據文章生成問題
#     question_result = []
#     for i in range(5):
#         question = question_generator(f"question: {context}",
#             max_length=100,
#             do_sample = True, # 啟用採樣以增加多樣性
#             temperature=0.8 + (i * 0.1),  # 逐漸增加溫度參數來獲得更多樣的結果
#             top_p=0.9
#                         )
#         question_result.append(f"Q{i+1}. {question[0]['generated_text']}")

#     return "\n".join(question_result)  #以換行符號返回多個問題

def question_generator_with_answer(context):

    #產生題目
    question_data = question_generator(f"question:{context}", 
    max_length=100, do_sample=True, temperature=0.8, top_p=0.9)
    question = question_data[0]['generated_text']
 
    #產生正確答案
    answer_data = question_generator(f"answer:{context}", 
    max_length=100, do_sample=True, temperature=1, top_p=0.9)
    correct_answer = answer_data[0]['generated_text']

    #產生錯誤答案
    wrong_answers = set()
    while len(wrong_answers) < 3:
        wrong_data = question_generator(f"answer: {context}", max_length=50, 
                    do_sample=True, temperature=1.0, top_p=0.8)
        wrong_answer = wrong_data[0]['generated_text']
        if wrong_answer != correct_answer and "?" not in wrong_answer:  # 避免重複正確答案
            wrong_answers.add(wrong_answer)

    
    # 將正確答案加入選項,並打亂順序
    choices = list(wrong_answers) + [correct_answer]
    random.shuffle(choices)


    # 回傳題目與選項
    return {
        "question": question,
        "choices": choices,
        "correct_answer": correct_answer
    }

def format_question_output(context):
    question_result=[]
    for j in range(4):
        result = question_generator_with_answer(context)
        question_text = f"{result['question']}\n"
        choices_text = "\n".join([f"{chr(65+i)}. {choice}" for i, choice in enumerate(result['choices'])])
        question_result.append(f"\nQ{j+1}.{question_text}\n{choices_text}\n")
    return "\n".join(question_result) #用換行來連接

# def format_question_output(context):
#     result = question_generator_with_answer(context)
#     question_text = f"**{result['question']}**\n\n"
#     choices_text = "\n".join([f"{chr(65+i)}. {choice}" for i, choice in enumerate(result['choices'])])
#     return f"{question_text}\n{choices_text}\n\n✅ 正確答案: {result['correct_answer']}"
 

#pdf辨識
def extract_text_from_pdf(pdf_path):
    text = ""
    with pdfplumber.open(pdf_path.name) as pdf:  
        for page in pdf.pages:
            text += page.extract_text() + "\n"
    ls = format_question_output(text)
    return ls



#圖片辨識(辨識度太低)
def OCR(photo):
    text_inner = ""
    questions = []
    reader = easyocr.Reader(['en', 'ch_tra'])
    results = reader.readtext(photo)
    for (bbox, text, prob) in results:
        text_inner += text
    return text_inner


#確認辨識結果沒有問題後,產生題目
def OCR_gen(text):
    if not text.strip():  # 確保輸入的 text 不是空的
        return "錯誤:OCR 沒有輸出任何可用的文字,請重新檢查圖片內容。"
    ls = format_question_output(text)
    return ls


with demo:
    gr.Markdown(title)
    gr.Markdown(description)
    with gr.Tabs():
        with gr.TabItem("輸入文字"):
            with gr.Row():
                text_input = gr.Textbox(label="請輸入英文文章:", placeholder="While lily is setting...", lines=5)
                with gr.Column():
                    text_output = gr.Textbox(label="題目")
                    text_button = gr.Button("產生題目")
        with gr.TabItem("PDF文件辨識"):
            with gr.Row():
                PDF_input = gr.File(label="請上傳PDF文件")
                with gr.Column():
                    PDF_output = gr.Textbox()
                    PDF_button = gr.Button("產生題目")
        with gr.TabItem("圖片辨識"):
            with gr.Row():
                image_input = gr.Image()
                #解析圖片文字
                with gr.Column():
                    img_tem = gr.Textbox(placeholder="請確認辨識結果",label="辨識結果")
                    img_button = gr.Button("開始解析")
                    image_button = gr.Button("產生題目")
                # #產生題目
                with gr.Column():
                    image_output = gr.Textbox(label="題目")

    #判別有沒有輸入文章
    def validate_and_generate(text):
        if not text.strip():
            return "請輸入文章以產生題目"
        return format_question_output(text)

    #文字輸入                 物件
    text_button.click(validate_and_generate, inputs=text_input, outputs=text_output)
    
    #判別有沒有上傳檔案
    def test_PDF(file):
        if not file:
            return "請上傳PDF文件以產生題目"
        return extract_text_from_pdf(file)

    #PDF輸入
    PDF_button.click(test_PDF, inputs=PDF_input, outputs=PDF_output)

    #判別有沒有上傳照片
    def test_image(image):
        if image is None:
            return "請上傳圖片以產生題目"
        return OCR(image)

    #辨識文章
    img_button.click(test_image, inputs=image_input, outputs=img_tem)


    #檢查辨識結果有沒有存在
    def test_finished(text):
        if (not text.strip() or text == "請上傳圖片以產生題目"):
            return "請確認文章已經輸入"
        return OCR_gen(text)
    image_button.click(test_finished, inputs=img_tem, outputs=image_output)



demo.launch()