
    Si                    D    d Z ddlmZ ddZddZ	 	 d		 	 	 	 	 	 	 	 	 d
dZy)up  퍼지 매칭 유틸리티.

파일명, 함수명, 스킬명 등의 유사 매칭을 제공한다.
Levenshtein distance 기반으로, 순수 Python으로 구현 (외부 의존성 없음).

주요 함수:
    levenshtein_distance(s1, s2) -> int
    similarity_ratio(s1, s2) -> float
    fuzzy_match(query, candidates, threshold, max_results) -> list[tuple[str, float]]
    )annotationsc           
        t        |       t        |      k  r|| }} t        |       t        |      }}|dk(  r|S t        t        |dz               }dg|dz   z  }t        d|dz         D ]^  }||d<   t        d|dz         D ]A  }| |dz
     ||dz
     k(  r||dz
     ||<    dt        ||   ||dz
     ||dz
           z   ||<   C ||}}` ||   S )uo  두 문자열 사이의 Levenshtein(편집) 거리를 계산한다.

    삽입(insert), 삭제(delete), 치환(substitute) 1회를 각각 비용 1로 계산.
    공간 최적화를 위해 2-row DP를 사용한다.

    Args:
        s1: 첫 번째 문자열.
        s2: 두 번째 문자열.

    Returns:
        0 이상의 정수. 0이면 동일 문자열.
    r      )lenlistrangemin)s1s2len1len2prevcurrijs           B/home/jay/workspace/.worktrees/task-2117-dev1/utils/fuzzy_match.pylevenshtein_distancer      s    2wRRBR#b'$D qy dQh D3$(D1dQh  Qq$(# 	A!a%yBq1uI%q1u+QcGQKQK Q		 4d  :    c                z    | s|sy| r|syt        t        |       t        |            }t        | |      }d||z  z
  S )u6  두 문자열의 유사도를 0.0~1.0으로 반환한다.

    1.0 = 동일, 0.0 = 완전히 다름 (또는 한쪽이 빈 문자열).

    공식: 1 - dist / max(len(s1), len(s2))

    Args:
        s1: 첫 번째 문자열.
        s2: 두 번째 문자열.

    Returns:
        0.0~1.0 범위의 float.
    g      ?g        )maxr   r   )r
   r   max_lendists       r   similarity_ratior   :   sC     bR#b'3r7#GB'Dr   c                    |sg S g }|D ]'  }t        | |      }||k\  s|j                  ||f       ) |j                  d        |d| S )us  쿼리 문자열과 가장 유사한 후보들을 반환한다.

    각 후보의 유사도(similarity_ratio)를 계산해 threshold 이상인 것을
    점수 내림차순으로 최대 max_results 개 반환한다.

    Args:
        query: 검색할 문자열.
        candidates: 비교 대상 문자열 목록.
        threshold: 최소 유사도 (0.0~1.0, 기본 0.6).
        max_results: 반환할 최대 결과 수 (기본 5).

    Returns:
        [(candidate, score), ...] 형태의 리스트. 점수 내림차순 정렬.
        threshold 미만 결과는 제외. 빈 후보 목록이면 빈 리스트 반환.
    c                    | d    | d   fS )Nr   r    )xs    r   <lambda>zfuzzy_match.<locals>.<lambda>q   s    !uadm r   )keyN)r   appendsort)query
candidates	thresholdmax_resultsscored	candidatescores          r   fuzzy_matchr)   R   sc    * 	&(F .	 	2IMM9e,-. KK+K,,;r   N)r
   strr   r*   returnint)r
   r*   r   r*   r+   float)g333333?   )
r"   r*   r#   z	list[str]r$   r-   r%   r,   r+   zlist[tuple[str, float]])__doc__
__future__r   r   r   r)   r   r   r   <module>r1      sU   	 #(V 6 	! ! !  !  	! 
 ! r   