
    Riyi                       d Z ddlmZ ddlZddlZddlmZ ddlmZ  ej                  dej                        Z ej                  d      Z ej                  dej                        Z ej                  d	ej                        Z ej                  d
      Z ej                  d      Z ej                  dej                        Zg dg dg dg ddZ e       Zej+                         D ]  Zej/                  e        ej/                  g d       ddZddZd d!dZd"dZ	 	 	 	 d#dZd$d%dZd&dZd'dZd&dZ d(dZ!d)dZ"e#dk(  r e"        yy)*u   고급 규칙 기반 + 휴리스틱 스레드 정제 스크립트.

각 스레드를 분석하여:
1. 노이즈 판별 및 필터링
2. Q&A 추출 및 원자적 분리
3. 고품질 위키 항목 생성
    )annotationsN)Path)Optionaluk  (질문\s*드립니다|질문드려요|질문이요|문의\s*드립니다|문의드려요|궁금합니다|궁금한데요|궁금해요|여쭤봅니다|여쭈어봅니다|확인\s*부탁|어떻게\s*해야|어떻게\s*되나요|가능한가요|되나요|할\s*수\s*있나요|혹시.*알\s*수|아시는\s*분|도움.*부탁|이런\s*경우|이\s*경우에|이때)u?   \?|할까요|인가요|나요|인데요|인건가|될까|일까u  ^(안녕하세요[~!.^]*|감사합니다[~!.^]*|고맙습니다[~!.^]*|넵[~!.^]*|네[~!.^]*|ㅋ{2,}|ㅎ{2,}|뿌듯.*|축하.*|대단.*|👏+|🎉+|👍+|💪+|화이팅.*|파이팅.*|수고.*|반갑습니다.*|잘\s*부탁.*|정말.*감사.*|진짜.*감사.*)$u   (🚨\s*공지|📢|공지사항|[줌zoom]\s*특강|무료\s*강의|신청\s*링크|등록\s*링크|오프라인\s*교육|세미나|홍보|광고|이벤트|프로모션)z010-\d{3,4}-\d{4}u9   (📚|한 발 앞서가는|━━━|여기서 배우고)u   (안녕하세요[~!.^😄😊]*\s*|질문\s*드립니다[~!.]*\s*|#궁금증\s*|질문이요[~!.]*\s*|네\s+|넵\s+|ㅠ+\s*|ㅜ+\s*|^\s*다시\s+|^\s*혹시\s+))   보상	   보험금   청구u   지급   면책u	   부지급u   손해사정u	   수술비u	   입원비u	   통원비   실비   실손u	   진단비u   후유장해   장해u   사망보험금   상해   질병u   3대비급여u	   비급여MRIu   도수치료u	   치료비)   고지   고지의무u   고지위반u   계약전알릴의무u   알릴의무u   통보의무u   건강고지u   과거병력u   건강이음u   건강보험u   처방u	   약처방u   투약u   할증u	   부담보u   인수u   심사)   약관u   특약u   보장r	   u   면책기간u   보험기간u   납입u   갱신u	   비갱신u   자동갱신u   해지u   환급u   해지환급금u   보장개시u   대기기간u   소멸시효)   상품u   가입u   설계u	   보험료u	   보험사u   삼성u   한화u   교보u	   메리츠u   DB손해u   현대해상u   KB손해u   롯데AIGu   종신u   변액u   연금u   저축CI)r   r   r   r   )&u   손해사정사u	   설계사FAu   보험설계사u   판례u	   대법원u   법원u   분쟁u   민원u	   금감원u   금융감독원u   소비자보호u   분쟁조정u	   진단서u	   소견서u   의무기록u   차트   수술   입원u   통원u   치료u   암u	   뇌출혈u   심근경색u	   고혈압u   당뇨u	   갑상선u   유방u   자궁u	   전립선u   골절u   인대u	   디스크u	   추간판u	   레이저u	   내시경u	   복강경u	   관절경c                .    t         j                  d|       S )Nz***-****-****)RE_PHONEsub)texts    G/home/jay/workspace/.worktrees/task-2117-dev1/scripts/refine_threads.py
mask_phoner   u   s    <<..    c                    t         D ci c]  }|d c}| j                         }t         j                         D ]  \  }}|D ]  }||v s|xx   dz  cc<      t        fd      }|   dk(  ry|S c c}w )u-   텍스트에서 카테고리를 추론한다.r      c                    |    S N )cscoress    r   <lambda>z#classify_category.<locals>.<lambda>   s    VAY r   key   기타)CATEGORY_KEYWORDSloweritemsmax)r   catr,   keywordskwbestr&   s         @r   classify_categoryr3   y   s    0ABc1fBFJJLE*002 !X 	!BU{sq 	!! v./Dd|qK Cs   
A7c                   g }t               }t        D ]=  }|| v s||vst        |      dk\  s|j                  |       |j	                  |       ? t        j                  d|       }i }|D ].  }||vst        |      dk\  s|j                  |d      dz   ||<   0 h d}t        |j                         d       D ];  \  }	}
|	|vst        |      |k  s|j	                  |	       |j                  |	       = |d| S )	uP   텍스트에서 보험 도메인 관련 의미 있는 키워드를 추출한다.   u   [가-힣]{2,6}r   r!   >   	   거든요	   건데요	   그래서	   그런데	   그렇게	   되는데	   습니다	   어떻게	   이렇게	   인데요	   입니다	   저렇게	   하는데	   합니다   감사합니다   안녕하세요   질문드립니다c                    | d    S Nr!   r$   xs    r   r'   z"extract_keywords.<locals>.<lambda>   s    !u r   r(   N)
setINSURANCE_KEYWORDSlenaddappendrefindallgetsortedr-   )r   	max_countfoundseenr1   ko_nounsnoun_countsnnoise_wordsnouncnts              r   extract_keywordsr]      s   EUD  :"D.SW\HHRLLL
 zz+T2H"$K 7D=SVq[(__Q2Q6KN7aK K--/_E 	c{"s5zI'=LLHHTN )r   c                2   | d   }|D cg c]  }|d   	 }}dj                  |      t        d |D              }t        d |D              ry|D cg c](  }t        j	                  |j                               r'|* }}|syt        d |D              }t        d	 |D              }t        d
 |D              }	|r|s|	syt        |      dk  r| j                  d      syt        |      dk  r4|s2| j                  d      s!t        fdt        D              }
