Update word-emb-hierarchy visualization: adjusted styles, added new models (DeepSeek, LLaMA, GPT-4), and modified layout dimensions.
403911f
| <!-- The container for your D3 visualization --> | |
| <div id="my-word-emb-vis"></div> | |
| <!-- Include D3 (if Distill hasn't already) --> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/7.8.5/d3.min.js"></script> | |
| <!-- Define your visualization styles, scoping to #my-word-emb-vis --> | |
| <style> | |
| /* Scope all rules to the container ID to avoid conflicts */ | |
| #my-word-emb-vis .node circle { | |
| fill: #fff; | |
| stroke: #361E9A; | |
| stroke-width: 2px; | |
| transition: fill 0.3s, r 0.3s; | |
| cursor: pointer; | |
| } | |
| #my-word-emb-vis .node text { | |
| font-size: 14px; | |
| transition: font-size 0.3s, fill 0.3s; | |
| cursor: pointer; | |
| pointer-events: none; | |
| } | |
| #my-word-emb-vis .link { | |
| fill: none; | |
| stroke: #cb98af; | |
| stroke-width: 2px; | |
| transition: stroke 0.3s, stroke-width 0.3s; | |
| } | |
| #my-word-emb-vis .parent { | |
| font-weight: bold; | |
| } | |
| #my-word-emb-vis .node-highlighted circle { | |
| fill: #361E9A; | |
| r: 8; | |
| } | |
| #my-word-emb-vis .node-highlighted text { | |
| font-size: 16px; | |
| font-weight: bold; | |
| fill: #4682b4; | |
| } | |
| #my-word-emb-vis .link-highlighted { | |
| stroke: #ce6d99; | |
| stroke-width: 3px; | |
| } | |
| </style> | |
| <script type="text/javascript"> | |
| (function() { | |
| // Data structure representing the hierarchy | |
| const data = { | |
| name: "Word Embedding", | |
| children: [ | |
| { | |
| name: "Traditional Word Embedding", | |
| children: [ | |
| { name: "Count Vector" }, | |
| { name: "TF-IDF" }, | |
| { name: "Co-Occurrence Matrix" } | |
| ] | |
| }, | |
| { | |
| name: "Static Word Embedding", | |
| children: [ | |
| { name: "Word2Vec" }, | |
| { name: "Glove" }, | |
| { name: "Fast Text" } | |
| ] | |
| }, | |
| { | |
| name: "Contextualized Word Embedding", | |
| children: [ | |
| { name: "ELMo" }, | |
| { name: "GPT & GPT 2" }, | |
| { name: "BERT" }, | |
| { name: "DeepSeek" }, | |
| { name: "LLaMA" }, | |
| { name: "GPT-4" } | |
| ] | |
| } | |
| ] | |
| }; | |
| // Dimensions | |
| const width = 800; | |
| const height = 500; | |
| const margin = { top: 20, right: 200, bottom: 20, left: 150 }; | |
| // Create tree layout | |
| const treeLayout = d3.tree() | |
| .size([height - margin.top - margin.bottom, width - margin.right - margin.left]); | |
| // Convert data to hierarchy | |
| const root = d3.hierarchy(data); | |
| treeLayout(root); | |
| // Create the SVG inside our container | |
| const svg = d3.select("#my-word-emb-vis") | |
| .append("svg") | |
| .attr("width", width) | |
| .attr("height", height) | |
| .append("g") | |
| .attr("transform", `translate(${margin.left},${margin.top})`); | |
| // Create links | |
| svg.selectAll(".link") | |
| .data(root.links()) | |
| .enter() | |
| .append("path") | |
| .attr("class", "link") | |
| .attr("d", d3.linkHorizontal() | |
| .x(d => d.y) | |
| .y(d => d.x) | |
| ); | |
| // Create nodes | |
| const node = svg.selectAll(".node") | |
| .data(root.descendants()) | |
| .enter() | |
| .append("g") | |
| .attr("class", "node") | |
| .attr("transform", d => `translate(${d.y},${d.x})`) | |
| .attr("id", d => `node-${d.data.name.replace(/\s+/g, '-').replace(/[&]/g, 'and').toLowerCase()}`) | |
| .on("mouseover", function(event, d) { | |
| // Highlight the current node | |
| d3.select(this).classed("node-highlighted", true); | |
| // Highlight all parent links and nodes | |
| let ancestor = d; | |
| while (ancestor.parent) { | |
| const linkIndex = root.links().findIndex(link => | |
| link.source === ancestor.parent && link.target === ancestor | |
| ); | |
| if (linkIndex !== -1) { | |
| d3.selectAll(".link").each(function(linkData, i) { | |
| if (i === linkIndex) { | |
| d3.select(this).classed("link-highlighted", true); | |
| } | |
| }); | |
| } | |
| d3.select(`#node-${ancestor.parent.data.name.replace(/\s+/g, '-').replace(/[&]/g, 'and').toLowerCase()}`) | |
| .classed("node-highlighted", true); | |
| ancestor = ancestor.parent; | |
| } | |
| }) | |
| .on("mouseout", function() { | |
| // Remove all highlights | |
| d3.selectAll(".node").classed("node-highlighted", false); | |
| d3.selectAll(".link").classed("link-highlighted", false); | |
| }); | |
| // Add circles to nodes | |
| node.append("circle") | |
| .attr("r", 6); | |
| // Add text labels | |
| node.append("text") | |
| .attr("dy", ".35em") | |
| .attr("x", d => { | |
| if (d.depth === 0) return -15; | |
| else if (d.depth === 1) return -15; | |
| else return 15; | |
| }) | |
| .attr("text-anchor", d => { | |
| if (d.depth === 0) return "end"; | |
| else if (d.depth === 1) return "end"; | |
| else return "start"; | |
| }) | |
| .attr("class", d => d.depth <= 1 ? "parent" : "") | |
| .text(d => d.data.name); | |
| })(); | |
| </script> | |