
    h2              #          S SK r S SKrS SKrS SKJr  S SKJrJrJ	r	J
r
  S SKJr  S SKrS SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJr  S SKJrJrJr  S SK J!r!  S SK"J#r#  S SK$J%r%J&r&  S SK'J(r(  S SK)J*r*  SSK+J,r-  SSKJ.r.  SSSSS.04SSSSS.04/r/SSSSSS.04SSSSSS.04/r0Sr1\" 5       Re                  \15      S   r3S r4S  r5\Rl                  Ro                  S!5      S" 5       r8\Rl                  Ro                  S#5      S$ 5       r9\Rl                  Ru                  S%\\\\\\/5      \Rl                  Ro                  S&5      S' 5       5       r;S(r<\Rl                  Ru                  S)S*S+/5      \Rl                  Ro                  S,5      S- 5       5       r=\Rl                  Ro                  S.5      S/ 5       r>\Rl                  Ro                  S05      S1 5       r?\Rl                  R                  S2S39S4 5       rA\Rl                  R                  S2S39S5 5       rB\Rl                  Ru                  S6S*S+/5      S7 5       rC\Rl                  Ru                  S8S*\44S+\54/5      S9 5       rD\Rl                  Ru                  S6S*S+/5      S: 5       rE\Rl                  Ru                  S8S*\44S+\54/5      S; 5       rF\Rl                  R                  \Rl                  Ru                  S<S*S=S>S?S@SA.4S*S=S>S>S@SA.4S+S=S?S?S@SA.4S+S=S?S>S@SA.4S*SBS?SSCSDSSESESSF.	4S+SBS?SSCSDSSESESSF.	4S*SG\!S=S>S?S@SA.SH.4S*SG\!S=S>S>S@SA.SH.4S+SG\!S=S?S?S@SA.SH.4S+SG\!S=S?S>S@SA.SH.4S*SI\!S>SJ.4S+SI\!S?SJ.4/5      SK 5       5       rH\Rl                  Ru                  S<S*SLS>S?S@SA.4S*SLS>S>S@SA.4S+SLS?S?S@SA.4S+SLS?S>S@SA.4S*SM\!S>S>S>S>S>SN.4S+SM\!S?S>S>S>S>SN.4/5      SO 5       rI\Rl                  Ru                  S<S*SLS>S?S@SA.4S*SLS>S>S@SA.4S+SLS?S?S@SA.4S+SLS?S>S@SA.4S*SM\!S>S>S>S>S>SN.4S+SM\!S?S>S>S>S>SN.4/5      SP 5       rJSQ rK\Rl                  Ru                  S<S+SG\3SLS?SES?SR.SH.4S*SG\3SLS>SSS?SR.SH.4S*ST\3S>SJ.4S+ST\3S?SJ.4S*SM\3S>S>S>S>S>SN.4S+SM\3S?S>S>S>S>SN.4/5      SU 5       rL\Rl                  Ru                  SVS*\4\/4S+\5\04/5      SW 5       rMSX rNSY rO\Rl                  R                  \Rl                  Ru                  SZS+\0S=S?SES?SR.4S*\/S=S>S[S?SR.4S+\0SBS?SSCSDSSESESSF.	4S*\/SBS?SSCSDSSESESSF.	4S*\/SI\!S>SJ.4S+\0SI\!S?SJ.4S+\0S\S?SES?SR.4S*\/S\S>S[S?SR.4S+\0S\S?S@S>SR.4S*\/S\S>SS>SR.4S+\0SLS?SES?SR.4S*\/SLS>S[S?SR.4S+\0SLS?S@S>SR.4S*\/SLS>SS>SR.4S+\0SG\!SLS?SES?SR.SH.4S*\/SG\!SLS>SSS?SR.SH.4S*\/S]\!S>SJ.4S+\0S]\!S?SJ.4S*\/ST\!S>SJ.4S+\0ST\!S?SJ.4S*\/SM\!S>S>S>S>S>SN.4S+\0SM\!S?S>S>S>S>SN.4/5      S^ 5       5       rPS_ rQS` rRSa rSSb rT\Rl                  Ru                  ScSdSe/5      Sf\USg\V4Sh j5       rW\Rl                  Ru                  SiSjSk/5      Sf\USl\V4Sm j5       rXSn rYSo rZ\Rl                  Ru                  SpSqSr/5      Ss 5       r[g)t    N)assert_almost_equal)Configcompoundingfix_random_seedget_current_ops)msg)util)print_prf_per_typeprint_textcats_auc_per_cat)English)Language)TextCategorizer)single_label_bow_configsingle_label_cnn_configsingle_label_default_config)multi_label_bow_configmulti_label_cnn_configmulti_label_default_config)DEFAULT_TOK2VEC_MODEL)Scorer)DocDocBin)Example)init_nlp   )build_lazy_init_tok2vec)make_tempdirzI'm so happy.cats      ?        )POSITIVENEGATIVEzI'm so angryzI'm angry and confused)ANGRYCONFUSEDHAPPYzI'm confused but happyz?