|
dk  ry|	syt        d |D              }|t        |      dz  kD  r|syt        d |D              ry|sg|	se| j                  d      sTi }|D ]   }|j                  |d   d      dz   ||d   <   " |r+t        |j                               }|t        |      dz  kD  ry|rt        |      dk  ryt        d |D              }|t        |      dz  k\  r|syt        fd t        D              }|dk(  r| j                  d      sy!t        j                  d"t        j                        rg d#}t        fd$|D              sy%|D ]  }|j                         j!                  d&      s#t        |j                         j#                  d      d         d'kD  sRt        j$                  d(d)|      j                         }t        |      d*k  sg d#}t        fd+|D              r y, y-c c}w c c}w ).u=   스레드가 노이즈인지 판별한다. (is_noise, reason)messagescontent
c              3  &   K   | ]	  }|d      ywuserNr$   .0ms     r   	<genexpr>z"is_noise_thread.<locals>.<genexpr>   s     (a&	(   c              3  F   K   | ]  }t         j                  |        y wr#   )RE_BOT_WELCOMEsearchrf   r%   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     
6>  #
6   !)Tu   봇 환영 메시지만 있음)Tu   인사/축하만 있음c              3  F   K   | ]  }t         j                  |        y wr#   )RE_ANNOUNCEMENTrl   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     G?11!4Grn   c              3  F   K   | ]  }t         j                  |        y wr#   )RE_QUESTIONrl   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     ?{))!,?rn   c              3  R   K   | ]  }d |v xs t         j                  |       ! yw)?N)RE_HAS_QUESTION_MARKrl   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s(     Y1C1HF(<(C(CA(FFYs   %')Tu   공지/광고만 있음r5   has_question_tag)Tu   혼잣말 (참여자 1명)   c              3  ,   K   | ]  }|v sd   ywr!   Nr$   rf   r1   all_texts     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     Qb".Q   	)Tu$   짧은 잡담 (보험 관련 없음))Tu   짧은 대화 (질문 없음)c              3     K   | ]?  }t         j                  |j                               st        j                  d |      rd A yw)u8   (감사|뿌듯|축하|대단|파이팅|화이팅|수고)r!   N)RE_NOISE_ONLYmatchstriprP   rl   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s=      `1%++AGGI6YYZ\]^  `s   AAg      ?)Tu   감사/인사/감탄 위주c              3  T   K   | ]   }t        |j                               d k   " yw)   N)rM   r   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     
113qwwy>B
1s   &()Tu   매우 짧은 내용rd   r   r!   gffffff?)Tu!   정보 공유/공지 (Q&A 아님))Tu%   질문만 있고 답변 없음 (1인)c              3  N   K   | ]  }t        j                  d |      sd  yw)z	https?://r!   N)rP   rl   rm   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     E"))L!*D1Es   %%)Tu   URL/링크 공유만 있음c              3  ,   K   | ]  }|v sd   ywry   r$   rz   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     KB(N!Kr|   )Tu   보험 관련 키워드 없음u)   (zoom|줌|입장|접속|링크|들어가))r   r   r   r   r   r   r   r
   r   u   진단r   u   사망r   r   c              3  &   K   | ]  }|v  
 y wr#   r$   rz   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     <b2><   )Tu(   줌/기술 문의 (보험 지식 아님)http   https?://\S+ r   c              3  &   K   | ]  }|v  
 y wr#   r$   rz   s     r   rh   z"is_noise_thread.<locals>.<genexpr>   s     Db2>Dr   )Tu!   URL 공유 (보험 질문 아님))Fr   )joinrK   allr~   r   r   anyrM   rR   sumrL   r.   valuesrP   rl   
