wip: phase_z2 evidence 파이프라인 + matching 실험(phase2~26) + 프론트 trace 패널 진행분 스냅샷
- src: phase_z2 composition/mapper/pipeline/placement_planner/retry, ai_fallback(prompts/schema/validate), mdx_text_atoms 신규 - Front: PipelineTracePanel 신규, FramePanel/SlideCanvas/Home/designAgentApi 등 갱신 + 테스트 4종 추가 - templates/phase_z2: catalog(component_expansion_registry, node_slot_mapping 신규), frames, families, slide_base 갱신 - tests/matching: phase2~26 매칭 실험 스크립트·리포트·온톨로지 전체 (미커밋 진행분) - tests: b4_v4 evidence, task5~28.5 시리즈, regression(imp95 baseline) 등 신규 테스트 대량 추가 - docs/reference: MDX 구조 인벤토리, MDX→Frame 구조 계약 문서 - scripts: mdx 계약/parity/coverage/viewport 체크, gitea comment, run sync 유틸 - .gitignore: tmp*.json, chromedriver, .orchestrator, *.pkl, Front_test* 등 임시/스냅샷 제외 미완성 작업의 보존용 스냅샷 커밋 (2026-07-02) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,309 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ko">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>KEYWORD_INVENTORY_1</title>
|
||||
<style>
|
||||
@page { size: A4 portrait; margin: 14mm; }
|
||||
* { box-sizing: border-box; }
|
||||
body {
|
||||
margin: 0;
|
||||
font-family: -apple-system, "Segoe UI", Pretendard, "Malgun Gothic", sans-serif;
|
||||
color: #16324f;
|
||||
background: #ffffff;
|
||||
}
|
||||
@media screen {
|
||||
body {
|
||||
width: 210mm;
|
||||
min-height: 297mm;
|
||||
margin: 10mm auto;
|
||||
padding: 14mm;
|
||||
box-shadow: 0 10px 32px rgba(15, 23, 42, 0.14);
|
||||
}
|
||||
}
|
||||
h1 {
|
||||
margin: 0 0 4mm 0;
|
||||
font-size: 22pt;
|
||||
line-height: 1.08;
|
||||
color: #0f2d52;
|
||||
}
|
||||
.subtitle {
|
||||
margin: 0 0 7mm 0;
|
||||
font-size: 9.4pt;
|
||||
line-height: 1.45;
|
||||
color: #52667d;
|
||||
}
|
||||
.top-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(4, 1fr);
|
||||
gap: 4mm;
|
||||
margin-bottom: 7mm;
|
||||
}
|
||||
.top-card {
|
||||
border: 1px solid #d8e2ec;
|
||||
border-radius: 12px;
|
||||
padding: 4mm 4.5mm;
|
||||
background: linear-gradient(180deg, #f8fbff 0%, #f2f7fb 100%);
|
||||
min-height: 42mm;
|
||||
}
|
||||
.top-card .label {
|
||||
font-size: 8.3pt;
|
||||
font-weight: 800;
|
||||
color: #2f6fed;
|
||||
margin-bottom: 2mm;
|
||||
}
|
||||
.top-card .value {
|
||||
font-size: 18pt;
|
||||
font-weight: 800;
|
||||
color: #0f172a;
|
||||
margin-bottom: 1.2mm;
|
||||
}
|
||||
.top-card .desc {
|
||||
font-size: 8.15pt;
|
||||
line-height: 1.45;
|
||||
color: #4b5563;
|
||||
}
|
||||
.section-title {
|
||||
margin: 0 0 4mm 0;
|
||||
font-size: 12.4pt;
|
||||
font-weight: 800;
|
||||
color: #12355b;
|
||||
padding-left: 3mm;
|
||||
border-left: 4px solid #2f6fed;
|
||||
}
|
||||
.process-box {
|
||||
border: 1px solid #d9e4ef;
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%);
|
||||
padding: 4.5mm 5mm;
|
||||
margin-bottom: 7mm;
|
||||
}
|
||||
.process-grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1.25fr 1fr 1fr;
|
||||
gap: 4mm;
|
||||
}
|
||||
.process-col {
|
||||
background: #fbfdff;
|
||||
border: 1px solid #e3ebf3;
|
||||
border-radius: 12px;
|
||||
padding: 3.5mm 4mm;
|
||||
}
|
||||
.process-col h3 {
|
||||
margin: 0 0 2mm 0;
|
||||
font-size: 9.3pt;
|
||||
color: #1d4ed8;
|
||||
}
|
||||
.process-col p {
|
||||
margin: 0 0 1.5mm 0;
|
||||
font-size: 8.1pt;
|
||||
line-height: 1.52;
|
||||
color: #4b5563;
|
||||
}
|
||||
.hint {
|
||||
margin-top: 2mm;
|
||||
font-size: 7.7pt;
|
||||
color: #64748b;
|
||||
}
|
||||
.bottom-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 5mm;
|
||||
}
|
||||
.keyword-card {
|
||||
border: 1px solid #d9e4ef;
|
||||
border-radius: 14px;
|
||||
background: #fbfdff;
|
||||
padding: 4.5mm 5mm;
|
||||
min-height: 124mm;
|
||||
}
|
||||
.keyword-card.core {
|
||||
background: linear-gradient(180deg, #f8fff8 0%, #f1fbf3 100%);
|
||||
}
|
||||
.keyword-card.set {
|
||||
background: linear-gradient(180deg, #fff9fc 0%, #fff3f8 100%);
|
||||
}
|
||||
.keyword-card.related {
|
||||
background: linear-gradient(180deg, #f8fbff 0%, #f2f6ff 100%);
|
||||
}
|
||||
.keyword-card h2 {
|
||||
margin: 0 0 2mm 0;
|
||||
font-size: 12pt;
|
||||
color: #102a43;
|
||||
}
|
||||
.keyword-card .count {
|
||||
font-size: 21pt;
|
||||
font-weight: 800;
|
||||
color: #0f172a;
|
||||
margin-bottom: 2mm;
|
||||
}
|
||||
.keyword-card .def {
|
||||
font-size: 8.2pt;
|
||||
line-height: 1.52;
|
||||
color: #52667d;
|
||||
margin-bottom: 3mm;
|
||||
}
|
||||
.mini-title {
|
||||
font-size: 8.5pt;
|
||||
font-weight: 800;
|
||||
color: #1d4ed8;
|
||||
margin: 3mm 0 1.5mm 0;
|
||||
}
|
||||
ul {
|
||||
margin: 0;
|
||||
padding-left: 4.8mm;
|
||||
}
|
||||
li {
|
||||
font-size: 8.2pt;
|
||||
line-height: 1.55;
|
||||
margin: 0 0 1.2mm 0;
|
||||
color: #334155;
|
||||
}
|
||||
code {
|
||||
font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
|
||||
font-size: 8pt;
|
||||
background: rgba(47, 111, 237, 0.08);
|
||||
color: #153e75;
|
||||
padding: 1px 5px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
.frame-example {
|
||||
margin-top: 2.4mm;
|
||||
border-top: 1px dashed #d6e0ea;
|
||||
padding-top: 2mm;
|
||||
font-size: 7.95pt;
|
||||
line-height: 1.5;
|
||||
color: #5b6b7d;
|
||||
}
|
||||
.note {
|
||||
margin-top: 5mm;
|
||||
border-top: 1px dashed #cbd5e1;
|
||||
padding-top: 3mm;
|
||||
font-size: 7.55pt;
|
||||
line-height: 1.45;
|
||||
color: #64748b;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>KEYWORD INVENTORY 요약</h1>
|
||||
<div class="subtitle">
|
||||
Figma 프레임, BEPS 마스터, MDX 구간에서 문장을 수집하고, 단어 추출·전처리·표기 통합을 거쳐 최종 키워드집을 만든 과정을 한 장으로 정리한 요약본입니다.
|
||||
</div>
|
||||
|
||||
<div class="top-grid">
|
||||
<div class="top-card">
|
||||
<div class="label">수집 대상</div>
|
||||
<div class="value">37개</div>
|
||||
<div class="desc">
|
||||
Figma 텍스트 <strong>32개 프레임</strong>, BEPS 마스터 <strong>1개</strong>, MDX 검증 구간 <strong>4개</strong>를 대상으로 수집했습니다.
|
||||
</div>
|
||||
</div>
|
||||
<div class="top-card">
|
||||
<div class="label">수집된 문장</div>
|
||||
<div class="value">2,125</div>
|
||||
<div class="desc">
|
||||
Figma <strong>586</strong>, BEPS <strong>1,410</strong>, MDX <strong>129</strong> 문장을 모아 키워드 원천 데이터로 사용했습니다.
|
||||
</div>
|
||||
</div>
|
||||
<div class="top-card">
|
||||
<div class="label">단어 추출 및 전처리</div>
|
||||
<div class="value">13,913 → 14,161</div>
|
||||
<div class="desc">
|
||||
형태소 분석 결과 전체 등장 수는 <strong>13,913</strong>회였고, 약어 보존·표기 통합·공백/기호 정리 후 전체 등장 수는 <strong>14,161</strong>회가 되었습니다.
|
||||
</div>
|
||||
</div>
|
||||
<div class="top-card">
|
||||
<div class="label">전처리 후 최종 키워드</div>
|
||||
<div class="value">1,713개</div>
|
||||
<div class="desc">
|
||||
최종 고유 키워드는 <strong>1,713개</strong>이며, 이 중 중요 표기(<code>DX</code>, <code>BIM</code>, <code>S/W</code> 등)는 별도 보존 규칙으로 관리했습니다.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">중간 정리: 어떻게 정리했나</div>
|
||||
<div class="process-box">
|
||||
<div class="process-grid">
|
||||
<div class="process-col">
|
||||
<h3>1. 표기 보존 및 통합</h3>
|
||||
<p><code>DX</code>, <code>BIM</code>, <code>S/W</code>, <code>H/W</code>, <code>2D</code>, <code>3D</code>, <code>As-is</code>, <code>To-Be</code>처럼 깨지면 안 되는 표기는 중요 표기로 보존했습니다.</p>
|
||||
<p>같은 뜻의 표기 차이는 대표 표기로 합쳤습니다. 예: <code>디지털 전환</code>, <code>디지털전환</code>, 일부 DX 계열 표현은 대표 표기 <code>DX</code>로 통합했습니다.</p>
|
||||
</div>
|
||||
<div class="process-col">
|
||||
<h3>2. 전처리 규칙</h3>
|
||||
<p>1글자 단어와 순수 숫자는 제외했습니다.</p>
|
||||
<p>공백 차이, 슬래시 차이, 영문/국문 혼용 표기는 가능한 범위에서 하나의 대표 표기로 정리했습니다.</p>
|
||||
<p>예: 원문 <code>디지털전환 직관지 역할</code> → 정규화 후 <code>DX 직관지 역할</code></p>
|
||||
</div>
|
||||
<div class="process-col">
|
||||
<h3>3. 1713개와 최종 분류의 관계</h3>
|
||||
<p>최종 고유 키워드 <strong>1,713개</strong>를 등장 범위 기준으로 다시 나눴습니다.</p>
|
||||
<p><strong>451</strong> 특정 프레임 전용 + <strong>1,238</strong> 2~9개 프레임 공통 + <strong>24</strong> 10개 이상 프레임 공통 = <strong>1,713</strong></p>
|
||||
<div class="hint">즉 아래 분류는 1,713개와 별도 표가 아니라, 1,713개를 다시 구분한 결과입니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="section-title">최종 키워드 분류</div>
|
||||
|
||||
<div class="bottom-grid">
|
||||
<div class="keyword-card core">
|
||||
<h2>핵심 키워드</h2>
|
||||
<div class="count">451개</div>
|
||||
<div class="def">
|
||||
<strong>특정 프레임에만 등장하는 단일 키워드</strong>입니다. 프레임 식별력이 가장 강한 신호로, 다른 프레임에 복제되지 않는 단어를 중심으로 정리합니다.
|
||||
</div>
|
||||
<div class="mini-title">키워드 예시</div>
|
||||
<ul>
|
||||
<li><code>실시간</code>, <code>CCTV</code>, <code>위험</code>, <code>사전</code></li>
|
||||
<li><code>역량</code>, <code>여건</code>, <code>패러다임</code>, <code>현존</code></li>
|
||||
<li><code>지형도</code>, <code>곡물</code>, <code>차량</code>, <code>Platform</code></li>
|
||||
</ul>
|
||||
<div class="frame-example">
|
||||
프레임 예시: Frame 7은 <code>실시간</code>/<code>CCTV</code> 계열, Frame 13은 <code>역량</code>/<code>여건</code> 계열처럼 해당 프레임만의 식별 단어가 뚜렷하게 나타납니다.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="keyword-card set">
|
||||
<h2>세트 키워드</h2>
|
||||
<div class="count">524개</div>
|
||||
<div class="def">
|
||||
<strong>특정 프레임 내부의 여러 source text를 공통 토큰으로 병합한 frame-level 세트 후보</strong>입니다. 단일 단어보다 프레임의 문맥과 메시지 묶음을 더 잘 보여주는 시그니처 단위로 사용합니다.
|
||||
</div>
|
||||
<div class="mini-title">키워드 세트 예시</div>
|
||||
<ul>
|
||||
<li>Frame 2: <code>AI · 비약 · 발전 · 추론 · 기반</code></li>
|
||||
<li>Frame 13: <code>여건 · 사회 · 기업 · 제도</code></li>
|
||||
<li>Frame 12: <code>안전 · 제고 · 건설 · 운영 · 확보</code></li>
|
||||
</ul>
|
||||
<div class="frame-example">
|
||||
프레임 예시: Frame 2는 AI·추론 계열, Frame 13은 필수 여건 계열, Frame 12는 안전·운영·확보 계열처럼 한 프레임 안에서 함께 읽히는 시그니처 묶음으로 정리됩니다.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="keyword-card related">
|
||||
<h2>연관 키워드</h2>
|
||||
<div class="count">1,238개</div>
|
||||
<div class="def">
|
||||
<strong>2~9개 프레임에 걸쳐 반복 등장하는 키워드</strong>입니다. 특정 프레임 하나를 바로 식별하지는 않지만, 핵심·세트 키워드 주변에서 맥락을 보강하는 신호로 사용합니다.
|
||||
</div>
|
||||
<div class="mini-title">키워드 예시</div>
|
||||
<ul>
|
||||
<li><code>국외</code>, <code>제도</code>, <code>공간</code>, <code>분석</code>, <code>솔루션</code></li>
|
||||
<li><code>고객</code>, <code>정부</code>, <code>토지</code>, <code>공유</code></li>
|
||||
<li><code>Engineering</code>, <code>Smart</code>, <code>공장</code>, <code>외장</code></li>
|
||||
</ul>
|
||||
<div class="frame-example">
|
||||
프레임 예시: <code>국외</code>, <code>솔루션</code>, <code>정부</code> 같은 단어는 2개 이상 프레임에 반복 등장하므로 특정 프레임 단독 식별보다는 주변 맥락을 보강하는 용도로 사용됩니다.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="note">
|
||||
주: 핵심 키워드와 연관 키워드의 개수(<strong>451 / 1,238 / 24</strong>)는 <code>KEYWORD_INVENTORY.html</code>의 최종 정리 기준을 따랐습니다.
|
||||
세트 키워드 <strong>524개</strong>는 현재 파이프라인의 <code>auto_anchor_candidates.yaml</code> 내 <code>merge_candidates</code> 기준으로 집계한 frame-level 세트 후보 수입니다.
|
||||
즉, 핵심·연관은 최종 고유 키워드 <strong>1,713개</strong>의 등장 범위 분류이고, 세트 키워드는 그와 별도로 프레임 시그니처 후보를 묶어 보여주는 보조 층입니다.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user