File size: 3,950 Bytes
f7a1403
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch

# Load ProBERT (fine-tuned)
probert_model = AutoModelForSequenceClassification.from_pretrained("collapseindex/ProBERT-1.0")
probert_tokenizer = AutoTokenizer.from_pretrained("collapseindex/ProBERT-1.0")

# Load DistilBERT base (for comparison)
base_model = AutoModelForSequenceClassification.from_pretrained("distilbert-base-uncased", num_labels=3)
base_tokenizer = AutoTokenizer.from_pretrained("distilbert-base-uncased")

LABELS = ["process_clarity", "rhetorical_confidence", "scope_blur"]

EXAMPLES = [
    ["This revolutionary AI will transform your business and guarantee results."],
    ["Step 1: Load data. Step 2: Validate schema. Step 3: Return results."],
    ["Trust your intuition and embrace the journey. The universe has a plan."],
    ["First, check if the input is null. If null, return error. Otherwise, process the request."],
    ["Our cutting-edge solution leverages synergies to maximize value propositions."],
]

def classify(text):
    # ProBERT predictions
    probert_inputs = probert_tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
    with torch.no_grad():
        probert_outputs = probert_model(**probert_inputs)
    probert_probs = torch.softmax(probert_outputs.logits, dim=1)[0]
    
    # Base DistilBERT predictions
    base_inputs = base_tokenizer(text, return_tensors="pt", truncation=True, max_length=128)
    with torch.no_grad():
        base_outputs = base_model(**base_inputs)
    base_probs = torch.softmax(base_outputs.logits, dim=1)[0]
    
    # ProBERT results
    probert_top_prob = float(probert_probs.max())
    probert_top_idx = int(probert_probs.argmax())
    probert_top_label = LABELS[probert_top_idx]
    probert_predictions = {LABELS[i]: float(probert_probs[i]) for i in range(len(LABELS))}
    probert_confidence = f"**ProBERT Top Prediction:** {probert_top_label} (Confidence: {probert_top_prob:.1%})"
    
    # Base DistilBERT results
    base_top_prob = float(base_probs.max())
    base_top_idx = int(base_probs.argmax())
    base_top_label = LABELS[base_top_idx]
    base_predictions = {LABELS[i]: float(base_probs[i]) for i in range(len(LABELS))}
    base_confidence = f"**DistilBERT Base:** {base_top_label} (Confidence: {base_top_prob:.1%})"
    
    # Comparison text
    if probert_top_label == base_top_label:
        comparison = f"✅ **Both models agree:** {probert_top_label}"
    else:
        comparison = f"⚠️ **Disagreement:** ProBERT says {probert_top_label}, Base says {base_top_label}"
    
    return probert_predictions, probert_confidence, base_predictions, base_confidence, comparison

demo = gr.Interface(
    fn=classify,
    inputs=gr.Textbox(lines=3, placeholder="Enter text here...", label="Input Text"),
    outputs=[
        gr.Label(num_top_classes=3, label="ProBERT v1.0 (Fine-tuned)"),
        gr.Markdown(label="ProBERT Confidence"),
        gr.Label(num_top_classes=3, label="DistilBERT Base (Untrained)"),
        gr.Markdown(label="Base Confidence"),
        gr.Markdown(label="Comparison")
    ],
    title="ProBERT v1.0 vs DistilBERT Base",
    description="""
    **Compare fine-tuned ProBERT against base DistilBERT.**
    
    - 🟢 **process_clarity**: Step-by-step reasoning you can verify
    - 🟠 **rhetorical_confidence**: Assertive claims without supporting process
    - 🔴 **scope_blur**: Vague generalizations with ambiguous boundaries
    
    **ProBERT** is fine-tuned on just 450 examples (150 per class) to detect rhetorical patterns. **DistilBERT Base** has random weights (no training). Notice how base gives ~33% uniform noise while ProBERT shows sharp separation. That's what fine-tuning adds!
    
    **Model:** [collapseindex/ProBERT-1.0](https://huggingface.co/collapseindex/ProBERT-1.0)
    """,
    examples=EXAMPLES,
    theme="default",
)

if __name__ == "__main__":
    demo.launch()