IGNORECASE
startswithsplitr   )threadmsgsrg   contentsusersr%   	non_noisehas_announcementhas_questionhas_question_markinsurance_related
noise_msgsmsg_by_usertop_user_msgsurl_msgsinsurance_countinsurance_termsnon_url_textr{   s                     @r   is_noise_threadr      s   *D&*+)+H+yy"H(4((E 
6X
665 %KqM,?,?	,JKIK. GhGG?h??LYPXYY5F. 5zA~zz,-5 4yA~l6::>P3QQ,>QQq ? 8  ` ` `J CIO#L2 
1
11+  1&**EW:X&( 	GA%0__QvY%BQ%FK&	"	G 2 2 45Ms4y3.@ E
Q< EhEEH3t9s?"<2 K&8KKO!FJJ/A$B5 
yy=xW`<O<<C  	E779'C	0Ea0H,IB,N66/2q9??AL< 2%#hDODDD	E q , Ls   L(L<Lc           	     <   | d   }g }| j                  d      r]d}t        |      D ]  \  }}d|d   v s|} n ||   }||dz   d D cg c]  }|d   |d   k7  s| }}|j                  |||d	       |S g }t        |      D ]  \  }}|d   }	t        j	                  |	      }
d
|	v xs t
        j	                  |	      }t        |	j                               dk\  }|	j                         j                  d      }|
r|r|s|j                  |       |s|st        |	j                               dk\  s|r|j                  |        |sYt        d |D              }|d   d   t        fdt        D              }t        |      dk\  rt              dk\  r	|dk\  rdg}ng S |D ]  }||   }|j                  |      }|t        |      dz
  k  r||dz      n