[model]
@architectures = "test.LazyInitTok2Vec.v1"
width = 96
modelc           	         ^ / m[          H>  nTR                  [        R                  " U R	                  US   5      US   5      5        M@     U4S jnU$ )Nr      c                     > T $ N train_exampless   [/home/james-whalen/.local/lib/python3.13/site-packages/spacy/tests/pipeline/test_textcat.pyget_examples4make_get_examples_single_label.<locals>.get_examples:   	        )TRAIN_DATA_SINGLE_LABELappendr   	from_dictmake_docnlptr/   r-   s      @r.   make_get_examples_single_labelr:   5   sK    N$g//QqT0BAaDIJ % r2   c           	         ^ / m[          H>  nTR                  [        R                  " U R	                  US   5      US   5      5        M@     U4S jnU$ )Nr   r(   c                     > T $ r*   r+   r,   s   r.   r/   3make_get_examples_multi_label.<locals>.get_examplesE   r1   r2   )TRAIN_DATA_MULTI_LABELr4   r   r5   r6   r7   s      @r.   make_get_examples_multi_labelr?   @   sK    N#g//QqT0BAaDIJ $ r2   i  c            
         SS/n / SQn/ SQn[         R                  " S5      n/ n[        X5       HP  u  pVU  Vs0 s H  owXv:H  _M	     nnUR                  [        R
                  " UR                  U5      SU05      5        MR     SSS	S
S.n	UR                  SSU	0SS9n
U  H  nU
R                  U5        M     UR                  SS9   UR                  5       n[        S5       H?  n0 n[        R                  " U[        SSS5      S9nU H  nUR                  XSUS9  M     MA     SSS5        gs  snf ! , (       d  f       g= f)zXTest whether adding n-grams in the textcat works even when n > token length of some docs	offensiveinoffensivezThis is an offensive textz!This is the second offensive textinoffrA   rA   rB   enr   spacy.TextCatBOW.v1Tr   F@architecturesexclusive_classes
ngram_sizeno_output_layertextcatr&   configlastenable         @      @@jt?size皙?examplessgddroplossesN)spacyblankzipr4   r   r5   r6   add_pipe	add_labelselect_pipes
initializeranger	   	minibatchr   update)unique_classesx_trainy_trainr8   
train_datatexttrain_instancelabelcat_dictr&   rM   	optimizerir^   batchesbatchs                   r.   test_issue3611ru   K   sJ    "=1NG
 8G
++d
CJ #G 5@NOu522O'++CLL,>@RST !6
 0! 	E ll9gu-=DlIG%    
				+NN$	qAFnnZk#tU6STG 

Es6
R !	  
,	+ P 
,	+s   D/AD44
Ei  c            
         SS/n / SQn/ SQn[         R                  " S5      n/ n[        X5       HP  u  pVU  Vs0 s H  owXv:H  _M	     nnUR                  [        R
                  " UR                  U5      SU05      5        MR     SSS	S
S.n	UR                  SSU	0SS9n
U  H  nU
R                  U5        M     UR                  SS9   UR                  5       n[        S5       H?  n0 n[        R                  " U[        SSS5      S9nU H  nUR                  XSUS9  M     MA     SSS5        U" S5      nUR                   S   S:X  d   eUR                   S   S:X  d   egs  snf ! , (       d  f       NF= f)z.Test whether textcat works fine with empty docrA   rB   rC   rE   rF   r   rG   Tr   FrH   rM   r&   rN   rQ   rS   rT   rU   rV   rW   rY   rZ   N r    )r_   r`   ra   r4   r   r5   r6   rb   rc   rd   re   rf   r	   rg   r   rh   r   )ri   rj   rk   r8   rl   rm   rn   ro   rp   r&   rM   rq   rr   r^   rs   rt   docs                    r.   test_issue4030ry   p   s    "=1NG
 8G
++d
CJ #G 5@NOu522O'++CLL,>@RST !6
 0! 	E ll9gu-=DlIG%    
				+NN$	qAFnnZk#tU6STG 

Es6
R !	  
, b'C88K C'''88M"c)))1 P 
,	+s   E!AE&&
E4textcat_configi  c                    Sn[        5       R                  U 5      n/ n[        S5       H  n[        S5        [	        5       nSnSSSSS.0nUR                  XS	S
9n[        US   5       H  n	UR                  U	5        M     UR                  5         UR                  U5      n
UR                  [        R                  " X5      /5        UR                  R                  U
/5      nUR                  US   5        M     [!        U5      S:X  d   e[#        5       n[%        UR'                  US   5      UR'                  US   5      SS9  [%        UR'                  US   5      UR'                  US   5      SS9  g)zWTest that after fixing the random seed, the results of the pipeline are truly identicalrM   rS   r   zUOnce hot, form ping-pong-ball-sized balls of the mixture, each weighing roughly 25 g.r   r   r    )Labe1Label2Label3TrN   r(      decimalr   N)r   from_strrf   r   r   rb   setrc   re   r6   rh   r   r5   r&   predictr4   lenr   r   to_numpy)rz   	componentpipe_cfgresultsrr   r8   rm   annotspipero   rx   resultopss                r.   test_issue5551r      sH    Ix  0HG1XifC3#FG||IT|B(ENN5! ) 	ll4 

G%%c234##SE*vay!   w<1

CWQZ0#,,wqz2JTUVWQZ0#,,wqz2JTUVr2   a  
[paths]
train = "TRAIN_PLACEHOLDER"
raw = null
init_tok2vec = null
vectors = null

[system]
seed = 0
gpu_allocator = null

[nlp]
lang = "en"
pipeline = ["textcat"]
tokenizer = {"@tokenizers":"spacy.Tokenizer.v1"}
disabled = []
before_creation = null
after_creation = null
after_pipeline_creation = null
batch_size = 1000

[components]

[components.textcat]
factory = "TEXTCAT_PLACEHOLDER"

[corpora]

[corpora.train]
@readers = "spacy.Corpus.v1"
path = ${paths:train}

[corpora.dev]
@readers = "spacy.Corpus.v1"
path = ${paths:train}


[training]
train_corpus = "corpora.train"
dev_corpus = "corpora.dev"
seed = ${system.seed}
gpu_allocator = ${system.gpu_allocator}
frozen_components = []
before_to_disk = null

[pretraining]

[initialize]
vectors = ${paths.vectors}
init_tok2vec = ${paths.init_tok2vec}
vocab_data = null
lookups = null
before_init = null
after_init = null

[initialize.components]

[initialize.components.textcat]
labels = ['label1', 'label2']

[initialize.tokenizer]
component_namerM   textcat_multilabeli  c                    S n[        5        nUS-  nU" U5        [        R                  SU 5      nUR                  SUR                  5       5      n[        R
                  " U5      n[        U5        SSS5        g! , (       d  f       g= f)z.Test intializing textcat with labels in a listc                    [         R                  " S5      nUR                  S5      nSSS.Ul        [	        U/S9R                  5       nU R                  S5       nUR                  U5        S S S 5        g ! , (       d  f       g = f)NrF   z	Some textr   r(   )label1label2)docswb)r_   r`   r6   r   r   to_bytesopenwrite)out_filer8   rx   out_datafile_s        r.   create_data#test_issue6908.<locals>.create_data	  se    kk$ll;'1-u%..0]]4 EKK! !  s   A66
Bztrain.spacyTEXTCAT_PLACEHOLDERTRAIN_PLACEHOLDERN)r   CONFIG_ISSUE_6908replaceas_posixr	   load_config_from_strr   )r   r   tmp_path
train_path
config_strrO   s         r.   test_issue6908r     ss    " 
8-
J&../DnU
''(;Z=P=P=RS
**:6 
s   A%A<<
B
ik  c                  j    SSS S.n [        [        U 5        SSSS.S S S S.S.n [        [        U S	S
S9  g )Ng0L}?g7?)LABEL_ALABEL_BLABEL_CgAϢ?g"nN%?g3M'?)prf)r   r   foobar)nametype)r   r   r
   )scoress    r.   test_issue7019r     sC    #4PFsF+"GDt4F sFU;r2   i&  c                     [        5       n U R                  S5      n[        U 5      nU R                  U5        U" 5       nUR	                  U Vs/ s H  oDR
                  PM     sn5      nUR                  X55      S   nUR                  US-  UR                  SSS95      S   nU[        R                  " U5      :X  d   eg s  snf )NrM   r   r   )axis)
r   rb   r:   re   r   	predictedget_lossrepeatpytestapprox)r8   rM   r/   r[   egr   lossloss_double_bss           r.   test_issue9904r   %  s    
*Cll9%G1#6LNN< ~H__X>XrllX>?FH-a0D%%hlFMM!!M4LMaPN6==0000	 ?s   Cz#Test is flakey when run with others)reasonc                  B   [        5       n U R                  S5      nUR                  S5        U R                  5         [	        S5       H%  nS H  u  p4U R                  USSU0045        M     M'     U " S5      nSUR                  ;   d   eUR                  S   S:  d   eg )NrM   answerr   ))aaaar   )bbbbr   )aar   )	bbbbbbbbbr    )aaaaaar(   r   aaa      ?)r   rb   rc   re   rf   rh   r   )r8   rM   rr   rm   r   rx   s         r.   test_simple_trainr   4  s    
*Cll9%GhNN1X
LD JJv&'9:;<
  e*Csxx88H$$$r2   c            
         [         R                  " S5        [        R                   R                  S5        / n [        5       n/ SQnU H]  nU HT  nU Vs0 s H  oU[	        XE:H  5      _M     nnU R                  [        UR                  S/S-  X4/-   S/S-  -   S9U45        MV     M_     [         R                  " U 5        [        UR                  SS9nU H  nUR                  U5        M     UR                  S 5      n[        S	5       HX  n	0 n
U  VVs/ s H  u  p[        R                  " US
W05      PM      nnnUR                  XU
S9  [         R                  " U 5        MZ     U H  nU H  n[        UR                  S/S-  X4/-   S/S-  -   S9nU Vs0 s H  oUXE:H  _M	     nnU" U5        UR                   R#                  5        H   u  pX   (       d
  US:  d   eM  US:  a  M    e   M     M     g s  snf s  snnf s  snf )Nr   )abcdrS   )words   )widthc                      / $ r*   r+   r+   r2   r.   <lambda>0test_textcat_learns_multilabel.<locals>.<lambda>W  s    2r2      r   r\   r^   r   )randomseednumpyr   floatr4   r   vocabshuffler   rc   re   rf   r   r5   rh   r   items)r   r8   lettersw1w2letterr   rM   rq   rr   r^   rx   catr[   truthscores                   r.   test_textcat_learns_multilabelr   H  s   
KKN	LLaD
*CGB>EFgFE",//gDFKKSYYseai2(.BcUQY.NOQUVW   NN4ciiq1G&! "":.I2YKOP4xsG%%cFD>:4Pxv>t	 
 BciiuqyB8';seai'GHC8?@fR\)E@CL!hhnn.
z 3;&; 3;&;	 /	   G Q As   G6%G;Hr   c                    [        5       nUR                  U 5      nUR                  S5        [        R                  " [
        5         UR                  S5        S S S 5        U S:X  a4  [        R                  " [
        5         UR                  5         S S S 5        g UR                  5         g ! , (       d  f       NY= f! , (       d  f       g = f)Nr   	   rM   )r   rb   rc   r   raises
ValueErrorre   )r   r8   rM   s      r.   test_label_typesr   i  s    
*Cll4 Gh	z	"! 
# y]]:&NN '& 	 
#	" '&s   B,B=,
B:=
Czname,get_examplesc                    ^ [        5       nUR                  U 5      nU" U5      mU4S jn[        R                  " [        5         UR                  US9  S S S 5        g ! , (       d  f       g = f)Nc                     > T" 5       n U S   R                   n[        UR                  R                  5       5      S   nSUR                  U'   U $ )Nr   g       @)	referencelistr   keys)r[   refkeyexample_getters      r.   invalid_examples2test_invalid_label_value.<locals>.invalid_examples  sE    !#qk##388==?#A&r2   r/   r   rb   r   r   r   re   )r   r/   r8   rM   r   r   s        @r.   test_invalid_label_valuer   x  sR     *Cll4 G!#&N 
z	"$45 
#	"	"s   A
A,c                     [        5       nUR                  U 5        [        R                  " [        5         UR                  5         S S S 5        g ! , (       d  f       g = fr*   r   )r   r8   s     r.   test_no_labelr     s7    
*CLL	z	" 
#	"	"s   A
Ac                 d    [        5       nUR                  U 5        UR                  U" U5      S9  g )Nr   )r   rb   re   )r   r/   r8   s      r.   test_implicit_labelr     s*     *CLLNNS 1N2r2   zname,textcat_configrG   TFrS   )rI   rJ   rL   rK   zspacy.TextCatEnsemble.v1@   i  r(   )	rI   rJ   pretrained_vectorsr   
embed_size
conv_depthwindow_sizerK   dropoutzspacy.TextCatEnsemble.v2)rI   tok2veclinear_modelzspacy.TextCatCNN.v1)rI   r  rJ   c                 n   [        5       nSU0nUR                  XS9nUR                  S5        UR                  S5        UR                  5         UR                  R                  S5      S;   d   e[        R                  " [        5         UR                  S5        SSS5        g! , (       d  f       g= f)	z/The old textcat architectures weren't resizabler&   rO   r!   r"   nOr   NNEUTRALN)	r   rb   rc   re   r&   maybe_get_dimr   r   r   r   rz   r8   pipe_configrM   s        r.   test_no_resizer    s    2 *CN+Kll4l4Gj!j!NN==&&t,	999	z	")$ 
#	"	"s   B&&
B4zspacy.TextCatBOW.v3zspacy.TextCatReduce.v1)rI   r  rJ   use_reduce_firstuse_reduce_lastuse_reduce_maxuse_reduce_meanc                    [        5       nSU0nUR                  XS9nUR                  S5        UR                  S5        UR                  R	                  S5      S;   d   eUR                  5         UR                  R	                  S5      S;   d   eUR                  S5        UR                  R	                  S5      S;   d   eg	)
z+The new textcat architectures are resizabler&   r  r!   r"   r  r	  r
  )rS   NN)r   rb   rc   r&   r  re   r  s        r.   test_resizer    s      *CN+Kll4l4Gj!j!==&&t,	999NN==&&t,	999i ==&&t,	999r2   c                 0  ^ [        S5        [        5       nSU0nUR                  XS9n/ m[         H:  u  pVTR	                  [
        R                  " UR                  U5      U5      5        M<     UR                  U4S jS9nUR                  R                  S5      S;   d   e[        S5       H  n0 n	UR                  TXyS	9  M     S
n
U" U
5      n[        UR                  5      S:X  d   eUR                  S   nUR                  S   nUR                  S5        U" U
5      n[        UR                  5      S:X  d   eUR                  S   U:X  d   eUR                  S   U:X  d   eUR                  S   S::  d   e[        S5       H  n0 n	UR                  TXyS	9  M     U" U
5      n[        UR                  5      S:X  d   eUR                  S   U:w  d   eUR                  S   U:w  d   eUR                   H  nUR                  U   S::  a  M   e   g )Nr   r&   r  c                     > T $ r*   r+   r,   s   r.   r   *test_resize_same_results.<locals>.<lambda>      Nr2   r   r  r	  r   r   I am happy.r   r!   r"   r
  rS   r(   )r   r   rb   r3   r4   r   r5   r6   re   r&   r  rf   rh   r   r   rc   )r   rz   r8   r  rM   rm   annotationsrq   rr   r^   	test_textrx   pos_predneg_predr   r-   s                  @r.   test_resize_same_resultsr    s     A
)CN+Kll4l4GN4g//T0BKPQ 5,BCI==&&t,	9991X

>y
@ 
 I
i.Csxx=Axx
#Hxx
#H i 
i.Csxx=A88J8+++88J8+++88I!###1X

>y
@ 
 i.Csxx=A88J8+++88J8+++xxxx}!!! r2   c                  V  ^ [        5       n U R                  S5        / m[         H:  u  pTR                  [        R
                  " U R                  U5      U5      5        M<     [        R                  " [        5         U R                  U4S jS9  S S S 5        g ! , (       d  f       g = f)NrM   c                     > T $ r*   r+   r,   s   r.   r   .test_error_with_multi_labels.<locals>.<lambda>+  s    Nr2   r   )r   rb   r>   r4   r   r5   r6   r   r   r   re   )r8   rm   r  r-   s      @r.   test_error_with_multi_labelsr"  $  ss    
*CLLN3g//T0BKPQ 4	z	"$:; 
#	"	"s   =B
B(rH   r   z#spacy.TextCatParametricAttention.v1c                     [        5       nSU0nUR                  XS9nUR                  S5        UR                  S5        UR                  5         UR	                  S/5        g )Nr&   r  r!   r"   zThis is a test.)r   rb   rc   re   r   r  s        r.   test_tok2vec_lazy_initr$  /  s[    $ )CN+Kll4l4Gj!j!NNHH !r2   zname,get_examples, train_datac                 $   [        5       nUR                  U 5      nU H>  u  pVUR                  S5      R                  5        H  u  pxUR	                  U5        M     M@     UR                  5         UR                  U" U5      S9  [        R                  " [        5         UR                  S S9  S S S 5        [        R                  " [        5         UR                  U" 5       S9  S S S 5        g ! , (       d  f       NF= f! , (       d  f       g = f)Nr   r   c                      g r*   r+   r+   r2   r.   r   *test_initialize_examples.<locals>.<lambda>[  s    Dr2   )	r   rb   getr   rc   re   r   r   	TypeError)	r   r/   rl   r8   rM   rm   r  ro   values	            r.   test_initialize_examplesr+  J  s     *Cll4 G''OOF399;LEe$ < ( NNNNS 1N2	y	!L1 
"	y	!LN3 
"	! 
"	!	!	!s   C0D0
C>
Dc                    ^ [        S5        [        5       n U R                  S5      n/ m[         H:  u  p#TR	                  [
        R                  " U R                  U5      U5      5        M<     U R                  U4S jS9nUR                  R                  S5      S:X  d   e[        S5       H  n0 nU R                  TXFS9  M     WS   S	:  d   eS
nU " U5      nUR                  n	U	S   S:  d   eU	S   U	S   -   [        R                  " SS5      :X  d   e[!        5        n
U R#                  U
5        [$        R&                  " U
5      nU" U5      nUR                  nUS   S:  d   eUS   US   -   [        R                  " SS5      :X  d   e S S S 5        U R)                  T5      nUS   S:X  d   eUS   S:X  d   eUS   S:X  d   eUS   S:X  d   eSU;   d   e/ SQnU R+                  U5       Vs/ s H  oR                  PM     nnU R+                  U5       Vs/ s H  oR                  PM     nnU Vs/ s H
  o " U5      PM     sn Vs/ s H  oR                  PM     nn[-        UU5       H   u  nnU H  n[/        UU   UU   SS9  M     M"     [-        UU5       H   u  nnU H  n[/        UU   UU   SS9  M     M"     g ! , (       d  f       GN>= fs  snf s  snf s  snf s  snf )Nr   rM   c                     > T $ r*   r+   r,   s   r.   r   %test_overfitting_IO.<locals>.<lambda>i  r  r2   r   r  r   2   r   {Gz?r  r!   ?r"   r   gMbP?cats_micro_fcats_macro_fcats_macro_auc
cats_scorecats_score_desczJust a sentence.zI like green eggs.r  z
I eat ham.r   r   )r   r   rb   r3   r4   r   r5   r6   re   r&   get_dimrf   rh   r   r   r   r   to_diskr	   load_model_from_pathevaluater   ra   r   )r8   rM   rm   r  rq   rr   r^   r  rx   r   tmp_dirnlp2doc2cats2r   textsbatch_cats_1batch_cats_2no_batch_catscats_1cats_2r   r-   s                         @r.   test_overfitting_IOrF  `  s   A
)Cll9%GN4g//T0BKPQ 5,BCI==  &!+++2Y

>y
@  )t### I
i.C88D
c!!!
d:..&--U2KKKK 
7G((1I		Z 3&&&Z 5#44c58QQQQ 
 \\.)F.!S(((.!S((("#s***,3&&&&&& TE(+8HHL8(+8HHL8@E)F#d))FG)F#XX)FMGlL9CsVC[!D  : lM:CsVC[!D  ;1 
$ 98)FGs%   "A-K4KK9K#K(
Kc                  B  ^ [        S5        [        5       n U R                  S5      n/ m[         H:  u  p#TR	                  [
        R                  " U R                  U5      U5      5        M<     U R                  U4S jS9nUR                  R                  S5      S:X  d   e[        S5       H  n0 nU R                  TXFS9  M     WS   S	:  d   eS
nU " U5      nUR                  n	U	S   S:  d   eU	S   S:  d   e[        5        n
U R                  U
5        [         R"                  " U
5      nU" U5      nUR                  nUS   S:  d   eUS   S:  d   e S S S 5        U R%                  T5      nUS   S:X  d   eUS   S:X  d   eSU;   d   e/ SQnU R'                  U5       Vs/ s H  oR                  PM     nnU R'                  U5       Vs/ s H  oR                  PM     nnU Vs/ s H
  o " U5      PM     sn Vs/ s H  oR                  PM     nn[)        UU5       H   u  nnU H  n[+        UU   UU   SS9  M     M"     [)        UU5       H   u  nnU H  n[+        UU   UU   SS9  M     M"     g ! , (       d  f       GN(= fs  snf s  snf s  snf s  snf )Nr   r   c                     > T $ r*   r+   r,   s   r.   r   +test_overfitting_IO_multi.<locals>.<lambda>  r  r2   r   r  rS   d   r   r0  zI am confused but happy.r%   r1  r$   r2  r   r3  r6  r7  r   r   )r   r   rb   r>   r4   r   r5   r6   re   r&   r8  rf   rh   r   r   r9  r	   r:  r;  r   ra   r   )r8   rM   rm   r  rq   rr   r^   r  rx   r   r<  r=  r>  r?  r   r@  batch_deps_1batch_deps_2no_batch_depsrD  rE  r   r-   s                         @r.   test_overfitting_IO_multirN    s   A
)Cll/0GN3g//T0BKPQ 4,BCI==  &!+++3Z

>y
@  &'$... +I
i.C88D=3
c!!! 
7G((1I		W~###Z 3&&& 
 \\.)F.!S(((.!S(((&&& TE(+8HHL8(+8HHL8@E)F#d))FG)F#XX)FMGlL9CsVC[!D  : lM:CsVC[!D  ;- 
  98)FGs%   AI;(JJ-JJ;
J
zname,train_data,textcat_config   zspacy.TextCatBOW.v2zspacy.TextCatCNN.v2c                    SU0n[        5       nUR                  XS9n/ nU Hs  u  pxUR                  [        R                  " UR                  U5      U5      5        UR                  S5      R                  5        H  u  pUR                  U	5        M     Mu     UR                  5       n[        S5       H  n0 nUR                  XkUS9  M     g )Nr&   r  r   r   r   )r   rb   r4   r   r5   r6   r(  r   rc   re   rf   rh   )r   rl   rz   r  r8   rM   r-   rm   r  ro   r*  rq   rr   r^   s                 r.   test_textcat_configsrQ    s    N N+K
)Cll4l4GN'g//T0BKPQ'OOF399;LEe$ < (  I1X

>
@ r2   c                     [        5       n U R                  S5      n[        U 5      nUR                  USS/SS9  UR                  S:X  d   eUR
                  S   S:X  d   eU R                  S5      n[        U 5      n[        R                  " [        5         UR                  USS/SS9  S S S 5        UR                  USS	/S
9  UR                  S:X  d   eSUR
                  ;  d   eg ! , (       d  f       NE= f)NrM   POSNEGlabelspositive_label)rS  rT  rW  r   FICTIONDRAMArV  )rX  rY  )
r   rb   r:   re   rV  cfgr?   r   r   r)  )r8   rM   r/   r   s       r.   test_positive_classr\     s    
)Cll9%G1#6L|UEN5Q>>^+++;;'(E111&:;05L	y	!%%% 	& 	
 
" !!,	77K!L$$(<<<<#5#9#9999 
"	!s   C**
C8c                      [        5       n U R                  S5      n[        U 5      n[        R                  " [
        5         UR                  USS/SS9  S S S 5        g ! , (       d  f       g = f)NrM   SOMETHINGrS  rU  )r   rb   r:   r   r   r   re   r8   rM   r/   s      r.   test_positive_class_not_presentra    sT    
)Cll9%G1#6L	z	"<0ARWX 
#	"	"   A
A,c                      [        5       n U R                  S5      n[        U 5      n[        R                  " [
        5         UR                  U/ SQSS9  S S S 5        g ! , (       d  f       g = f)NrM   )r^  r_  rS  rS  rU  )r   rb   r?   r   r   r   re   r`  s      r.   test_positive_class_not_binaryrd    sT    
)Cll9%G05L	z	"!9% 	 	
 
#	"	"rb  c                     / n [        5       nU" S5      nSSSSS.Ul        U" S5      nSSSSS.Ul        U R                  [        X25      5        U" S5      nSSSSS.Ul        U" S5      nSSSSS.Ul        U R                  [        XT5      5        [	        5       R                  U S/ SQS9nUS   S	   S
   S:X  d   eUS   S	   S   S:X  d   eUS   S   S
   S:X  d   eUS   S   S   S:X  d   eUS   S   S
   S:X  d   eUS   S   S   S:X  d   eUS   S   S
   S:X  d   eUS   S   S   S:X  d   eUS   S:X  d   eUS   S:X  d   eg )Noner   wintersummerspringautumnr    twor   rZ  cats_f_per_typerh  r   r   r   ri  r   rj  rk  cats_micro_pg?cats_micro_rgUUUUUU?r   r   r4   r   r   
score_cats)r-   r8   ref1pred1ref2pred2r   s          r.   test_textcat_evaluationrv  %  s   N
)Cu:D#LDIJE3#MEJ'%./u:D#LDIJE3#MEJ'%./X  'O ! F #$X.s3u<<<#$X.s3u<<<#$X.s3q888#$X.s3u<<<#$X.s3u<<<#$X.s3u<<<#$X.s3u<<<#$X.s3u<<<.!U***.!U***r2   zmulti_label,spring_p)Tr   )Fr   multi_labelspring_pc                    / n[        5       nU" S5      nSSSSS.Ul        U" S5      nSSSSS.Ul        UR                  [        XE5      5        U" S5      nSSSS.Ul        U" S5      nSSSSS.Ul        UR                  [        Xv5      5        [	        5       R                  US/ SQU S	9nUS
   S   S   U:X  d   eUS
   S   S   S:X  d   eg)z
multi-label: the missing 'spring' in gold_doc_2 doesn't incur a penalty
exclusive labels: the missing 'spring' in gold_doc_2 is interpreted as 0.0rf  r    r   rh  ri  rk  rj  rl  rh  ri  rk  r   rg  )rV  rw  rm  rj  r   r   Nrp  )	rw  rx  r-   r8   rr  rs  rt  ru  r   s	            r.   test_textcat_eval_missingr|  D  s     N
)Cu:D#LDIJE3#MEJ'$./u:D#=DIJE3#MEJ'%./X  7	 ! F #$X.s3x???#$X.s3u<<<r2   zmulti_label,expected_loss)Tr   )Fg      ?expected_lossc                 .  ^ / m[        5       nU" S5      nSSSSS.nTR                  [        R                  " USU05      5        U" S5      nSSSS.nTR                  [        R                  " USU05      5        U (       a  UR	                  S5      nOUR	                  S	5      n[        U[        5      (       d   eUR                  U4S
 j5        UR                  R                  R                  / SQ/ SQ/SS9nUR                  TU5      u  pX:X  d   eg)z
multi-label: the missing 'spring' in gold_doc_2 doesn't incur an increase in loss
exclusive labels: the missing 'spring' in gold_doc_2 is interpreted as 0.0 and adds to the lossrf  r    r   rz  r   rl  r{  r   rM   c                     > T $ r*   r+   r,   s   r.   r   #test_textcat_loss.<locals>.<lambda>~  s    ~r2   )r    r    r    r   )r    r    r   r   r   )dtypeN)r   r4   r   r5   rb   
isinstancer   re   r&   r   asarrayr   )rw  r}  r8   doc1cats1r>  r?  rM   r   r   d_scoresr-   s              @r.   test_textcat_lossr  f  s	    N
)Cu:DcSCHE'++D65/BCu:DcS9E'++D65/BC,,34,,y)g////-.]]&&	34C ' F %%nf=ND   r2   c                  0  ^ [        5       n U R                  S5        / m[         H:  u  pTR                  [        R
                  " U R                  U5      U5      5        M<     U R                  U4S jS9  U R                  T5      nSUS   s=::  a  S::  d   e   eU R                  TSS0S	9nUS
   S   S   S:X  d   eU R                  TSS0S	9nUS   nUS
   S   S   S:X  d   eU R                  TSSS.S	9nUS   nUS
   S   S   S:X  d   eXT:  d   eg )Nr   c                     > T $ r*   r+   r,   s   r.   r   3test_textcat_multilabel_threshold.<locals>.<lambda>      r2   r   r   r5  r(   	thresholdr   
scorer_cfgrm  r!   r   )r  rW  	r   rb   r3   r4   r   r5   r6   re   r;  )r8   rm   r  r   macro_fpos_fr-   s         @r.   !test_textcat_multilabel_thresholdr    sQ   
)CLL%&N4g//T0BKPQ 5NN 6N7 \\.)F|$))))))\\.k35G\HF#$Z05:::\\.k15E\FF\"G#$Z05<<<\\j#Q  F < E#$Z05<<<r2   c                    ^ [        5       n U R                  S5        / m[         H:  u  pTR                  [        R
                  " U R                  U5      U5      5        M<     U R                  U4S jS9  U R                  T5      nSUS   s=::  a  S::  d   e   eU R                  TSS0S	9nUS
   S   S   S:X  d   eU R                  TSS0S	9nUS
   S   S   S:X  d   eg )Nr   c                     > T $ r*   r+   r,   s   r.   r   .test_textcat_multi_threshold.<locals>.<lambda>  r  r2   r   r   r5  r(   r  r   r  rm  r!   r   r  )r8   rm   r  r   r-   s       @r.   test_textcat_multi_thresholdr    s    
)CLL%&N4g//T0BKPQ 5NN 6N7 \\.)F|$))))))\\.k35G\HF#$Z05:::\\.k15E\FF#$Z05<<<r2   zcomponent_name,scorer)rM   zspacy.textcat_scorer.v1)r   z"spacy.textcat_multilabel_scorer.v1c                 @  ^ [        5       nUR                  U SSU00S9  / m[         H:  u  p4TR                  [        R
                  " UR                  U5      U5      5        M<     UR                  U4S jS9  UR                  T5      nSUS   s=::  a  S::  d   e   eg	)
