The-Array / app.py
Threadbourne's picture
Update app.py
0403faa verified
Raw
History Blame Contribute Delete
4.94 kB
import gradio as gr
import pandas as pd
import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
# 1. Load the Brain
model = SentenceTransformer('all-MiniLM-L6-v2')
def analyze_trinity(text_a, label_a, text_b, label_b, text_c, label_c):
# FALLBACK LABELS (If user leaves them blank)
if not label_a.strip(): label_a = "Input A"
if not label_b.strip(): label_b = "Input B"
if not label_c.strip(): label_c = "Input C"
clean_labels = [label_a, label_b, label_c]
texts = [text_a.strip(), text_b.strip(), text_c.strip()]
# Validation
if not any(texts):
return pd.DataFrame(), "Waiting for signals...", "Waiting for signals..."
# --- PART 1: THE ALIGNMENT MATRIX (With Custom Names) ---
# We use embeddings to calculate how 'close' each text is to the others
embeddings = model.encode(texts)
matrix = cosine_similarity(embeddings)
# Create the DataFrame with YOUR custom names
df_matrix = pd.DataFrame(matrix, columns=clean_labels, index=clean_labels)
df_matrix = df_matrix.round(3)
# --- PART 2: FINGERPRINTS (Unique Vibe) ---
# TF-IDF to find words unique to each specific input
try:
tfidf = TfidfVectorizer(stop_words='english')
tfidf_matrix = tfidf.fit_transform(texts)
feature_names = np.array(tfidf.get_feature_names_out())
signatures = ""
for i, label in enumerate(clean_labels):
if not texts[i]: continue # Skip empty boxes
row = tfidf_matrix[i].toarray().flatten()
top_indices = row.argsort()[-5:][::-1]
top_words = feature_names[top_indices]
# Only keep words with actual weight
valid_words = [w for w, idx in zip(top_words, top_indices) if row[idx] > 0]
signatures += f"🔹 {label.upper()}: {', '.join(valid_words)}\n"
except:
signatures = "Not enough data for fingerprinting."
# --- PART 3: THE CONSENSUS (Universal vs Majority) ---
vectorizer = CountVectorizer(stop_words='english')
try:
dtm = vectorizer.fit_transform(texts)
vocab = vectorizer.get_feature_names_out()
presence = (dtm.toarray() > 0).astype(int)
# UNIVERSAL: Present in all 3 (Sum = 3)
univ_indices = np.where(presence.sum(axis=0) == 3)[0]
univ_words = vocab[univ_indices]
# MAJORITY: Present in 2 (Sum = 2)
maj_indices = np.where(presence.sum(axis=0) == 2)[0]
maj_words = vocab[maj_indices]
consensus_text = ""
if len(univ_words) > 0:
consensus_text += f"🔥 UNIVERSAL TRUTH (3/3): {', '.join(univ_words)}\n\n"
else:
consensus_text += "❌ NO UNIVERSAL TRUTH FOUND.\n\n"
if len(maj_words) > 0:
consensus_text += f"⚠️ MAJORITY REPORT (2/3): {', '.join(maj_words)}"
else:
consensus_text += "⚠️ NO PARTIAL ALIGNMENT FOUND."
except:
consensus_text = "Waiting for more data..."
return df_matrix, signatures, consensus_text
# --- UI BUILD (Flexible Inputs) ---
with gr.Blocks(theme=gr.themes.Glass()) as app:
gr.Markdown("# 🕸️ THE ARRAY v0.2")
gr.Markdown("### FlameTeam Multi-Model Alignment System")
with gr.Row():
# COLUMN 1
with gr.Column(min_width=100):
lbl_a = gr.Textbox(label="Label 1", value="Model A", placeholder="Name this input...")
box_a = gr.TextArea(show_label=False, placeholder="Paste text here...", lines=4)
# COLUMN 2
with gr.Column(min_width=100):
lbl_b = gr.Textbox(label="Label 2", value="Model B", placeholder="Name this input...")
box_b = gr.TextArea(show_label=False, placeholder="Paste text here...", lines=4)
# COLUMN 3
with gr.Column(min_width=100):
lbl_c = gr.Textbox(label="Label 3", value="Model C", placeholder="Name this input...")
box_c = gr.TextArea(show_label=False, placeholder="Paste text here...", lines=4)
btn = gr.Button("RUN THE ARRAY", variant="primary")
# RESULTS
gr.Markdown("### 1. The Alignment Matrix")
out_matrix = gr.Dataframe(label="Cosine Similarity Grid")
with gr.Row():
with gr.Column():
gr.Markdown("### 2. Unique Fingerprints")
out_signatures = gr.Textbox(label="Distinctive Terms (TF-IDF)", lines=5)
with gr.Column():
gr.Markdown("### 3. The Consensus")
out_consensus = gr.Textbox(label="Shared Concepts", lines=5)
btn.click(analyze_trinity, inputs=[box_a, lbl_a, box_b, lbl_b, box_c, lbl_c], outputs=[out_matrix, out_signatures, out_consensus])
app.launch()