t        |      }||dz   | D cg c]  }|d   |d   k7  s| }}|D cg c]I  }t        j                  |d   j                               s!t        |d   j                               dk\  r|K }}|s|j                  |||t        |      dz
  k  r||| n||d d	        |S c c}w c c}w c c}w )u2   스레드에서 질문-답변 쌍을 추출한다.r_   rv   r   
   #궁금증r`   r!   Nrd   )question_msganswer_msgsall_msgsrt   r   r      c              3  &   K   | ]	  }|d      ywrc   r$   re   s     r   rh   z-find_question_answer_pairs.<locals>.<genexpr>'  s     ,!AfI,ri   c              3  ,   K   | ]  }|v sd   ywry   r$   )rf   r1   first_contents     r   rh   z-find_question_answer_pairs.<locals>.<genexpr>)  s      Wr2CV Wr|   r5   r      )rR   	enumeraterO   rr   rl   ru   rM   r   r   rK   r   rL   indexr~   r   )r   r   pairsq_idxirg   q_msga_msgsquestion_indicesr`   has_q_pattern
has_q_markis_substantial
is_url_msgr   insurance_in_firstqiqi_posnext_qmeaningful_answersr   s                       @r   find_question_answer_pairsr      s     *DE zz$%dO 	DAqq|+	 U!%!)*-L6eFm1K!LL!!
 	
  #%$ '1I,#**73G^K';'B'B7'K
W]]_-3]]_//7
^J##A&Ns7==?/Cr/IR\##A&' ,t,,Q	*  W-? WWu:?s=1R7<NRS<S !sI  R!''+17#>N:ORS:S1S!&1*-Y\]aYb!"q&0OAfIv4N!OO *0 BA%2%8%899K9K9M%N"%a	l&8&8&:";q"@   B B LL %%/5<L8MPQ8Q/QDFOW[\^\_W` & Lm MP PBs   	JJ/J J
AJc                   | dz   |z   }| j                  d      D cg c]#  }|j                         s|j                         % }}|D cg c]A  }|j                  d      rd|vs|j                  d      st        j	                  |      s|C }}g }|D ]  }t
        j                  d|      j                         t        j                  dd      j                         t              dk  r[t        fd	t        D              d
z  }|t        t              d      z  }dv st        j                        r|dz  }|j                  |f        |j                  d        |r|d   d   nd}|s@|r|d   n| dd j!                  dd      }t
        j                  d|      j                         }|t        j                  dd      j                         t        j                  dd      j                         t        j                  dd      j                         t        j                  dd      j                         t              dkD  r/dD ]"  }	dd j#                  |	      }
|
dkD  sd|
  n	 dd dz   t        fdt        D              }|dk(  rft              dk  rXt%        |d      }|D cg c]  }|t        v s| }}|r2rdj'                  |dd        d ndj'                  |dd        d t              d
