| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8" /> |
| <title>Ettin Embedding Scatterplot</title> |
| <style> |
| * { |
| margin: 0; |
| padding: 0; |
| box-sizing: border-box; |
| } |
| body { |
| font-family: Arial, sans-serif; |
| display: flex; |
| height: 100vh; |
| margin: 0; |
| overflow: hidden; |
| } |
| |
| #left-pane, |
| #right-pane { |
| flex: 1; |
| display: flex; |
| flex-direction: column; |
| padding: 20px; |
| box-sizing: border-box; |
| overflow: hidden; |
| gap: 4px; |
| } |
| |
| |
| #left-pane { |
| border-right: 1px solid #e0e0e0; |
| } |
| |
| textarea { |
| width: 100%; |
| flex: 1; |
| min-height: 0; |
| resize: none; |
| font-size: 14px; |
| line-height: 1.4; |
| padding: 10px; |
| box-sizing: border-box; |
| border: 1px solid #ccc; |
| border-radius: 4px; |
| margin-bottom: 8px; |
| } |
| |
| button { |
| margin-top: 10px; |
| padding: 8px 16px; |
| font-size: 18px; |
| border: none; |
| background-color: #007bff; |
| color: white; |
| border-radius: 4px; |
| cursor: pointer; |
| } |
| |
| button:disabled { |
| background-color: #aaa; |
| cursor: not-allowed; |
| } |
| |
| #plot { |
| width: 100%; |
| flex: 1; |
| min-height: 0; |
| } |
| </style> |
| </head> |
|
|
| <body> |
| <div id="left-pane"> |
| <h3>Sentences:</h3> |
| <textarea |
| id="text-input" |
| placeholder="Each line is treated as one sentence" |
| ></textarea> |
| <button id="embed-btn">Embed & Plot</button> |
| <p |
| id="status" |
| style=" |
| margin-top: 8px; |
| font-size: 16px; |
| font-weight: 600; |
| text-align: center; |
| " |
| > |
| Loading model... |
| </p> |
| </div> |
|
|
| <div id="right-pane"> |
| <h3>Scatterplot:</h3> |
| <div id="plot"></div> |
| </div> |
|
|
| <script type="module"> |
| import "https://cdn.jsdelivr.net/npm/plotly.js@3.0.1/dist/plotly-basic.min.js"; |
| import { UMAP } from "https://cdn.jsdelivr.net/npm/umap-js@1.4.0/+esm"; |
| import { pipeline } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.6.1"; |
| const sentences = [ |
| |
| "The sun peeked through the clouds after a drizzly morning.", |
| "A gentle breeze rustled the leaves as we walked along the shoreline.", |
| "Heavy rains caused flooding in several low-lying neighborhoods.", |
| "It was so hot that even the birds sought shade under the palm trees.", |
| "By midnight, the temperature had dropped below freezing.", |
| "Thunderstorms lit up the sky with flashes of lightning.", |
| "A thick fog settled over the city streets at dawn.", |
| "The air smelled of ozone after the sudden hailstorm.", |
| "I watched the snowflakes drift silently onto the ground.", |
| "A double rainbow appeared after the rain shower.", |
| "The humidity soared to uncomfortable levels by midday.", |
| "Dust devils formed in the dry desert plains.", |
| "The barometer readings indicated an approaching front.", |
| "A sudden gust of wind knocked over the garden chairs.", |
| "Light drizzle turned into a torrential downpour within minutes.", |
| |
| |
| "The new smartphone features a foldable display and 5G connectivity.", |
| "In the world of AI, transformers have revolutionized natural language processing.", |
| "Quantum computing promises to solve problems beyond classical computers' reach.", |
| "Blockchain technology is being explored for secure voting systems.", |
| "Virtual reality headsets are becoming more affordable and accessible.", |
| "The rise of electric vehicles is reshaping the automotive industry.", |
| "Cloud computing allows businesses to scale resources dynamically.", |
| "Machine learning algorithms can now predict stock market trends with surprising accuracy.", |
| "Augmented reality applications are transforming retail experiences.", |
| "The Internet of Things connects everyday devices to the web for smarter living.", |
| "Cybersecurity threats are evolving, requiring constant vigilance.", |
| "3D printing is enabling rapid prototyping and custom manufacturing.", |
| "Edge computing reduces latency by processing data closer to the source.", |
| "Biometric authentication methods are enhancing security in devices.", |
| "Wearable technology is tracking health metrics in real-time.", |
| "Artificial intelligence is being used to create realistic deepfakes.", |
| |
| |
| "Preheat the oven to 375°F before you start mixing the batter.", |
| "She finely chopped the garlic and sautéed it in two tablespoons of olive oil.", |
| "A pinch of saffron adds a beautiful color and aroma to traditional paella.", |
| "If the soup is too salty, add a peeled potato to absorb excess sodium.", |
| "Let the bread dough rise for at least an hour in a warm, draft-free spot.", |
| "Marinate the chicken overnight in a blend of citrus and spices.", |
| "Use a cast-iron skillet to sear the steak on high heat.", |
| "Whisk the egg whites until they form stiff peaks.", |
| "Fold in the chocolate chips gently to keep the batter airy.", |
| "Brush the pastry with an egg wash for a golden finish.", |
| "Slow-roast the pork shoulder until it falls off the bone.", |
| "Garnish the salad with toasted nuts and fresh herbs.", |
| "Deglaze the pan with white wine for a rich sauce.", |
| "Simmer the curry paste until the aroma intensifies.", |
| "Let the risotto rest before serving to thicken slightly.", |
| |
| |
| "He dribbled past two defenders and sank a three-pointer at the buzzer.", |
| "The marathon runner kept a steady pace despite the sweltering heat.", |
| "Their home team clinched the championship with a last-minute goal.", |
| "NASCAR fans cheered as the cars roared around the oval track.", |
| "She landed a perfect triple axel at the figure skating championship.", |
| "The cyclist pedaled up the steep hill in record time.", |
| "He pitched a no-hitter during the high school baseball game.", |
| "The quarterback threw a touchdown pass under heavy pressure.", |
| "They scored a hat-trick in the hockey final.", |
| "The boxer delivered a swift uppercut in the final round.", |
| "Surfers caught massive waves at dawn on the Pacific coast.", |
| "Fans erupted when the underdog scored the winning goal.", |
| "The swimmer broke the national record in the 200m freestyle.", |
| "The gymnast executed a flawless routine on the balance beam.", |
| "The rugby team celebrated their victory with a traditional haka.", |
| |
| |
| "The stock market rallied after positive earnings reports.", |
| "Investors are closely watching interest rate changes by the Federal Reserve.", |
| "Cryptocurrency prices have been extremely volatile this year.", |
| "Diversification is key to managing investment risk effectively.", |
| "Inflation rates have reached a 40-year high, impacting consumer spending.", |
| "Many companies are adopting ESG criteria to attract socially conscious investors.", |
| "The bond market is reacting to geopolitical tensions and supply chain disruptions.", |
| "Venture capital funding for startups has surged in the tech sector.", |
| "Exchange-traded funds (ETFs) offer a way to invest in diversified portfolios.", |
| "The global economy is recovering from the pandemic, but challenges remain.", |
| "Central banks are exploring digital currencies to modernize payment systems.", |
| "Retail investors are increasingly participating in the stock market through apps.", |
| "Hedge funds are using complex algorithms to gain an edge in trading.", |
| "Real estate prices have skyrocketed in urban areas due to low inventory.", |
| "The startup raised $10 million in its Series A funding round.", |
| |
| |
| "The symphony orchestra played a hauntingly beautiful melody.", |
| "She strummed her guitar softly, filling the room with a warm sound.", |
| "The DJ mixed tracks seamlessly, keeping the crowd dancing all night.", |
| "His voice soared during the high notes of the ballad.", |
| "The band played an acoustic set in the intimate coffee shop.", |
| "Jazz musicians often improvise solos based on the chord changes.", |
| "The opera singer hit the high C with perfect pitch.", |
| "The choir harmonized beautifully, filling the church with sound.", |
| "He composed a symphony that was performed at the concert hall.", |
| "The singer-songwriter wrote heartfelt lyrics about love and loss.", |
| "The rock band headlined the festival, drawing a massive crowd.", |
| "Hip-hop artists use rhythm and rhyme to tell powerful stories.", |
| "The violinist played a virtuosic solo that left the audience in awe.", |
| "Folk music often reflects the culture and traditions of a community.", |
| "The gospel choir lifted spirits with their uplifting performance.", |
| |
| |
| "The fall of the Berlin Wall in 1989 marked the end of the Cold War.", |
| "Ancient Egypt's pyramids are a testament to their architectural prowess.", |
| "Europe's Renaissance period sparked a revival in art and science.", |
| "The signing of the Declaration of Independence in 1776 established the United States.", |
| "The Industrial Revolution transformed economies and societies worldwide.", |
| "Rome was the center of a vast empire that influenced law and governance.", |
| "The discovery of the New World by Christopher Columbus in 1492 changed global trade.", |
| "The French Revolution in 1789 led to significant political and social change.", |
| "World War II was a global conflict that reshaped international relations.", |
| "The fall of the Roman Empire in 476 AD marked the beginning of the Middle Ages.", |
| "The invention of the printing press revolutionized the spread of knowledge.", |
| "The Cold War was characterized by political tension between the U.S. and the Soviet Union.", |
| "The ancient Silk Road connected East and West through trade routes.", |
| "The signing of the Magna Carta in 1215 established principles of due process.", |
| "Exploration during the Age of Discovery expanded European empires across the globe.", |
| ].sort(() => Math.random() - 0.5); |
| |
| document.getElementById("text-input").value = sentences.join("\n"); |
| |
| const statusEl = document.getElementById("status"); |
| const embed = await pipeline( |
| "feature-extraction", |
| "jhu-clsp/ettin-encoder-17m", |
| { device: "webgpu", dtype: "fp32" }, |
| ); |
| statusEl.textContent = "Ready!"; |
| |
| document.getElementById("embed-btn").disabled = false; |
| |
| document |
| .getElementById("embed-btn") |
| .addEventListener("click", async () => { |
| const textInput = document.getElementById("text-input").value.trim(); |
| if (!textInput) { |
| alert("No text detected."); |
| return; |
| } |
| |
| const sentences = textInput |
| .split("\n") |
| .map((s) => s.trim()) |
| .filter((s) => s.length > 0); |
| if (sentences.length === 0) { |
| alert("No non-empty lines detected."); |
| return; |
| } |
| |
| statusEl.textContent = `Embedding ${sentences.length} sentence(s)...`; |
| const output = await embed( |
| sentences, |
| { pooling: "cls", normalize: true }, |
| ); |
| const embeddings = output.tolist(); |
| |
| statusEl.textContent = "Running UMAP (2D projection)..."; |
| const nNeighbors = Math.max(1, Math.min(sentences.length - 1, 15)); |
| const umap = new UMAP({ nComponents: 2, nNeighbors, minDist: 0.1 }); |
| const coords = umap.fit(embeddings); |
| |
| statusEl.textContent = "Plotting projection..."; |
| const data = [{ |
| type: "scattergl", |
| mode: "markers", |
| x: coords.map(p => p[0]), |
| y: coords.map(p => p[1]), |
| text: sentences, |
| hoverinfo: "text", |
| marker: { |
| color: "#1f77b4", |
| size: 12, |
| }, |
| }]; |
| |
| const layout = { |
| title: { text: "Labels" }, |
| margin: { l: 0, r: 0, t: 0, b: 0 }, |
| }; |
| const config = { responsive: true }; |
| Plotly.newPlot("plot", data, layout, config); |
| statusEl.textContent = "Done! Hover over points to see sentences."; |
| }); |
| </script> |
| </body> |
| </html> |
|
|