zMCheck that legacy scorers are registered and produce the expected score
keys.scorerz@scorersr  c                     > T $ r*   r+   r,   s   r.   r   -test_textcat_legacy_scorers.<locals>.<lambda>  r  r2   r   r   r5  r(   Nr  )r   r  r8   rm   r  r   r-   s         @r.   test_textcat_legacy_scorersr    s     )CLLJ3G(HLIN4g//T0BKPQ 5NN 6N7 \\.)F|$))))))r2   )\r   numpy.randomr   r   numpy.testingr   	thinc.apir   r   r   r   wasabir   r_   r	   spacy.cli.evaluater
   r   spacy.lang.enr   spacy.languager   spacy.pipeliner   spacy.pipeline.textcatr   r   r   !spacy.pipeline.textcat_multilabelr   r   r   spacy.pipeline.tok2vecr   spacy.scorerr   spacy.tokensr   r   spacy.trainingr   spacy.training.initializer   r  r   _r   r3   r>   lazy_init_model_configr   LAZY_INIT_TOK2VEC_MODELr:   r?   markissueru   ry   parametrizer   r   r   r   r   skipr   r   r   r   r   r   slowr  r  r  r"  r$  r+  rF  rN  rQ  r\  ra  rd  rv  boolr   r|  r  r  r  r  r+   r2   r.   <module>r     s3      - K K    M ! # * 
 
 9  $ " . 3  vCSABCf3C@AB  #3QT(UVW#3QT(UVW 
 
 !(++,BCGL  4!S !SH 4%* %*P #"
 4W 
W8= @ $% 4 	
( 4< < 41 1 >?% @%& >?' @'@ )-A!BC D 	23	<=66" )-A!BC D 	23	<=33  
'<SWlq  BC  D  	E	'<SWlp  AB  C  	D	2G^cx}  NO   P  	Q	2G^cx|  MN   O  	P	'AX]uy  EG  W[  kl  }~  NO  \`  a  	b	2Lch  AE  PR  bf  vw  HI  YZ  gk   l  	m	'ANc  I^  uy  NS  cd  ve  f  	g	'ANc  I^  uy  NR  bc  vd  e  	f	2LYn  Ti  @E  Z_  op  Aq   r  	s	2LYn  Ti  @E  Z^  no  Ap   q  	r	'<I^uyz{	2GTi  AF   G  	H!,%- .%  
'<SWlq  BC  D  	E	'<SWlp  AB  C  	D	2G^cx}  NO   P  	Q	2G^cx|  MN   O  	P	'?Lax|  SW  lp  DH  ]a  b  	c	2JWl  DI  _c  x|  PT  im   n  	o	::  
'<SWlq  BC  D  	E	'<SWlp  AB  C  	D	2G^cx}  NO   P  	Q	2G^cx|  MN   O  	P	'?Lax|  SW  lp  DH  ]a  b  	c	2JWl  DI  _c  x|  PT  im   n  	o	*"*"Z<  
2LYp  Vk  BG  WX  mr  Cs   t  	u	'ANe  K`  w{  KL  af  xg  h  	i	'LYp  HL  M  	N	2Wd{  SX   Y  	Z	'?Lcz~  UY  nr  FJ  _c  d  	e	2JWn  FK  ae  z~  RV  ko   p  	q
	"	" #	24KL	<>TU443El1Ej $ 
5J_v{  LM  bg  8h  	i	+@Ulp  AB  W\  .]  	^	5Jd  |A  Y]  hj  z~  NO  `a  qr  C  8D  	E	+@Zqv  OS  ^`  pt  DE  VW  gh  uy  .z  	{	+@Ubw  OS  .T  	U	5J_  mB  Y^  8_  	`	5J_v{  LM  bg  8h  	i	+@Ulp  AB  W\  .]  	^	5J_v{  LM  bf  8g  	h	+@Ulp  AB  W[  .\  	]	5J_v{  LM  bg  8h  	i	+@Ulp  AB  W\  .]  	^	5J_v{  LM  bf  8g  	h	+@Ulp  AB  W[  .\  	]	5Jd  rG  lA  X]  mn  CH  YI  8J  	K	+@Zg|  bw  NR  bc  x}  O~  .  	@	+@Ubw  OS  .T  	U	5J_  mB  Y^  8_  	`	+@e  sH  _c  .d  	e	5Jo  }R  in  8o  	p	+@Xez  RV  lp  EI  ]a  vz  .{  	|	5Jb  pE  \a  w{  PT  hl  AE  8F  	G? #JAK# LA:&Y
+> N#=4 =5 =	=< !4 ! !	!8:=* .D**r2   