k  r<t%        |d!      }|rdj'                  |dd        d"S | dd j!                  dd      S c c}w c c}w c c}w )#uC   질문+답변 텍스트에서 핵심 주제 제목을 생성한다. ra   r   u   유형 :r   r   u   [~!.^😄😊🫡]+$r   c              3  ,   K   | ]  }|v sd   ywry   r$   )rf   r1   cleaneds     r   rh   zclean_title.<locals>.<genexpr>V  s     D"bGmADr|   
   <   rt   c                    | d    S Nr   r$   rI   s    r   r'   zclean_title.<locals>.<lambda>\      QqTE r   r(   r   r!   N2   z\?+$u)   ^(저기|근데|그리고|아|네|넵)\s+ut   (인데요|거든요|는데요|어요|해요|이요|했어요|있어요|없어요|될까요|인가요|나요)[.~!]*$7   ),r   (r   4   ...c              3  ,   K   | ]  }|v sd   ywry   r$   )rf   r1   titles     r   rh   zclean_title.<locals>.<genexpr>x  s     K2rU{QKr|   r   rw   r5   u    관련 u    관련 문의   u    관련 질문)r   r   r   r~   r   RE_TITLE_NOISEr   rP   rM   r   rL   minru   rl   rO   sortreplacerfindr]   r   )question_textanswer_text	full_textllinesscored_lineslinescore	best_linesepidxinsurance_in_titler0   kinsurance_kwkwsr   r   s                   @@r   clean_titler   F  s   #k1I !. 3 3D 9G1QWWYQWWYGEG J1Q\\,%?JVWDW\\&)-2E2Ea2H  JE J +-L 	. $$R.446&&0"g>DDFw<!D 2DDrIS\2&&'>188AQJEUG,-	. /*&2Q"I %E!H="+=+E+EdC+P	"&&r95;;=	 EFF*B6<<>EFF7B&,,.EFF?UKQQSE FF  K  MO  QV  W  ]  ]  _E 5zB" 	'C*""3'CRxds		' #2J&E K);KKQ3u:?#Iq1#+Gaq4F/FGGFKsxxRa 012(5'BTWT\T\]ijlkl]mTnSoo}Q~E 5zBy!,xxBQ()8E L "#2&..tS9ELy HJ^ Hs(   MMM!#M!(*M!M&M&c                   | syi }| D ]0  }|d   }||vrg ||<   ||   j                  t        |d                2 g }|j                         D ]I  \  }t        d D              }t        fdt        D              }|j                  ||dz  z   |f       K |j                  d        g }|D ]  \  }}|j                          d	j                  |      }	|	j                  d	      }
g }|
D ]K  j                         }|st        j                  |      r,t        |      d
k  r;|j                  |       M |syd	j                  |      }t        |      dkD  rxg }g }|D ]=  t        fdt        D              r|j                         -|j                         ? |dd |dd
 z   }d	j                  |      }t        |      dkD  r|dd dz   }|S )u=   답변 메시지들을 요약한다. 전문가 답변 우선.u   답변 미확인rd   r`   c              3  2   K   | ]  }t        |        y wr#   )rM   )rf   ts     r   rh   z#summarize_answer.<locals>.<genexpr>  s     .1A.s   c              3  :   K   | ]  }D ]  }||v sd    ywry   r$   )rf   r1   r   textss      r   rh   z#summarize_answer.<locals>.<genexpr>  s$     WBeWrUVwaWaWs   	r   c                    | d    S r   r$   rI   s    r   r'   z"summarize_answer.<locals>.<lambda>  r   r   r(   ra   rw   i  c              3  &   K   | ]  }|v  
 y wr#   r$   )rf   r1   r   s     r   rh   z#summarize_answer.<locals>.<genexpr>  s     ;"2:;r   N   i  r   )rO   r   r-   r   rL   r   extendr   r   r   r~   r   rM   r   )r   
user_textsrg   rd   scored_users	total_leninsurance_score	all_texts_combinedr   meaningful_linesstrippedresultimportant_linesother_linesselectedr   r   s                    @@r   summarize_answerr     s   ! (*J :yz!!Jt4
1Y< 89	: L!'') Me...	W*<WWY2)==tUKLM /* I&  4  yy#H NN4 E *::<x(x=1)* !YY'(F 6{S$ 	)D;(:;;&&t,""4(		) #2A&Ra88$v;DS\E)FMr   c                   | sydj                  d | D              t        j                  d      ryt        fdt        D              }|dk\  ryt        j                  d      ryt        j                  d	      ryy
)u$   답변의 신뢰도를 판단한다.lowr   c              3  &   K   | ]	  }|d      yw)r`   Nr$   re   s     r   rh   z'determine_confidence.<locals>.<genexpr>  s     Aq|Ari   u;   (판례|판결|대법원|법원|약관\s*제|조항|조문)highc              3  ,   K   | ]  }|v sd   ywry   r$   )rf   r1   all_answer_texts     r   rh   z'determine_confidence.<locals>.<genexpr>  s     OR9NqOr|   r   u@   (확실|분명|반드시|당연히|맞습니다|해당됩니다)u4   (아마|것 같|모르겠|확인.*필요|잘 모르)medium)r   rP   rl   r   rL   )r   r   expert_termsr  s      @r   determine_confidencer    s|    hhA[AAO 
yyOQ`a O#5OOLq 
yyTVef 
yyH/Zr   c                    | syi | D ]D  }|d   }|d   }t        |      }t        D ]  }||v s|dz  } j                  |d      |z   |<   F syt        fd      S )u@   답변 메시지 중 가장 전문적인 답변자를 찾는다.r   rd   r`   r   r   c                    |    S r#   r$   )uuser_scoress    r   r'   zfind_expert.<locals>.<lambda>  s    +a. r   r(   )rM   rL   rR   r.   )r   rg   rd   r`   r   r1   r  s         @r   find_expertr    s    "$K =yI,G$ 	BW}	 (OOD!4u<D= { 899r   c                   t        |       \  }}|rg S t        |       }|sg S g }| j                  d      r$| j                  dd      j                  d      d   nd}|D ]  }|d   }|d   }	|d   }
t	        |d         }t        |	      }|j                         |j                         k(  rMt        ||      }|dz   |z   }t        |      }t        |	      }t        |      }t        |	|      }|
D cg c]  }d	|d
    dt	        |d           }}d|d||d||||d|||d}|j                  |       |dz  } |S c c}w )u?   스레드를 정제하여 wiki_entry 리스트를 반환한다.
start_timer   r   r   r   r   r   r`   [rd   ] kakao-03du   앞서가는설계사)idr   categorysubcategoryquestionanswerexpertsource_datesource_chatr0   
confidence
raw_threadr!   )r   r   rR   r   r   r   r   r   r3   r  r]   r  rO   )r   global_indexis_noisereasonr   entriesr  pairr   r   r   r   r   r   r   r  r  r0   r  rg   r  entrys                         r   refine_threadr#    s    'v.Hf	 'v.E	G@F

<@X&**\2.44S9!<^`K .^$m$
#"5#34&v. -"5"5"77 M;7 "C'+5	$Y/ V$ $I. *&%8
 LTTa!F)Bz!I,'?&@AT
T <,- %!&2 $$
 	u].` N' Us   /D<c            	     >   t        j                  t        d      j                  d            } g }d}i }t	        |       }| D ]Y  }t        |      \  }}|r|dz  }|j                  |d      dz   ||<   1t        |t	        |      dz         }|j                  |       [ t        |d      D ]  \  }	}
d|	d|
d	<    g }g }|D ]  }
|
j                  d
d      }|
j                  dd      }|
j                  dd      }|dz   |z   t	        |      dk  rt        ||      |
d
<   |
d
   }|j                  d      rt        ||      |
d
<   |j                         |j                         k(  r|j                  d|
d	    d       t        fdt        D              }|
j                  d      dk(  r|dk  r|j                  d|
d	    d       	|j                         j                  d      s|j                         j                  d      rDt!        j"                  dd|      j                         }|dk  r|j                  d|
d	    d       t	        |
j                  dg             dk  rt%              |
d<   t!        j"                  dd|
d
         j                         |
d
<   t	        |
d
         dk  rt        ||      |
d
<   |j                  |
        t        |d      D ]  \  }	}
d|	d|
d	<    i }|D ],  }
|
j                  dd      }|j                  |d      dz   ||<   . i }|D ],  }
|
j                  dd      }|j                  |d      dz   ||<   . t        d       }|j'                  t        j(                  |d!d"      d       t+        d#       t+        d$| d%       t+        d&| d%       t+        d'       t-        |j/                         d( )      D ]  \  }}t+        d*| d+| d%        t+        d,t	        |       d%       t+        d-       t-        |j/                         d. )      D ]  \  }}t+        d/| d+| d0        t+        d1       t-        |j/                         d2 )      D ]  \  }}t+        d/| d+| d0        |r-t+        d3t	        |       d4       |d d5 D ]  }t+        |        t+        d6|        t+        d7|j1                         j2                  d8z  d9d:       t+        d;       |d d< D ]  }
t+        d=|
d	    d>|
d
           t+        d?|
d    d@|
d           t+        dA|
d   d dB  dC       t+        dD|
d   d dB  dC       t+        dE|
dF           t+        dGdHj5                  |
d   d d<                y )INz/tmp/threads.jsonzutf-8)encodingr   r!   )startr  r  r  r   r   r  r  r   r   r   z  [u#   ] 답변 = 질문 동일 → 스킵c              3  ,   K   | ]  }|v sd   ywry   r$   )rf   r1   r   s     r   rh   zmain.<locals>.<genexpr>q  s      Sr2? Sr|   r  r*   r5   u:   ] 카테고리 기타 + 보험 키워드 부족 → 스킵r   u   톡게시판r   u   ] URL 기반 질문 → 스킵r0   rw   r  r  z/tmp/refined_all.jsonF)ensure_asciiindentu   === 정제 결과 ===u   전체 스레드: u   개u   노이즈 필터링: u     - 노이즈 사유:c                    | d    S rH   r$   rI   s    r   r'   zmain.<locals>.<lambda>  s    AaD5 r   r(   z    z: u   최종 위키 항목: u   
카테고리 분포:c                    | d    S rH   r$   rI   s    r   r'   zmain.<locals>.<lambda>  s    AaD5 r   z  u   건u   
신뢰도 분포:c                    | d    S rH   r$   rI   s    r   r'   zmain.<locals>.<lambda>  s    adU r   u   
품질 이슈 (u   건):r   u	   
저장: u   파일 크기: i   z.1fKBu   
=== 샘플 5건 ===r   z
[r  u     카테고리: u    | 신뢰도: u
     질문: P   r   u
     답변: u     전문가: r  u     키워드: z, )jsonloadsr   	read_textrM   r   rR   r#  r   r   r   r   r   rO   r   rL   rP   r   r]   
write_textdumpsprintrS   r-   statst_sizer   )threadsall_entriesnoise_countnoise_reasonstotal_threadsr   r  r  r   r   r"  quality_issuesfinal_entriesr   r  r  insurance_kw_countnon_urlcat_distr/   	conf_distconfoutput_pathr\   issuer   s                            @r   mainrE  C  s   jj12<<g<NOG KK$&MLM $*62&1K$1$5$5fa$@1$DM&!K(81(<=7#$ k3 '5qg&d' !#N "M )$		'2&99Z,8R(sNV+	 u:?(6:E'N'NEL)(6:E'N <<>X^^--!!Cd}4W"XY ! S-? SS99Z H,1Ca1G!!Cd}4n"op >>&&v.(..2B2M2Mn2]ff_b(;AACG!A%%%E$K=8V&WX uyyR()A- 0 ;E* U7^DJJLguW~#(6:E'NU#S)$X m15 '5qg&d'  "H 1ii
H- S!,q01
 !#I 5yyx0#--a014	$5
 ./K

=uQ?   
!#	}oS
12	!+c
23	!#m113I )VHBse3'()	"3}#5"6c
:;	"$8>>+A $S3%r#c"#$	!IOO-?C %	c4&3%s#$%!#n"5!6e<=#CR( 	E%L		J{m
$%	OK,,.66=cB"
EF 
!#r" BE$K=5>"234 z!2 3>%BUAVWX
5,Sb12#67
5?3B/045eHo./0diij(9"1(=>?@ABr   __main__)r   strreturnrG  )r   )r   rG  rT   intrH  z	list[str])r   dictrH  ztuple[bool, str])r   rJ  rH  
list[dict])r   )r   rG  r   rG  rH  rG  )r   rK  rH  rG  )r   rK  r   rJ  rH  rG  )r   rJ  r  rI  rH  rK  )rH  None)$__doc__
__future__r   r/  rP   pathlibr   typingr   compiler   rr   ru   r~   rp   r   rk   r   r+   rK   rL   r   r   updater   r3   r]   r   r   r   r   r  r  r#  rE  __name__r$   r   r   <module>rT     s   #  	   bjj/ MM "rzz"de  

+ MM "**- MM	 2::*+ XY $ MM' 8 U ##% #Cc"#    
 
$/2[|EEEPAH>B6:6?DyBx zF r   