kennethzychew's picture
phase 5: evaluation harness (SROIE)
d2a6765
Raw
History Blame Contribute Delete
2.04 kB
"""CORD (v2) dataset adapter -- scaffold, not yet wired.
CORD is ~11,000 Indonesian receipts captured in the wild with rich key-value
and line-item labels. The ``naver-clova-ix/cord-v2`` build stores ground truth
as a JSON string in ``ground_truth`` (a ``gt_parse`` object with ``menu`` line
items and a ``sub_total`` / ``total`` block).
Intended field mapping onto the ``Document`` schema (to implement when wired):
- ``gt_parse.total.total_price`` -> ``total`` (critical)
- ``gt_parse.sub_total.subtotal_price``-> ``subtotal``
- ``gt_parse.sub_total.tax_price`` -> ``tax`` (critical)
- ``gt_parse.menu[*]`` -> ``line_items`` (name/cnt/price)
- store name (where present) -> ``vendor_name``
This adapter is intentionally left unwired for T10 (SROIE-first). ``load`` raises
so an accidental predict run against CORD fails fast rather than spending quota
on an unvalidated mapping.
"""
from __future__ import annotations
from collections.abc import Iterator
from eval.datasets.base import GoldExample
class CordAdapter:
"""Scaffold adapter for the CORD v2 receipt benchmark (not wired)."""
name: str = "cord"
hf_id: str = "naver-clova-ix/cord-v2"
split: str = "test"
# Fields CORD would provide once the gt_parse mapping is implemented.
labeled_fields: tuple[str, ...] = ("vendor_name", "subtotal", "tax", "total")
def load(self, limit: int | None = None) -> Iterator[GoldExample]:
"""Not implemented -- CORD is scaffolded but not wired for T10.
Args:
limit: Unused.
Raises:
NotImplementedError: Always; wire the ``gt_parse`` mapping first.
"""
raise NotImplementedError(
"CORD adapter is scaffolded but not wired (T10 is SROIE-first). "
"Implement the gt_parse -> Document mapping and add 'cord' to "
"WIRED_DATASETS before running the predict phase against it."
)
yield # pragma: no cover -- makes this a generator for the Protocol.