Spaces:
Running
Running
| import json | |
| import random | |
| from pathlib import Path | |
| import gradio as gr | |
| import numpy as np | |
| from transformers import AutoTokenizer, AutoModelForSequenceClassification, pipeline | |
| # Constants | |
| MIN_WORDS = 50 | |
| MAX_WORDS = 500 | |
| SAMPLE_JSON_PATH = Path('samples.json') | |
| # Load models | |
| def load_model(model_name): | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| model = AutoModelForSequenceClassification.from_pretrained(model_name) | |
| return pipeline('text-classification', model=model, tokenizer=tokenizer, truncation=True, max_length=512, top_k=4) | |
| classifier = load_model("./deberta-base") | |
| # Load sample essays | |
| with open(SAMPLE_JSON_PATH, 'r') as f: | |
| demo_essays = json.load(f) | |
| # Global variable to store the current essay index | |
| current_essay_index = None | |
| TEXT_CLASS_MAPPING = { | |
| 'LABEL_2': 'Machine-Generated', | |
| 'LABEL_0': 'Human-Written', | |
| 'LABEL_3': 'Machine-Written, Machine-Humanized', | |
| 'LABEL_1': 'Human-Written, Machine-Polished' | |
| } | |
| def process_result_detection_tab(text): | |
| result = classifier(text)[0] | |
| labels = [TEXT_CLASS_MAPPING[x['label']] for x in result] | |
| scores = list(np.array([x['score'] for x in result])) | |
| final_results = dict(zip(labels, scores)) | |
| # Return only the label with the highest score | |
| return max(final_results, key=final_results.get) | |
| def update_detection_tab(name): | |
| if name == '': | |
| return "" | |
| return process_result_detection_tab(name) | |
| def active_button_detection_tab(input_text): | |
| if not (50 <= len(input_text.split()) <= 500): | |
| return gr.Button("Check Origin", variant="primary", interactive=False) | |
| return gr.Button("Check Origin", variant="primary", interactive=True) | |
| def clear_detection_tab(): | |
| return "", gr.Button("Check Origin", variant="primary", interactive=False) | |
| def count_words_detection_tab(text): | |
| return f'{len(text.split())}/500 words (Minimum 50 words)' | |
| def generate_text_challenge_tab(): | |
| global index | |
| mg = gr.Button("Machine-Generated", variant="secondary", interactive=True) | |
| hw = gr.Button("Human-Written", variant="secondary", interactive=True) | |
| mh = gr.Button("Machine-Humanized", variant="secondary", interactive=True) | |
| mp = gr.Button("Machine-Polished", variant="secondary", interactive=True) | |
| index = random.choice(range(80)) | |
| essay = demo_essays[index][0] | |
| return essay, mg, hw, mh, mp, '' | |
| def correct_label_challenge_tab(): | |
| if 0 <= index < 20 : | |
| return 'Human-Written' | |
| elif 20 <= index < 40: | |
| return 'Machine-Generated' | |
| elif 40 <= index < 60: | |
| return 'Machine-Polished' | |
| elif 60 <= index < 80: | |
| return 'Machine-Humanized' | |
| def show_result_challenge_tab(button): | |
| correct_btn = correct_label_challenge_tab() | |
| mg = gr.Button("Machine-Generated", variant="secondary") | |
| hw = gr.Button("Human-Written", variant="secondary") | |
| mh = gr.Button("Machine-Humanized", variant="secondary") | |
| mp = gr.Button("Machine-Polished", variant="secondary") | |
| if button == 'Machine-Generated': | |
| mg = gr.Button("Machine-Generated", variant="stop") | |
| elif button == 'Human-Written': | |
| hw = gr.Button("Human-Written", variant="stop") | |
| elif button == 'Machine-Humanized': | |
| mh = gr.Button("Machine-Humanized", variant="stop") | |
| elif button == 'Machine-Polished': | |
| mp = gr.Button("Machine-Polished", variant="stop") | |
| if correct_btn == 'Machine-Generated': | |
| mg = gr.Button("Machine-Generated", variant="primary") | |
| elif correct_btn == 'Human-Written': | |
| hw = gr.Button("Human-Written", variant="primary") | |
| elif correct_btn == 'Machine-Humanized': | |
| mh = gr.Button("Machine-Humanized", variant="primary") | |
| elif correct_btn == 'Machine-Polished': | |
| mp = gr.Button("Machine-Polished", variant="primary") | |
| outcome = 'Correct' if button == correct_btn else 'Incorrect' | |
| return outcome, mg, hw, mh, mp | |
| css = """ | |
| body, .gradio-container { | |
| font-family: Arial, sans-serif; | |
| } | |
| .gr-input, .gr-textarea { | |
| } | |
| .class-intro { | |
| padding: 15px; | |
| margin-bottom: 20px; | |
| border-radius: 5px; | |
| } | |
| .class-intro h2 { | |
| margin-top: 0; | |
| } | |
| .class-intro p { | |
| margin-bottom: 5px; | |
| } | |
| """ | |
| class_intro_html = """ | |
| <div class="class-intro"> | |
| <h2>Text Classes</h2> | |
| <p><strong>Human-Written:</strong> Original text created by humans.</p> | |
| <p><strong>Machine-Generated:</strong> Text created by AI from basic prompts, without style instructions.</p> | |
| <p><strong>Human-Written, Machine-Polished:</strong> Human text refined by AI for grammar and flow, without new content.</p> | |
| <p><strong>Machine-Written, Machine-Humanized:</strong> AI-generated text modified to mimic human writing style.</p> | |
| </div> | |
| """ | |
| with gr.Blocks(css=css) as demo: | |
| gr.Markdown("""<h1><centre>LLM-DetectAIve</center></h1>""") | |
| with gr.Tab('Try it!'): | |
| gr.HTML(class_intro_html) | |
| with gr.Row(): | |
| input_text = gr.Textbox(placeholder="Paste your text here...", label="Text", lines=10, max_lines=15) | |
| with gr.Row(): | |
| wc = gr.Markdown("0/500 words (Minimum 50 words)") | |
| with gr.Row(): | |
| check_button = gr.Button("Check Origin", variant="primary", interactive=False) | |
| clear_button = gr.ClearButton([input_text], variant="stop") | |
| out = gr.Label(label='Result') | |
| clear_button.add(out) | |
| check_button.click(fn=update_detection_tab, inputs=[input_text], outputs=out) | |
| input_text.change(count_words_detection_tab, input_text, wc, show_progress=False) | |
| input_text.input( | |
| active_button_detection_tab, | |
| [input_text], | |
| [check_button], | |
| ) | |
| clear_button.click( | |
| clear_detection_tab, | |
| inputs=[], | |
| outputs=[input_text, check_button], | |
| ) | |
| with gr.Tab('Challenge Yourself!'): | |
| with gr.Row(): | |
| generate = gr.Button("Generate Sample Text", variant="primary") | |
| clear = gr.ClearButton([], variant="stop") | |
| with gr.Row(): | |
| text = gr.Textbox(value="", label="Text", lines=20, interactive=False) | |
| with gr.Row(): | |
| mg = gr.Button("Machine-Generated", variant="secondary", interactive=False) | |
| hw = gr.Button("Human-Written", variant="secondary", interactive=False) | |
| mh = gr.Button("Machine-Humanized", variant="secondary", interactive=False) | |
| mp = gr.Button("Machine-Polished", variant="secondary", interactive=False) | |
| with gr.Row(): | |
| result = gr.Label(label="Result", value="") | |
| clear.add([result, text]) | |
| generate.click(generate_text_challenge_tab, [], [text, mg, hw, mh, mp, result]) | |
| for button in [mg, hw, mh, mp]: | |
| button.click(show_result_challenge_tab, [button], [result, mg, hw, mh, mp]) | |
| clear.click(lambda: ("", | |
| gr.Button("Machine-Generated", variant="secondary", interactive=False), | |
| gr.Button("Human-Written", variant="secondary", interactive=False), | |
| gr.Button("Machine-Humanized", variant="secondary", interactive=False), | |
| gr.Button("Machine-Polished", variant="secondary", interactive=False), | |
| ""), | |
| outputs=[text, mg, hw, mh, mp, result]) | |
| demo.launch(share=False) | |