{"id":48913,"date":"2026-03-15T11:03:16","date_gmt":"2026-03-15T03:03:16","guid":{"rendered":"https:\/\/www.geobok.com\/geo-toolkit\/answer-block-geo-scorer\/"},"modified":"2026-04-03T11:07:38","modified_gmt":"2026-04-03T03:07:38","slug":"answer-block-geo-scorer","status":"publish","type":"page","link":"https:\/\/www.geobok.com\/en\/geo-toolkit\/answer-block-geo-scorer\/","title":{"rendered":"Answer Block GEO Scorer"},"content":{"rendered":"\n<style>\n\/* ===== B1 \u7279\u6709\u6837\u5f0f ===== *\/\n\n\/* \u603b\u5206\u5927\u5361\u7247 *\/\n.as-score-card { text-align: center; padding: 36px 20px; border-radius: var(--geo-radius-xl); margin-bottom: 24px; position: relative; overflow: hidden; }\n.as-score-card--excellent { background: linear-gradient(135deg, #f0fdf4, #dcfce7); border: 1px solid var(--geo-success-border); }\n.as-score-card--good { background: linear-gradient(135deg, #f0fdfa, #ccfbf1); border: 1px solid #99f6e4; }\n.as-score-card--fair { background: linear-gradient(135deg, #fffbeb, #fef3c7); border: 1px solid var(--geo-warn-border); }\n.as-score-card--poor { background: linear-gradient(135deg, #fef2f2, #fee2e2); border: 1px solid var(--geo-danger-border); }\n\n.as-total-score { font-size: 64px; font-weight: 800; line-height: 1; letter-spacing: -2px; }\n.as-score-card--excellent .as-total-score { color: var(--geo-success); }\n.as-score-card--good .as-total-score { color: var(--geo-primary); }\n.as-score-card--fair .as-total-score { color: var(--geo-warn); }\n.as-score-card--poor .as-total-score { color: var(--geo-danger); }\n\n.as-score-unit { font-size: 24px; font-weight: 600; opacity: 0.6; }\n.as-score-label { font-size: 13px; color: var(--geo-text-faint); font-weight: 600; text-transform: uppercase; letter-spacing: 1px; margin-top: 8px; }\n.as-score-grade { display: inline-block; margin-top: 12px; padding: 5px 18px; border-radius: var(--geo-radius-pill); font-size: 14px; font-weight: 700; background: rgba(255,255,255,0.7); }\n\n\/* \u56db\u7ef4\u5ea6\u7f51\u683c *\/\n.as-dims { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin-bottom: 24px; }\n.as-dim-card { padding: 20px; border-radius: var(--geo-radius-md); border: 1px solid var(--geo-border); background: #fff; }\n.as-dim-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; }\n.as-dim-name { font-size: 14px; font-weight: 700; color: var(--geo-text-primary); display: flex; align-items: center; gap: 6px; }\n.as-dim-score { font-size: 22px; font-weight: 800; }\n.as-dim-bar { height: 6px; background: var(--geo-border); border-radius: 3px; overflow: hidden; margin-bottom: 10px; }\n.as-dim-bar__fill { height: 100%; border-radius: 3px; transition: width 0.8s var(--geo-ease); }\n.as-dim-detail { font-size: 13px; color: var(--geo-text-muted); line-height: 1.6; }\n\n\/* \u51cf\u5206\u9879\u5217\u8868 *\/\n.as-penalty { display: flex; align-items: flex-start; gap: 12px; padding: 14px 16px; border-radius: var(--geo-radius-sm); border: 1px solid var(--geo-border); margin-bottom: 8px; background: #fff; transition: background 0.15s; }\n.as-penalty:hover { background: var(--geo-bg-page); }\n.as-penalty__pos { font-size: 12px; font-weight: 700; color: var(--geo-danger); background: var(--geo-danger-bg); padding: 2px 8px; border-radius: 4px; white-space: nowrap; flex-shrink: 0; }\n.as-penalty__issue { font-size: 14px; font-weight: 600; color: var(--geo-text-primary); }\n.as-penalty__fix { font-size: 13px; color: var(--geo-text-muted); margin-top: 2px; }\n\n\/* \u6539\u5199\u5efa\u8bae *\/\n.as-hints { padding: 20px; background: var(--geo-primary-light); border: 1px solid #99f6e4; border-radius: var(--geo-radius-md); }\n.as-hint-item { display: flex; align-items: baseline; gap: 8px; font-size: 14px; color: var(--geo-primary-dark); padding: 5px 0; line-height: 1.6; }\n.as-hint-item::before { content: \"\ud83d\udca1\"; flex-shrink: 0; }\n\n@media (max-width: 768px) {\n    .as-dims { grid-template-columns: 1fr; }\n    .as-total-score { font-size: 48px; }\n}\n<\/style>\n\n<div class=\"geo-card\">\n    <div class=\"geo-hero\">\n        <h2 class=\"geo-hero__title\">\ud83d\udcdd Answer Block GEO Scorer<\/h2>\n        <p class=\"geo-hero__desc\">Paste your above-the-fold content + target query \u2014 get scored on info density, semantic match, conclusion-first, and GEO compliance.<\/p>\n    \n<div class=\"geo-about\">\n    <details class=\"geo-about__section\">\n        <summary>\ud83d\udcd6 What can this tool do?<\/summary>\n        <div class=\"geo-about__body\">\n            <p>AI extracts fragments, not full pages. It needs a passage it can lift and reuse on the spot. This scorer evaluates your content across four dimensions \u2014 information density, semantic alignment, conclusion-first structure, and GEO compliance \u2014 each mapping to Chapter 5's core answer-block characteristics.<\/p>\n            <p class=\"geo-about__ref\">See <em>Make AI Speak for You: The Definitive Guide to GEO<\/em>, Ch. 5.1-5.2<\/p>\n        <\/div>\n    <\/details>\n    <details class=\"geo-about__section\">\n        <summary>\u2753 FAQ: GEO Impact<\/summary>\n        <div class=\"geo-about__body\">\n            <div class=\"geo-faq-item\"><h4>What exactly is an answer block?<\/h4><p>A content unit designed for AI extraction \u2014 self-contained, conclusion-first, length-controlled, and statically rendered. It's a content architecture principle, not an HTML tag.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>Why must the conclusion come first?<\/h4><p>Positional encoding gives earlier tokens more attention weight (Strategy 04), and Lost in the Middle depresses mid-context utilization (Strategy 31).<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>Why are pronouns penalized?<\/h4><p>Once a chunk is isolated, pronouns lose their referent \u2014 AI can't tell what you're talking about.<\/p><\/div>\n            <div class=\"geo-faq-item\"><h4>Why does 'contact us for pricing' get flagged?<\/h4><p>It's a semantic dead-end \u2014 AI can't extract actionable data. Replace with a concrete range and it becomes citable.<\/p><\/div>\n        <\/div>\n    <\/details>\n<\/div>\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What exactly is an answer block?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A content unit designed for AI extraction \u2014 self-contained, conclusion-first, length-controlled, and statically rendered. It's a content architecture principle, not an HTML tag.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why must the conclusion come first?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Positional encoding gives earlier tokens more attention weight (Strategy 04), and Lost in the Middle depresses mid-context utilization (Strategy 31).\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why are pronouns penalized?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Once a chunk is isolated, pronouns lose their referent \u2014 AI can't tell what you're talking about.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Why does 'contact us for pricing' get flagged?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It's a semantic dead-end \u2014 AI can't extract actionable data. Replace with a concrete range and it becomes citable.\"\n      }\n    }\n  ]\n}\n<\/script>\n\n<\/div>\n\n    <div class=\"geo-action\">\n        <div class=\"geo-form-grid\">\n            <div class=\"geo-field\">\n                <label class=\"geo-label\">\u76ee\u6807\u67e5\u8be2\u8bcd <span class=\"geo-label--hint\">\uff08\u7528\u6237\u4f1a\u95ee AI \u4ec0\u4e48\u95ee\u9898\uff1f\uff09<\/span><\/label>\n                <input type=\"text\" id=\"as-query\" class=\"geo-input\" placeholder=\"e.g. best projector for home\">\n            <\/div>\n            <div class=\"geo-field\">\n                <label class=\"geo-label\">\u5f85\u8bc4\u4f30\u5185\u5bb9 <span class=\"geo-label--hint\">\uff08\u7c98\u8d34\u9996\u5c4f\u7b54\u6848\u5757\uff0c\u5efa\u8bae 200-800 \u5b57\uff09<\/span><\/label>\n                <textarea id=\"as-text\" class=\"geo-input\" style=\"min-height:200px;\" placeholder=\"\u5c06\u60a8\u7684\u9996\u5c4f\u6838\u5fc3\u5185\u5bb9\u7c98\u8d34\u5230\u8fd9\u91cc...&#10;&#10;\u4f8b\u5982\uff1a\u6781\u7c73 H6 Pro \u6295\u5f71\u4eea\u91c7\u7528 4K \u5206\u8fa8\u7387\uff0c\u4eae\u5ea6\u8fbe 2800 CVIA \u6d41\u660e\uff0c\u652f\u6301 HDR10+ \u6807\u51c6\uff0c\u9002\u7528\u4e8e\u5bb6\u5ead\u5f71\u9662\u3001\u6e38\u620f\u3001\u529e\u516c\u7b49\u591a\u573a\u666f\u3002\u5185\u7f6e\u54c8\u66fc\u5361\u987f\u97f3\u54cd...\"><\/textarea>\n            <\/div>\n            <div style=\"display:flex;justify-content:space-between;align-items:center;\">\n                <span id=\"as-charcount\" style=\"font-size:13px;color:var(--geo-text-faint);\">0 \u5b57<\/span>\n                <button id=\"as-btn\" class=\"geo-btn\">Score content<\/button>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"as-result\" class=\"geo-result\" style=\"padding: 0 var(--geo-space-xl) var(--geo-space-xl);\"><\/div>\n<\/div>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function(){\n    var btn = document.getElementById('as-btn');\n    var result = document.getElementById('as-result');\n    var textArea = document.getElementById('as-text');\n    var charCount = document.getElementById('as-charcount');\n\n    textArea.addEventListener('input', function(){ charCount.textContent = textArea.value.length + ' \u5b57'; });\n\n    btn.addEventListener('click', async function(){\n        var query = document.getElementById('as-query').value.trim();\n        var text = textArea.value.trim();\n        if(!query){ GeoAPI.showError(result, '\u8bf7\u8f93\u5165\u76ee\u6807\u67e5\u8be2\u8bcd'); return; }\n        if(!text){ GeoAPI.showError(result, '\u8bf7\u7c98\u8d34\u5f85\u8bc4\u4f30\u7684\u5185\u5bb9'); return; }\n        if(text.length < 20){ GeoAPI.showError(result, '\u5185\u5bb9\u592a\u77ed\uff0c\u5efa\u8bae\u81f3\u5c11 50 \u5b57\u4ee5\u4e0a'); return; }\n\n        GeoAPI.disableBtn(btn, GeoAPI.t('btn.scoring'));\n        GeoAPI.showLoading(result, GeoAPI.t('score.loading'));\n\n        try {\n            var data = await GeoAPI.post('\/geo\/answer-block-score', GeoAPI.withLang({ text: text, query: query }));\n            renderScore(data);\n        } catch(e) {\n            if(!e._geoAuthHandled) GeoAPI.showError(result, e.message);\n        } finally {\n            GeoAPI.enableBtn(btn);\n        }\n    });\n\n    function getScoreColor(score) {\n        if(score >= 80) return 'var(--geo-success)';\n        if(score >= 60) return 'var(--geo-primary)';\n        if(score >= 40) return 'var(--geo-warn)';\n        return 'var(--geo-danger)';\n    }\n\n    function getCardClass(score) {\n        if(score >= 80) return 'excellent';\n        if(score >= 60) return 'good';\n        if(score >= 40) return 'fair';\n        return 'poor';\n    }\n\n    function renderScore(data) {\n        var html = '';\n        var cls = getCardClass(data.total_score);\n        var dims = data.dimensions || {};\n\n        \/* ---- 1. \u603b\u5206\u5361\u7247 ---- *\/\n        html += '<div class=\"as-score-card as-score-card--' + cls + '\">'\n              + '<div class=\"as-total-score\">' + data.total_score + '<span class=\"as-score-unit\">\/100<\/span><\/div>'\n              + '<div class=\"as-score-label\">GEO \u7b54\u6848\u5757\u7efc\u5408\u8bc4\u5206<\/div>'\n              + '<div class=\"as-score-grade\">' + GeoAPI.escapeHtml(data.overall_grade) + ' \u00b7 ' + GeoAPI.escapeHtml(data.overall_msg) + '<\/div>'\n              + '<\/div>';\n\n        \/* ---- 2. \u56db\u7ef4\u5ea6\u5361\u7247 ---- *\/\n        html += '<div class=\"as-dims\">';\n        var dimConfig = [\n            { key: 'info_density',     icon: '\ud83d\udcca', name: '\u4fe1\u606f\u5bc6\u5ea6' },\n            { key: 'semantic_match',   icon: '\ud83c\udfaf', name: '\u8bed\u4e49\u5339\u914d' },\n            { key: 'conclusion_first', icon: '\ud83c\udfc1', name: '\u7ed3\u8bba\u524d\u7f6e' },\n            { key: 'geo_penalties',    icon: '\u26a0\ufe0f', name: 'GEO \u89c4\u8303\u6027' },\n        ];\n\n        dimConfig.forEach(function(dc) {\n            var d = dims[dc.key] || {};\n            var s = d.score || 0;\n            var c = getScoreColor(s);\n            html += '<div class=\"as-dim-card\">'\n                  + '<div class=\"as-dim-head\">'\n                  + '<span class=\"as-dim-name\">' + dc.icon + ' ' + dc.name + '<\/span>'\n                  + '<span class=\"as-dim-score\" style=\"color:' + c + '\">' + s + '<\/span>'\n                  + '<\/div>'\n                  + '<div class=\"as-dim-bar\"><div class=\"as-dim-bar__fill\" style=\"width:' + s + '%;background:' + c + '\"><\/div><\/div>'\n                  + '<div class=\"as-dim-detail\">' + GeoAPI.escapeHtml(d.detail || '') + '<\/div>'\n                  + '<\/div>';\n        });\n        html += '<\/div>';\n\n        \/* ---- 3. \u51cf\u5206\u9879\u660e\u7ec6 ---- *\/\n        var penalties = data.penalties_detail || [];\n        if(penalties.length > 0) {\n            html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\ud83d\udd0d \u51cf\u5206\u9879\u660e\u7ec6<\/h3>'\n                  + '<span class=\"geo-section__desc\">\u5171 ' + penalties.length + ' \u4e2a\u95ee\u9898\uff0c\u9010\u9879\u4fee\u590d\u53ef\u63d0\u5347\u8bc4\u5206<\/span><\/div>';\n            penalties.forEach(function(p) {\n                html += '<div class=\"as-penalty\">'\n                      + '<span class=\"as-penalty__pos\">' + GeoAPI.escapeHtml(p.position) + '<\/span>'\n                      + '<div><div class=\"as-penalty__issue\">' + GeoAPI.escapeHtml(p.issue) + '<\/div>'\n                      + '<div class=\"as-penalty__fix\">\u2192 ' + GeoAPI.escapeHtml(p.suggestion) + '<\/div><\/div>'\n                      + '<\/div>';\n            });\n        }\n\n        \/* ---- 4. \u6539\u5199\u5efa\u8bae ---- *\/\n        var hints = data.rewrite_hints || [];\n        if(hints.length > 0) {\n            html += '<div class=\"geo-section\"><h3 class=\"geo-section__title\">\u270f\ufe0f \u6539\u5199\u5efa\u8bae<\/h3><\/div>';\n            html += '<div class=\"as-hints\">';\n            hints.forEach(function(h) {\n                html += '<div class=\"as-hint-item\">' + GeoAPI.escapeHtml(h) + '<\/div>';\n            });\n            html += '<\/div>';\n        }\n\n        GeoAPI.showResult(result, html);\n    }\n});\n<\/script>\n\n        \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":48884,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-48913","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48913","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/comments?post=48913"}],"version-history":[{"count":0,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48913\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/pages\/48884"}],"wp:attachment":[{"href":"https:\/\/www.geobok.com\/en\/wp-json\/wp\/v2\/media?parent=48913"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}