Skip to content

Commit 4bd0999

Browse files
committed
diag(uyap): accurate money detection in segment_shape + document-wide money/label position maps
2026/23 re-extract showed two 'İhale Bedeli' labels (idx 10,15) but NO money in the window and bounded_following_money_count=0 -> value is NOT adjacent to either label. The old _segment_kind hid money via _bounded_region(seg,fold,0) (cut at the first boundary label), so a 'İhale Bedeli VALUE' or 'VALUE İhale Bedeli' segment mis-showed as plain label. Fixed to scan the whole segment. Added privacy-safe document-wide position maps to the auction_price neighborhood: document_segment_count, label_segment_indexes, money_segment_indexes (segment INDEXES only; never values/text). This pinpoints where the İhale Bedeli value actually sits (columnar value-block, value-before-label, or a different doc) so the extraction can be fixed precisely without guessing. No extraction behavior change; +3 test assertions; fix11 green.
1 parent 001a10e commit 4bd0999

2 files changed

Lines changed: 15 additions & 2 deletions

File tree

src/sold/ingestion/uyap/extract.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ def _segment_kind(seg: str) -> str:
164164
fm = _VALUE_BOUNDARY_RE.search(fold)
165165
if fm:
166166
parts.append(f"label:{fm.group(0).strip()}")
167-
if MONEY_LITERAL_RE.search(_bounded_region(seg, fold, 0)):
167+
if MONEY_LITERAL_RE.search(fold): # segmentin HERHANGI yerinde para (etiket öncesi/sonrası dahil)
168168
parts.append("money")
169169
return "+".join(parts) if parts else "other"
170170

@@ -188,11 +188,17 @@ def _ihale_bedeli_relation(segments: list, label: str = "ihale bedeli", max_foll
188188
"same_segment_money_count": 0, "adjacent_segment_money_count": 0,
189189
"bounded_following_segments_inspected": 0, "bounded_following_money_count": 0,
190190
"boundary_stop_reason": None, "intervening_field_label_types": [], "relation_candidates": [],
191-
"segment_shape": [],
191+
"segment_shape": [], "document_segment_count": len(segments),
192+
"label_segment_indexes": [], "money_segment_indexes": [],
192193
}
193194
# Fix 13: AÇIK ALAN etiketi tam-sözcük olmalı — çekimli prose ("ihale bedelini/bedelinin yatirmamasi")
194195
# etiket-bulundu SAYILMAZ (word-boundary). Auction numeratör semantiği değişmez (açık İhale Bedeli alanı).
195196
label_re = re.compile(r"\b" + re.escape(label) + r"\b")
197+
# Gizlilik-güvenli belge-geneli KONUM haritası (yalnız segment İNDEKSLERİ; DEĞER/METİN İÇERİĞİ ASLA):
198+
# etiket bloğu ile değer bloğunun ayrı (sütun/başlık) olduğu düzeni teşhis için — tahmin değil, GÖZLEM.
199+
nb["label_segment_indexes"] = [j for j, s in enumerate(segments) if label_re.search(_ascii_lower(s))][:20]
200+
nb["money_segment_indexes"] = [j for j, s in enumerate(segments)
201+
if MONEY_LITERAL_RE.search(_ascii_lower(s))][:24]
196202
for i, seg in enumerate(segments):
197203
fold = _ascii_lower(seg)
198204
lm = label_re.search(fold)
@@ -499,6 +505,9 @@ def extract_evidence(
499505
"relation_candidates": _inb.get("relation_candidates", []),
500506
"label_occurrence_count": _inb.get("label_occurrence_count", 0),
501507
"segment_shape": _inb.get("segment_shape", []),
508+
"document_segment_count": _inb.get("document_segment_count", 0),
509+
"label_segment_indexes": _inb.get("label_segment_indexes", []),
510+
"money_segment_indexes": _inb.get("money_segment_indexes", []),
502511
},
503512
"settlement": settle_nb,
504513
}

tests/test_uyap_live_fix11.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ def test_ihale_columnar_layout_returns_none_but_shape_reveals_columns():
147147
assert nb["label_occurrence_count"] == 1
148148
assert "money" in nb["segment_shape"] # değer bloğu iz'de görünür
149149
assert nb["segment_shape"][0].startswith("label:ihale bedeli")
150+
# belge-geneli KONUM haritası (yalnız indeks; DEĞER YOK): etiket blok[0], değer blok[3,4]
151+
assert nb["label_segment_indexes"] == [0]
152+
assert nb["money_segment_indexes"] == [3, 4]
153+
assert nb["document_segment_count"] == 6
150154

151155

152156
def test_no_whole_document_money_scan():

0 commit comments

Comments
 (0)