fix(781-2): 예시 1 근거 = 건설 공통 1-2-7 인력운반(지게) — 조항 같음 덤 · 조항 점수 · 근거 칩 툴팁

- Fit: 인용 조항 같음 로직에 이름 1위와 같은 덤(fuse) · 조항 가중 1.5 → 2.0 — 북부청 임도 단산10 1위 GF000214 야면석 채집 → GC001140 인력운반(지게) · 골든 1위 162 → 163(사람 120 · 새 43) · 다른 점 틀림 0 → 1(N006 정답표가 짐작 GF000280 인 줄 — 새 로직이 맞는 근거)
- 화면: 근거 칩 툴팁 로직 null 일 때 「null · 기초 없음」 → 「기초 없음」
- test_628: 예시1 시험을 새 뜻(근거 GC001140 · 기초 없음 표지 없음)으로 · 표지 수 19 → 18(공통 1-2-7 인용 블록은 여덟 파일 중 단산10 하나) · 우리 지문표 없으면 만들고 시작

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-04 19:06:36 +09:00
co-authored by Claude Sonnet 5.5
parent 9f86977293
commit 02380bb7d1
3 changed files with 26 additions and 15 deletions
+9 -1
View File
@@ -40,7 +40,7 @@ W = {
"율": 0.3,
"단위": 0.5,
"조건": 0.6,
"조항": 1.5,
"조항": 2.0,
"이름": 0.6,
}
BETA = 1.0
@@ -256,6 +256,14 @@ def sure(e: dict, pool: list[tuple]) -> bool:
def fuse(e: dict, pool: list[tuple], border: list[str]) -> list[str]:
"""지문 점수 + BETA × 이름 · 근거 차례 덤 → 위 다섯."""
bonus = {k: RB[i] for i, k in enumerate(border[:5])}
for (
_,
k,
ch,
_,
) in pool: # 인용 조항 같음 = 이름 1위와 같은 덤(782 · 이름이 다른 로직을 가리켜도)
if (ch.get("조항") or 0) >= 1.0:
bonus[k] = max(bonus.get(k, 0), RB[0])
cand = {k: s for s, k, _, _ in pool}
by = {o["로직"]: o for o in prepared() or []}
table = hopyo_basis.ours()
@@ -230,7 +230,8 @@ export function sangeunStep(
const verdict = createBadge(word, word === GOOD ? "success" : "info");
verdict.dataset.skVerdict = String(b.번);
const basis = b.근거 ? createBadge(`${L("M02_SkBasisTag")} ${b.근거.이름 ?? b.근거.로직}`, "neutral") : "—"; // prettier-ignore
if (basis instanceof HTMLElement) basis.title = `${b.근거!.로직} · ${b.근거!.판정 ?? ""}`;
if (basis instanceof HTMLElement)
basis.title = [b.근거!.로직, b.근거!.판정].filter(Boolean).join(" · ");
const made = b.만든 ? createBadge(b.만든, "success") : "—";
const ok = canConfirm(b, picks);
const sure = createToggle({
+15 -13
View File
@@ -3,8 +3,8 @@
책 낱말(임도 · 사방 = 옛 책 · 건설 부문 낱말) · 부문 풀이(북부청임도 단산10 → 건설 공통 1-2-7 ·
영월 「건설표준품셈 9-1」 → 번호 뜻 안 맞음 = (옛)) · 임도 옛 번호 → 대응표 현행 번호 ·
조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 「기초 없음 — 건설 공통 1-2-7 운반」 ·
줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦
조항 견줌은 책 + 부문 · 예시 1(단산10 근거 = 건설 공통 1-2-7 인력운반(지게) GC001140 ·
782-1 새 로직 · 줄 금액 94,227.7 그대로) · 번호만 같은 다른 부문 · 옛 번호 로직이 1위 · 다섯 안에 안 듦
(봉화 깬잡석채집 · 영월 콘크리트소운반) · 여덟 파일 표지 수.
읽기만 · 서버 없음 · master_data 그대로.
"""
@@ -19,6 +19,7 @@ from M01_MasterData import M01_MasterData_Store as m01
from M02_MasterTemplete import M02_Hopyo_Basis as hb
from M02_MasterTemplete import M02_Hopyo_Fit as fit
from M02_MasterTemplete import M02_Hopyo_Match as hm
from M02_MasterTemplete import M02_Hopyo_Ours as ours
from M02_MasterTemplete import M02_Hopyo_ReadEst as est
from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun
from M02_MasterTemplete import M02_Hopyo_SkUnit as skunit
@@ -26,7 +27,11 @@ from M02_MasterTemplete import M02_Hopyo_Units as units
from M02_MasterTemplete import M02_Hopyo_Verdict as verdict
from resources.tester import helper_m02_hopyo_golden as golden
NO_BASIS = "근거 조항 우리 기초에 없음 — 건설품셈 공통 1-2-7 운반"
@pytest.fixture(scope="module", autouse=True)
def _ours_ready():
if not ours.ready(): # 맞춤셈은 우리 지문표가 있어야 돎(판이 바뀌면 다시)
ours.build()
def _block(tag: str, no: int) -> dict:
@@ -69,20 +74,17 @@ def test_조항_견줌_부문():
assert hb.clause([["건설품셈", "1-2-7"]], ours[code])[0] == 1.0 # 부문 모름 = 그대로
def test_예시1_기초_없음():
def test_예시1_근거_인력운반_지게():
block, line = _unit("북부청임도", 10)
assert hb.no_basis(block["출처"]) is None # 782-1 로직이 생겨 기초 없음 아님
got = verdict.block(block, line, hm.targets())
assert got["기초없음"]["판정"] == "기초 없음"
assert NO_BASIS in got["판정"]["꼬리표"]
assert all(c["글"] == verdict.OUTSIDE for c in got["후보"] if c["판정"] != "맞음")
assert "기초없음" not in got
assert got["차례"][0] == "GC001140" # 지게(사람 줄) — 1141 기계설비 · 1142 벽돌 아님
maker = sangeun.Maker.__new__(sangeun.Maker)
maker.first, maker.blocks, maker.whole = {10: line}, {10: block}, m01.loaded()[1]
maker.cache = {fit.unit_key(line): got}
assert maker.basis(10) == {
"로직": None,
"이름": "기초 없음 — 건설 공통 1-2-7 운반",
"판정": "기초 없음",
}
basis = maker.basis(10)
assert basis["로직"] == "GC001140" and basis["이름"].startswith("인력운반(지게)")
judged = skunit.judge(block, units.Units(), lambda sub: None, None, "㎡")
assert judged["판정"] == "옮길 수 있음" and judged["우리금액"] == pytest.approx(94227.7, abs=1)
rows = [r for r in judged["더한줄"] if r.get("요소") == "LB000002"]
@@ -113,5 +115,5 @@ def test_여덟_파일_표지_수():
for tag in golden.FILES:
for block in golden.read(tag)["단산"]:
seen[(hb.no_basis(block["출처"]) or {}).get("판정")] += 1
assert seen["기초 없음"] == 19
assert seen["기초 없음"] == 18 # 782-1 로 북부청 임도 단산10(공통 1-2-7) 하나 빠짐
assert seen["옛 번호"] == 121