LLM-DetectAIve / app.py
raj-tomar001's picture
Update app.py
75c5a84 verified
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)