""" Fuzzy match strategy for amounts and dates. """ from .base import BaseMatchStrategy from ..models import TokenLike, Match from ..token_index import TokenIndex from ..context import find_context_keywords from ..utils import parse_amount class FuzzyMatcher(BaseMatchStrategy): """Find approximate matches for amounts and dates.""" def find_matches( self, tokens: list[TokenLike], value: str, field_name: str, token_index: TokenIndex | None = None ) -> list[Match]: """Find fuzzy matches.""" matches = [] for token in tokens: token_text = token.text.strip() if field_name == 'Amount': # Try to parse both as numbers try: token_num = parse_amount(token_text) value_num = parse_amount(value) if token_num is not None and value_num is not None: if abs(token_num - value_num) < 0.01: # Within 1 cent context_keywords, context_boost = find_context_keywords( tokens, token, field_name, self.context_radius, token_index ) matches.append(Match( field=field_name, value=value, bbox=token.bbox, page_no=token.page_no, score=min(1.0, 0.8 + context_boost), matched_text=token_text, context_keywords=context_keywords )) except: pass return matches