// Handles K-Means and Balanced K-Means clustering event import { getLineEmbeddings } from './embedding.js'; import { kmeans, balancedKMeans } from './clustering.js'; const task = "Given a textual input sentence, retrieve relevant categories that best describe it."; export async function handleKMeansEvent() { const progressBar = document.getElementById("progress-bar"); const progressBarInner = document.getElementById("progress-bar-inner"); progressBar.style.display = "block"; progressBarInner.style.width = "0%"; const text = document.getElementById("input").value; // Remove ## lines for embedding const lines = text.split(/\n/).map(x => x.trim()).filter(x => x && !x.startsWith("##")); const embeddings = await getLineEmbeddings(lines, task); const n = embeddings.length; if (n < 2) return; const requestedK = parseInt(document.getElementById("kmeans-k").value) || 3; const k = Math.max(2, Math.min(requestedK, n)); // Read clustering type and beta const clusteringType = document.getElementById("kmeans-type").value; const beta = parseFloat(document.getElementById("kmeans-beta").value) || 0.01; let labels; if (clusteringType === "balancedKMeans") { labels = balancedKMeans(embeddings, k, beta).labels; } else { labels = kmeans(embeddings, k).labels; } // Build clustered text for textarea const clustered = Array.from({ length: k }, () => []); for (let i = 0; i < n; ++i) clustered[labels[i]].push(lines[i]); const clusterNames = Array.from({ length: k }, (_, c) => `Cluster ${c + 1}`); document.getElementById("input").value = clustered.map((g, i) => `## ${clusterNames[i]}\n${g.join("\n")}` ).join("\n\n\n"); progressBarInner.style.width = "100%"; }