
    iH$                     *   d Z ddlZddlZddlZddlZej
                  j                  dd       ddlmZ dZ	dZ
i ddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,Zd-ed.efd/Zd-ed.efd0Zd1 Zed2k(  r e        yy)3u  
test_docling_comparison.py - opendataloader-pdf 파싱 품질 검증 테스트

Task-735.1 서브태스크: 아르고스(테스터) 수행
대상 PDF: 금융소비자_보호에_관한_법률법률제21065호20260102.pdf

검증 항목:
1. 텍스트 추출 정확도 (텍스트 길이)
2. 표(table) 구조 보존 여부 (표 개수)
3. 조항 번호 정확성 (제N조 패턴)
4. 특수문자 처리 (「」 ㆍ ① ② ③ · → 등)
5. 처리 속도 (초 단위)
    Nz/home/jay/workspace/libs)	parse_pdfuj   /home/jay/.cokacdir/workspace/autoset/금융소비자_보호에_관한_법률법률제21065호20260102.pdfz;/home/jay/workspace/teams/dev2/tests/comparison_result.jsonu   「u   여는 꺾쇠괄호u   」u   닫는 꺾쇠괄호u   『u   겹 여는 꺾쇠괄호u   』u   겹 닫는 꺾쇠괄호u   ㆍu   가운뎃점(한글)   ·u   가운뎃점(중점)u   ①u   원형 숫자 1u   ②u   원형 숫자 2u   ③u   원형 숫자 3u   ④u   원형 숫자 4u   ⑤u   원형 숫자 5u   ⑥u   원형 숫자 6u   ⑦u   원형 숫자 7u   ⑧u   원형 숫자 8u   ⑨u   원형 숫자 9u   ⑩u   원형 숫자 10u   →u   오른쪽 화살표u   참고 표시u   빈 동그라미u   채운 동그라미)u   ※u   ○u   ●textreturnc                     i }t         j                         D ]$  \  }}| j                  |      }|dkD  s||d||<   & |S )u7   텍스트에서 특수문자 개수를 카운트한다.r   )descriptioncount)SPECIAL_CHARSitemsr	   )r   countschardescr	   s        ?/home/jay/workspace/teams/dev2/tests/test_docling_comparison.pycount_special_charsr   3   sO    F#))+ A
d

4 19+/%@F4LA M    c                 d    d}t        j                  ||       }t        t        |      d       }|S )u3   제N조 패턴으로 조항 번호를 추출한다.u	   제\d+조c                 \    t        t        j                  d|       j                               S )Nz\d+)intresearchgroup)xs    r   <lambda>z(extract_clause_numbers.<locals>.<lambda>B   s    BIIfa<P<V<V<X8Y r   )key)r   findallsortedset)r   patternmatchesunique_matchess       r   extract_clause_numbersr!   =   s.    Gjj$'GCL.YZNr   c                  &   t        d       t        d       t        dt                t        d       t        t        d      5 } | j                         }ddd       t        dt	              ddt	        |      d	z  d
d       t        d       t        j
                         }t        |      }t        j
                         |z
  }t        d|dd       |j                  xs d}|j                  xs g }|j                  j                  dd      }t        d       t        d       t        d       i }t        d       t        d       t	        |      }	t        d|	dd       t        d| d       |	dkD  rt        d|dd         |	|dd|d<   t        d        t        d       t	        |      }
t        d! |D              }t        d"|
 d#| d$       |rnt        d%       |d   }t        d&|j                  d'g       dd(         t        |j                  d)g       dd*       D ]  \  }}t        d+|d,z    d-|dd(          |
|d.d/|d0<   t        d1       t        d       t        |      }t        |      }t        d2t	        |       d3t	        |       d4       t        d5|dd6         t	        |      t	        |      |d7d8|d9<   t        d:       t        d       t        |      }t        d; |j!                         D              }t	        |      }t        d<| d=| d>       t                t        d?d@dAdBdCdDdBdEdF       t        d?dG dBdH dBdI        |j#                         D ]"  \  }}t        d?|dAdB|dJ   dDdB|dK   dF       $ |||j#                         D ci c]  \  }}||dK    c}}dLdM|dN<   t        dO       t        d       |dkD  r
|dkD  r||z  ndP}t        dQ|dRd       t        |dkD  rdS| dT||z  dUdndV       t%        |dW      |t%        |dW      dXdY|dZ<   t        d       t        d[       t        d       t        d\|	dd       t        d]| d       t        d^|
 d_| d$       t        d`t	        |       d3t	        |       d4       t        da| db| d>       t        dc|dRd       |	||
|t	        |      t	        |      ||t%        |dW      t        t	        |      t        j&                  dd      dedf
|dg<   t        t(        dhdij      5 } t+        j,                  || dkdlm       ddd       t        dnt(                t        d       |S # 1 sw Y   !xY wc c}}w # 1 sw Y   ;xY w)ou8   opendataloader-pdf 파싱 품질 검증을 실행한다.zF======================================================================u.   opendataloader-pdf 파싱 품질 검증 시작u   대상 PDF: rbNu   
PDF 파일 크기: ,z bytes (i   z.1fz KB)u'   
[1/1] opendataloader-pdf 파싱 중...u       완료: z.2fu   초 
page_countr   zG
======================================================================u   품질 검증 결과u&   
[항목 1] 텍스트 추출 정확도z2--------------------------------------------------u'     opendataloader-pdf 텍스트 길이: u    문자u     페이지 수: u	   페이지u(     텍스트 샘플 (처음 200자):
       u1   opendataloader-pdf 단독 텍스트 추출 결과)odl_text_lengthodl_page_countnote1_text_accuracyu+   
[항목 2] 표(table) 구조 보존 여부c           	   3      K   | ]B  }t        |j                  d g             t        d |j                  dg       D              z    D yw)headersc              3   2   K   | ]  }t        |        y w)N)len).0rs     r   	<genexpr>z+run_comparison.<locals>.<genexpr>.<genexpr>   s     9\Q#a&9\s   rowsN)r/   getsum)r0   ts     r   r2   z!run_comparison.<locals>.<genexpr>   s>     qab#aeeIr23c9\!%%PVXZJ[9\6\\qs   AA
u%     opendataloader-pdf 추출 표 수: u   개 (총 셀 수: )u   
  첫 번째 표 미리보기:u       헤더: r-      r3      u       행    z: u2   opendataloader-pdf 단독 표 구조 추출 결과)odl_table_countodl_total_cellsr*   2_table_preservationu4   
[항목 3] 조항 번호 정확성 (제N조 패턴)u(     opendataloader-pdf 추출 조항 수: u   개 (고유: u   개)u      조항 목록 (처음 15개):    u5   opendataloader-pdf 단독 조항 번호 추출 결과)odl_clause_countodl_unique_clause_countall_odl_clausesr*   3_clause_accuracyu   
[항목 4] 특수문자 처리c              3   &   K   | ]	  }|d      yw)r	   N )r0   vs     r   r2   z!run_comparison.<locals>.<genexpr>   s     E1AgJEs   u*     opendataloader-pdf 특수문자 종류: u   종 / 총 개수: u   개z  u   문자z<6 u   설명z<20u   횟수z>10z------z--------------------z
----------r   r	   u4   opendataloader-pdf 단독 특수문자 처리 결과)odl_special_char_typesodl_special_char_total
odl_detailr*   4_special_charsu   
[항목 5] 처리 속도g        u$     opendataloader-pdf 처리 시간: z.3fu     총 페이지: u   페이지 / 페이지당: z.4fu     총 페이지: 미확인   u.   opendataloader-pdf 단독 처리 속도 결과)odl_time_secondsr)   odl_pages_per_secondr*   5_processing_speedu   종합 요약u   
  텍스트 길이      : u     페이지 수        : u     추출 표 수       : u   개 (총 셀: u     감지 조항 수     : u     특수문자 종류    : u
   종 / 총 u     처리 시간        : z%Y-%m-%d %H:%M:%S)pdf_pathpdf_size_bytes	test_date)
r(   r)   r;   r<   r?   r@   rG   rH   rL   	test_infooverallwzutf-8)encodingF   )ensure_asciiindentu   
결과 JSON 저장 완료: )printPDF_PATHopenreadr/   timer   r   tablesmetadatar4   r5   	enumerater!   r   r   valuesr   roundstrftimeRESULT_PATHjsondump)f	pdf_bytesstartresultelapsedodl_text
odl_tablesr)   resultsodl_text_lenr;   odl_table_cellsfirst_tableirowodl_clausesodl_clause_setodl_specialodl_special_totalodl_special_typesr   infokrE   pages_per_secs                            r   run_comparisonr|   F   s%   	(O	
:;	L

#$	(O 
h	 FFH	 
!#i.!38C	N4<OPS;TTX
YZ 

45IIKEy!FiikE!G	LS
)*{{ bH$"J__((q9N
 
/	
 !	(OG
 

34	(Ox=L	3L3C7
KL	n-Y
78a9(4C.9IJK ((C"G 

89	(O*oOqfpqqO	1/1BBTUdTeef
gh02 m[__Y;BQ?@AB ;BQ ?@ 	/FAsHQqSECG9-.	/ +*D'G"# 

AB	(O(2K%N	4S5E4FmTWXfTgShhl
mn	,["-=,>
?@  ,#&~#6&G	$G  

,-	(O%h/KE0B0B0DEEK(	67H6II[\m[nnq
rs	G	Bxm1XcN!HS>
:;	BugQvhax
()!'') L
d4)1T-05QtG}S6IJKL #4"31<1B1B1DEAq!G*}EF	"G 

&'	(O07!QR@RNW,X[M	0S
AB	A N++EgnF\]`Eaade) "'1-( %mQ 7@	%G ! 
/	/	(O	(a(8
@A	%n%5Y
?@	%o%6n_DUUV
WX	&s;'7&8c.FYEZZ^
_`	'(9':*EVDWWZ
[\	%gc]#
67 ((**,#&~#6"3"3!'1- !)n':;
GI( 
k3	1 <Q		'15;< 
)+
78	(ONY V Fv< <s   U4-V
3V4U>V__main__)__doc__re   r   sysr]   pathinsert
doc_parserr   rZ   rd   r
   strdictr   listr!   r|   __name__rD   r   r   <module>r      sj    	 
  - .  wK	 	  
$ 
$	
 
! 	
  
 
 
 
 
 
 
 
 
  
!" 
 #$  )0c d   tn z r   