From 60196b2af8e2187c7797a7432d3da4580ad00fd0 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 17:39:01 +0200 Subject: [PATCH 01/26] added new jsl-lib based s install --- docs/_data/navigation.yml | 4 +- .../images/jsl_lib/install/access_token1.png | Bin 0 -> 115572 bytes .../install/databricks_access_token.png | Bin 0 -> 100443 bytes .../jsl_lib/install/install_button_colab.png | Bin 0 -> 64101 bytes .../jsl_lib/install/install_logs_colab.png | Bin 0 -> 280649 bytes .../images/jsl_lib/install/install_pop_up.png | Bin 0 -> 66318 bytes docs/en/install.md | 402 ++++++++++++++---- 7 files changed, 325 insertions(+), 81 deletions(-) create mode 100644 docs/assets/images/jsl_lib/install/access_token1.png create mode 100644 docs/assets/images/jsl_lib/install/databricks_access_token.png create mode 100644 docs/assets/images/jsl_lib/install/install_button_colab.png create mode 100644 docs/assets/images/jsl_lib/install/install_logs_colab.png create mode 100644 docs/assets/images/jsl_lib/install/install_pop_up.png diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 5052636a..dcdf76b1 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -29,9 +29,9 @@ docs-en: children: - title: Installation url: /docs/en/install - - title: Usage + - title: NLU Usage url: /docs/en/concepts - - title: General Examples + - title: General NLU Examples url: /docs/en/examples - title: NLU for Healthcare url: /docs/en/nlu_for_healthcare diff --git a/docs/assets/images/jsl_lib/install/access_token1.png b/docs/assets/images/jsl_lib/install/access_token1.png new file mode 100644 index 0000000000000000000000000000000000000000..3d4c0d19322b008ef5435694ab3935497e18c174 GIT binary patch literal 115572 zcmeFYS6owB*glFnii+qsil{V4M5G3#i8K`{f`C9Ev`|Dqx|9F`0t%xjRceG#2I&Dp z4M=E;(wmeJLI_c55&}r536PwPWxns~T%F%J|BJ(qi)8Pez1MozTb}26_j-BXK%4vM z`J)^h9Nc$x?ih1$aB6dK>|Z>*A2>3xvhB*j@r2{g+rJ#z*x zsFr$JEdTXnP7{nvy!4$CDLFMZr9A8|j1u3dWT zQv2(79DiK=A4@#kGA56X8sw^FhGhI_!Hd`K6)z2$BG)(w*tpR3PZP&}59-ltWAaM2 z0IdBj8eM`iO(XrjC;yvls*R*ezsn=!5N}W(E=V@Q?_yJ$-mk%2IOON&Z%U{G#l)?Uj*4+7pBf!dm%djGc)oQ_`T#$ z%!en5Dd|RubQw@fX>C((nDMi?eheBnTl$7dGUUphGff7|Q*Bc&OF5<-4bQ#K^Fbyb zr&Mnm8J|DDZqW+)kWKZ}!(kuK!^Plsm;*nj^5lY#o*UlpXi%P&DIsLRB}dY*M^eA% z3gWft<#-cW-G}vLt??eSD(j#M-s3~S4Gl<%p4@8q6oYns74f~B`DXID6#HKSeDHv& zrDgeX4V=KLQ(`iIZ?UXlpTDr^)g}d&jiy0F55EvDTBL8N7n@JLMa4?A(aU$P#KtOA zrIZGVC>iR?`_}$)46WSM+BlTqQNcW&_S6r&JsJz%KL4jL;F<)Lk z-naW=9!J*+b#~E z1dn{q`9h`hwkU-M#Y>E65R2+XV7I6f9}(19e!;%J9anT=>vopeJ~=fttXr-*qmTc2 zmPGBg#A~%-nbSx5!4RW?^4po@dcR5iEFyyh<%pY+JxLv zW3k}7s4#!%ymrv=`Qx8n_#3;0VyIT6q+y7?2TcY2U~XwuT)$_T{gcA_na!bS<(l`6_;slvLmQXV*J^<1YzV#$i60O7vlt^7kKR`n zq~j`gpKDzRf7l}T>7YJTuP zu%4^x8$MWl(Ji)gLwo#_9U{f@LCnG9@Lo59?bY+&D$8%&ZbGmVTy7WO+F=TZ=Ei*` zx3bQg#;w(EZVz|*|Ms9Hh$Sj96#}Ka0ZA6q^?P1Ht;^!uu`@_Qm!(TCs1)ti%(~KY zy_2_8^C3_XsK+JpaUU8+gmzB+7+Ay8EL_~Gp?8TONyE16UB<|eF*I1*N;L{*@UrBA z?OcVm-hyuS*}tc+T3Pa!3RUaE@Z#IHdVEa_H+I8$#PO!WzP5M!8_b8?k!nXG7Vb4r z_3*T5f{iq)h}`B90srMxgC%GT129^SLOJG<*D{WEMSaFT)XCn_*Nr`0znBR<=m@LJ zKGSW9sK+a+m+zE-_+JAnx}aQ2!e>t6(F#J3&?V~r9s?35 z*FAh}elDn8vg;#Hy}Law zhhTnMjw2VW?ffGv*_>9y*7n2`+vI_II($u+OM+U$XGzy}TW-11yzz;5s=I}Ly`%_N zkdyzWKuoF{e5SdxJh?30N_ps-UY-!)9N$Ixd&Qo)JV7?($v)w`Fw^wnAwvSuEA};B zUQ^&6y2Pmmdv16O=b2xK!*sYS6?oo9bzUvWGq=6MMuQc{*0@rg(F<26&DyG}#Ldwq zwcHAQ;X#6qR=&TGoy_=j@<<3O)ykUqX=EsiF0*_~>*dvj+XxdkQ)u*#TYN7zh5xwyUw z&M?UQ=~Q^w=@90@5)ghJYM$%w{PCcWJ8Jk7=J~=>KiUM<6F+309SPy4W0jHEW<;^` zC-vY6qS(*T$=sMp9ktQ#OTn$zROEGYKeh~rZ{*1OIfase`mQ%|=CZ4EQor;(34Va#Qi2^V*q&booW zr~k-KvaSbKzcPk>T4}8=IQ7c9&IekQ+8|inG+LjsaQo+!IW%%|s~19pyt_X%_O_zY zxPKi)Jb-5m(Oq3J?)W!-ACv<%UQus6AZ9%GS85AyH(0LP$yI}D*#G+dS#JS^u)mNq z5{O*6I$Vf-%8byMmAMi7LX&yyP^@R38@C}kxH7MvSQTZ7YwYDA?0drPB1T@%U?$=G`?D^2aqx z-^Q}Azn-HvJePgW73rb5e%|4N8O+aLUal_1O!3Sw0B#EF11gv|GJ?>-XS} zRXVES{0+%?roB&=EMC6h(9a(~L6TnO;rd^m{#x6zHAvii_VkzeoWgo%}0jaXgp9W5E@CuJm}dd)U;t>QZ42 z*?o`v?)^QME&UC{IqY8jAHpC1pB+Zh+pqMaQE#sN?|;{t(+;qw=AvF;-;+NLVe=pl zceC_2#eNb8=6wPC&5AxHQ1@2?M}A&;!x(yD6gcwZ+f8jW*GJ&U&r{!YfSUqGetrW8 z&Yugv=khOb>j(c)9>4$pVYmuoa-3&L&MPGeO4Lz{|2YP%nx>m~2@{tXoKmLFDEP*{p4l>O1cSuaEBIUQi3gAC z#X4IFnA05sorz&kz8_BWITnn3^Trx@c!{-?+vM6CEqrFTnXmjszYB%$o3k|gGJzVF z9$0u$dd0$Pv8!nLn}XFbOSl_k0^=79S{+9Bp1FGAYSXCNZQ;5UAv_(B7{C=0B8x8r zek7JJ!ub56E0B={s<>Bv^7vJvb3py&2%b&HT7>Gr8O5{`PU?1tFU>O_1F3l}b!f39 zTnoXgu9D;Dl|S=wKj^CL2xHjIb_QRy#Z=>~$j4(xf@4*2px#FrhZZOn) zztHs2%PU0dI`v4e<)xP-B3pEoc;Ngi9rQv@Zi90-`KWD7i7M~Dlw>tfnQl4}b<7BD zH90;Loid|y+)-e_OAZn#I$h~8P!vtd76YMM*ab!2hcCm=UXsU#uZ#%~VVSMAF1?R` zB!-*UpUdD?Q*74XzXvl2=35c@$k4_aElYT{@2M!}aqvj29U4Ve+*c${c(p_c!K-IM zr~%F0@>b@fglFT~y+VCgA(4?_#n)A-7>er2?~;F%2xWD7Ekw_1TrL#8k{T~{DP^*q zvVeGr?wCyQWM69R{qSSzhX?NG<6LI?yjQw>2MXAB^CHS)*sz_?cIZ-5?hKOgNYM|o zKt2jAW?x=+hUmp$8L*q3 zvCXcUZcw&5e0Lav%5O@q%KR8Ws~os^X`*^wymI%mo$J@d z{p+7O^+5S4iY4zLQpudh#`BvUcwoXPszHM-G5g3;*C$pu#hExoWnmH64U5=GErkT` zMXU?Hj5$8>JgzH1f`wnncuPL#tsD|o%Qi$t_tzhUPZneN3Hd`#wjuu4Ns6S1kpy?* zw2kAtC3lfNC=e4N8rGXm?H*w#11>DY8_s#bjTUx%LtThr{*l#=UClJ6x>Dvc=`qQd z_&qb(Scwb&7FR|JXp5WO>KEw>IOgNuujJwJB|B7x?NhDtnYr9IvDH|BY1)*WuCf+$ zW1T3ZT5ft?_H+L4yKG*9jlo+jY%V*u+xzptP``9Wj*4t`qiRfqRm?15A@WgKz~Q?A)wa~y6l=)(Y3DzB>tQ{yYa0#xp5$*|AgP;~)TY=X`FdiDS> z_|Wql!D3Hu-$IZR%$W)(N;KCL+8*%sG(1MyNYhPA1uxo>wZ zMWqFc*jM>RolA%!z9~|OP`8oT1c>f^tON6)Lo!D7M1{mXr758+Hr_wj#CAPNXctBcspdd8NavVo&XW_+^Qa3_jO&3g}tzjeW2yCB?)19~ZkfsZ=hH zXX&C4O&lPeyptbFdGNEO0txC89*9tMdgv{dX|bo{D;JOS zXk>VV-Av8n=E6rP@a()4hL3L+GIBp?)N>a`r-y{Gn;XJ#&u!gYO5M;T2a6Wx5Tmg# zG+P_cs{ZB2|EkBtk(e|%6y+G=g&K+TBd%*J_OO?$4|-c+?W>iC7a#Y@<9Asr{1h6u z=af}`Hk)w=OZM>ktap$|TJ z46xT%tclyhmJ}X;z~S+agq!PHUKK9ixs{u-Jj;s}nz)j*%W6_rURtV*n^V-C-_<*S z{qExura(=nMwuG!ly@zHSgVZv^{@2=P1)3-w5#Hw>z4i5TnsaFIQavGQDFkIzn5t|- zKHwq}*1%wHI%V&cSvXHW6%az!u1VG>GejlIKlWYUZCD*>sorE|zR?OUdFxWh8jkAm zaSyB6;d8mb4$VqLQO1EI2u9wCZI8m8G=!C>)O}kS{oraF z=v>Uuz_*qSbX($@#lM}H+N<@hz9q&af3E`7H84B8T&Z{;C3`lyo%T>xjGT3GR35LI zO!`C#vx8)kRn=F+^hnE@ox8Ol{n3^ksihuTWBVlIu@o#_d3&nmgxAJpv=h2PS;IiL zEXau9X;5DQTJ_dnUWebupRX%Xf3v&L?Dl~B+ZuHKB_lj?*LU{$2OXGmq1m`_gz4-f zq#9rO$%t+&zC4HL5}uqr%$93f(vc$Jf^@C+UyeI`X8gJPr*XWn_M>|mU-q$fMJ^zx81#ck-JkAkLDGWaQxS=N%3l8kiO8wK$FmW zU8|b;!v?Czjy=o6FL18zDmhOTWUC=fq4PShxy)5=xzv6NIlz`$=al(UPlv_SbhL0A zP?oIPTKj@L!S*IeSqLhw_RdULVsrQ-Ko(j4R5mGeJ2o>QI4n6mRQCp3h~%|B z-XWSDVpBXG%>S4Cc?qhP3Vty``I$o7`(t5O%qGVjPk8Qb+HODRuZ68|HQVXR>*+$O zIYZE~tGjJjW4wJ(W|+T`>Gri)FS}F2LTh1~q-I(W_LDpwKWDT%EW2-&VaZbOVx#{J zlYZum-RJuU=|H4Mld!7kV*h=vSTJEr`mIR({$`M8m_bCde>a&$6l@M_4A}qlX=ZZ? ziz{o37QOZ<;w~&mhN;n!U)^FSCHKSB|B=q_qU-+}y zFN!i-v%QOM?0Dq1sQuyVndEcra$L+)Cj&liYQiVimhW;U3C>#{p#H$T-+iJ&(c4o} zinsfd+#>5;?UtW(P<4x+z`R^5Rcu0uihcn-eLKDu%^@3P#HQnyr0&$cs2DJXh~uw+ z1wK7uD5haO9LrRV>yGk$Ey!k~^a&CNOvsU}R3IjIa-+^*a~nir`O4?IE(5`mpXUDN z&BI~=mI&MNgZz4Kl(!W#Guu#|=0Rg=&i{8P@qPrN)I3*etD>QTx+ zhY%~HE%d^qg>1r@UaC6AtdC{6eYtXq(R>{*kKpRux}Bo>2VNc@t2{vo>ugCNXvefK z4#+`DZe@;R@U(YYXt!hfP3CV9yw+c39q1FF^_-80VE(cBhM^9s^qTv8p1M5B=8rr0 z2N`D~sJ?^LfpFD}R&(i81%JPVsegmroS8zQnVVnwsz?ZjY!3_w^_}k_zE0F}R0@pdaz^{*F3+_x+IG zq}U>W{(|!OuI=Bzl(C3BlVdQ5Ae)$8;w?KcE$`Pk1xd9@>|n%Z_B3}T9*UNBGTUe? z?`KZZs#Bg8V_X@7U$pyGL$_u$EU>FK3C-UF=Cb4Ubj*~>LHNwjZr1U-jufdOR+vTL zd(RM&I zA6ystlZMt!zv`x?GL{zfVVwR<%o-f_A?@PLLe5-U-gKnrmk+FE`{B8`PuT|v4!-&@ zO&|LtwW_fqcA&Ve(8hwmc#zy%2$70f9vf`2VZQd<^=qdn7|zwIh3QbnJWeDO;D#o% z{z2;eBvlC~bzpc)`QoJu!sPB|uiMcmZ|1${pd^HIxmO5gq*oR+-60Ub#V*G~rv3_w zJWz6YJFn~wp$!r1GHLqS?YE|zV+&h*P5&D#TFbh z^Y5R@qPjZ3Gz@P2=~L=ybk+g3=x%vL2Nv)=g?gN}2JO>d7_gbDRjVshIj&t{2R;I{ z%(4$cE5HPLi%P00W}|QM&#iSwG;84*t0_>(s^U=E`XWY^k4F*@%j&;hh*P-ulR)JG z4foK;GV%}2N-mQ385X*Ykb;->yx2kg_18V5$qj9>-mH^V^yRPxRNrUsXI=`=)y@4@ zTue(WjmL+4X)eo`gU}_Gtc?j@MJ~RPab?ZeY}=lc4drE?yVWgB6%mU16?0dpZk!j0 zFL?7WBlH47XXH_7QS>t~q%nxNN%-2IF0kcj%M2+E66jhG;!Za$*OzSA)vR~$Gz0n! z6BM^qDl2URxvmR+rjwvRN{Cl+BVXL7+&bKS+G?Ht z$eYBxFY>rz426a|M5@T|8y@#W6wE%T-T#3(tT|iBIR92)ryPSMa9JKoo!yx^F;~X(g(i~;vyDC%z#E(?lfmq!-4iT=2=Z$|CR2gHUm}4WqtJt^2b!Da zCSMEGu?sDn^Bn2Xy2NM8d;?#TX5=X9uhEw`Qn2Wx?!zX~<)5(@lZVr$PdG=I4xb(~ z`}V#FdUsyx>8XAetBa+c#NJ~_Mdl zO4=dr%=?BzxwS=wIOnKzfKP0b)?X^WcB}&}MCXOgm9Q47za{j9yvJ~svxN>i+=vUS zC#vgz|CEn&^^DDUet2nrP@V)^t43-saea0?1BlZ@>b^^yoF>o+@*TF^TmL+XzUh?< z)#RbnEK1e_Uy<_sM-v2t>V?pFG*yt;1C)yv#ci5b-wk2ZrIsRaPmg7As&)5HQVJw5GEAAh1NbsU%Cn{}N)B(T?4x?g zRnBarO$SXH$4^}YQNOt7TG%*55--b~0UPihyf?yEr|dw(C&FD!k8Dcpfq%;_Pu=3? zmu?&c2aB-BRbieMwgP<&{Cd?UCZ$b)8qWoUV6f3#uxEc~Xq{_p(h&O#>P@^?3cIa7 z{K>8IhN0E%%Ups{-~f(7p?kj01Do+~Mp$trUZq`OBD3)vnzo$m%dO=xs1FNf`fmn{ z`V^AOcdpfad2n~Na;H6DtrBPH&a5sG+3iUh5}ho5z5XxVaA2B*oLv9R*4nOW2JrlX zn;Z1-j#fjC9;~eS?%CF3&g(h^McTN!KqT?-kCLINkw`UT&e?APW#eTX7tI~06M;S4 zVm$LeSG;q9_VkUGizXECv#;gY5lQnuoz6|!@1`VMI4e|1Ql=Z9_GQ4Xm%sNEl6)eu z$Gk}FOczYPb4c~=rGSOi@|uJ!jRdM?LUuE!QfpW)x956M%XP@7$$%Xo1f_7ro)u3g zgZc~?gpz`b%aWefFQok+d~m4wOIcve(kSDBbvY^o1WnU9htX ze1i4!?WVx9=sm|7ZjG;-*qcK0zUq}Odf*b#FW3VRdUnn#z5w0Z9yW!52PpV-IP=+R zY4KQjQFJCapzzFCF>YZ)ah-|GW4Mx5$KRbh~>i{&REafiye9Sc!9qKe=^{QpX6#3n`Nsta`3CF42Ssb~bKJF2Z?wELp|m_4c9Fb~I1wsa z0A7M%H|mZY8_W>5Y%o(RW>Izz@E|gmb>o#2cL8N162EVF-7;tYTfv?ikO{e2pUUOv z+QcD*?6hD%i&2-qDGv2yZjx$VmduOxggEQnH0ljnmKRFAXFLvy`eEM*;|NN+fG z_blt!I0Ql2iX+@GwA*@YUCOnBZvA`Zh{Y&%+l}%na4Tx--Wf~RzYej@{DXfua`?G8 zK*O~`N8!fq!uI{sCHRVDHSXYW1rvo>KiR;v{Bep{Lr?wB zfZ+K!0kYErO{3(1u7=CNM1KuzRTriSi29aBr+G@JcdwoP?*tbRpMNx*=CR>6%5(eO zU%7Dq8?cOqZJ$1MAq$O?^}4oiPYP&UT?vovKYli>pgQ$IHlOru&L(wI*0jGS4ZA}qi!_`bSCCUklei84zSg!q%sbNHas3JJ_w>wd zQIM6JH0-RhcYBwYac{o8o4e;^=+<;(HL`JKzJ}6kwK0|sXVX5n2q{; z$hV4VHG7lJNOMyto{5+r#`j`Tn_-B4>l?H~JJ;eyDi-(haG=XxuWL`qN#1tRbmZ}` ze{NEnV*rc&*Ow#bwf=E>L|SyJ2RQ`-PE3QmuJF-l?Os<^Rds5((2NUQFYBuA%{Sr^ zE?(j|?qGMZZ}3ov-2u|$cVeb6kETXT9IipC1H<`!zup$lqv*F_@nk{6j+hEH;~76WY0m@*N4)K#UjG? zozOs+Ol}#YL7|3I=TIM3h@}q)wz#{R0Aol!E6!5TnDGF0Gv@jhE`wAUC??whpi?rm1UdYy8S#3}Ed-)m&!R@O-j9!2`GB9&R1=qtTsn(3%|joF$0GZ<-I~~ED~hTEE%d5K962f^0veob5CFFgeeCt zRgqcPl@51 zf^1DIif!0DgxeXa&6Sf`fh@Y><$K$Klh@|^j{4Zqap~XGD>j`a$Ka9{LV^vO)5NeW zY~T{}4uKmADtNm+&3Ma@cnELp<{tWRR$G^+zpWa6AfPT1 zoE(9Kln13)vQ#nSl@OaD`Yd;CN8_8nly2|d=v3BRIz-Ph=3S*`a+)B^lL{Sn!g-i( zL+j5@_KQ##-gQjX3I{{V`Qe1l;Eqs}p1VtgGky2AsNIUb1a2NL4nxG}cEs+ALfjLq}Jm`Y08qan`CBOqp$^M|`9B zbh2ZP_0x&g2iqPOML6xAt*GqP0np!jA=74uCgI7daN_upXoz}OXTO-FO=gXunmaEN zV)EKfa2?qnIbg%=Yji}%>h7b#gVinG`h@wslS>v5 z$fOe|!*t-{QI<9Ej*_VY-8s0Xh}h;(C=dW$dK61mjRfHTO4(rvDYmbn_vPFcXN!B( zH(x_@stU};du{64tnDot;S`Ca@DmtgLI)UV=srj)I-K62NO0_G^AUXrV7CWz*3>Am!cd%PzWC}HP_V!AcH^b^^O$C@+W@PvpE%wN;v~`OVa&$F}# zsb*$Pth=q_ncMlCaHpA=_Um6O9!nSO=3NgEpdF;$GK57ml}U!_Y_=B;_uDpP+FGM0 zE$CVmt&_QpW788Y*8}ezHw~LAiY~UH(kGG58|1C}Ojg~^3SO=2fb>ACH6eW3nst^v zbwU6sYBVYDb8?oUq16*sMSqj%i=5#!gud#V5fJTJ;6s7UEsTxCICpGXRkqoG6MuL( z1K(Cc5Bx9*s$PwrRu!Br=?C76jBhaM3=ZGae1)uBJ$GWxu~dN_$nu%5&c`l}q$~_+ zowtfRwepq`OuJ%^mRJstpOZq>J0+=*he#9aFM(q5jYdmucpn~1n#PKsnC|{(^?$iF zPzkn&4NpyO`K63ASVi(GdQHBk3shFjVIwo@(f>n$+Y(DYxn&Zyc9C|GmSGD$5X zdFKU8WWTBgl5x+`MwZVCM0By56ym#(rQ!xS6`4$4HptA?dJyXUeJni>Q63v#URsRZ zF??Ui1)=Gmo=WFj7`1u8IG{$%tEjQwHK&Zp6@c($xFj4%*8V-!Vu~|)BU6>PShKrZ z&m_F`=?A}2J4ylsJ0*sF_|5g95vsB*{G!O7LBywe@4$ezJ&%~ymn zW(zNMODNyD*ok^3$I0pNM(g3Zzvjd9arFJKnn2hT$X%$-G zjheZBG9J~^5eM9yGO3@!8=*R3F4*a21;bF3KEMTmg8l?~KiLGzFx|^5ocCu;zw|pE zX>w)r?%X%$(O*Y26O%k&8gM1i~i3^Pi-N)X@*3{(4q! zRt;XCzOBa0mna&TH;%{YxerwPhADZlyk@0H{#ze+MF$q;v<+d|%(-a+Wp7-QGO
*Y!@rOx4KgszwDhR;*zmu_1Uj=?_@( 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 vtSFCc9?l0ff#eeB0 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 AKmY&$ literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/install/databricks_access_token.png b/docs/assets/images/jsl_lib/install/databricks_access_token.png new file mode 100644 index 0000000000000000000000000000000000000000..a80d8389e15ec3adfc3dff6830834a0d597b724e GIT binary patch literal 100443 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 Wv;6Cx+=Tf|#eJvu_od$*I{BY!aqyA= literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/install/install_button_colab.png b/docs/assets/images/jsl_lib/install/install_button_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..6fcf533efd3a76ae04ed8aaa81e942cd6a05953c GIT binary patch literal 64101 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Ë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 a8Jbtv&(Df2M0H6r7ZZ`boqbdL;r{?r)B1S; literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/install/install_logs_colab.png b/docs/assets/images/jsl_lib/install/install_logs_colab.png new file mode 100644 index 0000000000000000000000000000000000000000..0c270bcecbacf3bd0da9288de9ade85b06208ff6 GIT binary patch literal 280649 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

ga;mk`ong_ zF9nvU9W~wu=90p_pfH;dzwW*^rT*FuVYSd-|1;)9V>PDwwI7r<8zbV&VAu#gz=5amBnBI( z$u{xuK@j6L)R7Vk3P{dF*eL`&WayK}^;eUj`vO!c`TK-SC1(X(G~=2v{Rp8>bhYs? zkwReP5|*ArjTsxxSnD(}#1Jf40D7kGKVf-&wwvX+bqMAXUf*WiL8SA57h!(Ujr9*f zS|J?jT#sXM-Vpcr3eZsuo{i=L@l#eJAAYTW{%Ml?-yCTouK&%YjwSuyoa-LU|ME%v z&))`*089=M$L;_6NB!u3n<19?b`1C?_0^nRe69Y3%y{Yxv6zQ72(v)}8X{O9^u-{? z*(_}=goU5`0rY#?gc)MP>mQSk8~}(YWhA0S@G;3Db-tRBNCU=pMNW%DptO}`9)l-j z>htr1;6ER-Vw&W}CK1`SS{h`U5im>Sgql*f%OQ4KY+hNErzdql8!g~Ii z+_K(bTvjj-oKCcclM=Y3hWf!wh4|AuFu#E}jf^oX@%t={j9GW-{O^H_TP(0SvjIL$ z&AkV~HxH&OXW>W#uDZ3kSib{)uS_fld~ zI1>;O!aDX6h%6Q81aAuBz^Sv43>_UEtqMkUTrPkJ_P`HjH?Do(#+Y2_$3x?MIIfRI zw_1Pg^NAB@!gG2$RCb*XHm;OM1g*wxK@wDb;8FDn85_|P&o6-G;A=)?pl(O=f#E~# zDFBtXNs?miZuks$H2NOVisE0c!t(r6opBiJxh6Ijq!BZjy(lTEa18Z@_w-|sGVM?8 z-pA)F(c1dzwDgs6Vqxw`5=)1Dtbpz1O9lT1s~kxCF$Gqpx##v+;e(O_(4%a^a=ZfU zw+7DJZ{SjI_kaAT!`E|-`4b>ar?9dB4LiW# zHkR{Iaif5M3@u5D`>%EL4j`#L?PjZU2vG{R{|WEeEA+^Ic#_&TjjOY?jkjmqxGjUP z9?6*{$>2H3TamZXS$2{lNbRc8AtoAV3g9vT&AIzN!pyP+#Rh~|HL>8|Re}B+a&lLo zGOP#D5f9(o&kE-O?~+S%Af!%3kgbj2aDi8uver4mAZ)Vp9u&PNrM#SLgSeFMA*#KgOKnCia!)t2^UT*7T3P4n+yX8BSI_1PY`(A0sFJoyqNbqh4WS?i((=`Vl^+V8y_=@>sy zMeIU#Rjhv2;b&vB3d&mu7Zdk8zR&9RLh{lkmIP6B2tj7}rz~zxsRi68x{ewf8)xzb zgFYi-mc^ffG_wNzO{`fcCg0_0q*-Y3v-k=!%z?(+>kQD|lrwVo+@!pX^Mp&G1TW=C zY=a>XU!7b_O|3YCb%vK6AyJ8pR(cybE6@hV>#R!bEK^OV@C^9n$tqxHk_gxMojXgg zJ@X$}VOu-KaxulEr5*5v$LCfKrS&7~pUW+&wY#uGfU%zDPJ#&{)tsmiWMtyb&19Ve z!d=|fodb=pcv}&P6zRvep1RO3ARO!{T*r$d1GVMf!WtKh!4%<>!R-w&aSJHXK&Ch- zqVcg1AtcbzG)e*|prC*bE`9!VCw)E-R!o_V^Xeyl@R}g!+P6q zo2842;`9E=r)`RJ;N;lI(@u?tl0098cm$y7fsiCz>Ba{T{2IXq_h=NbIgn@>N+{uq zTbYxSc9R{!djq0463!XOM(4-wt9D53+j=u1{5TOPXNzD!1~)1GG){ID4O}|P!@GnJ zRFM*tmIraOzgTvrW5e2KSp~r#TfiQ|O0P0`%eZ^}6Ro}8;mdw`GxDE@1jwKGb~Zux zAln_!Doa`KIJpUU%yUm&?5+c_7r&nN>L)coAM zjmq(KnW2ditSw~e_*mu`glC%99*}zkj;`(B+k5X4xG5c)LMLv-cV1`R=CTJJSlJ55 zU^=RcA_akZ9Q@}uXdR=L(%ve}>?RJxu{PE5Q=)?XG%bOsXdu}rSRv{CW*PXdUK zgQFP{-s8$))oQLX@w024e7@Dy7btt!PMKT+G6~z*TpCWq_cG)GIa^k#FshDM3a<|a z&q$Gk)ww-p(!Mj)V#6s#*fEq*77FF?*~hmyq7@a!DRt4KP2mPn`b4RAkzr{(f{VeM zZ~9Kv^*G0){xP58mbLQ2Au^-(uEw31i#2N{TZ$unpmS*lk%a`#lOm>sTYjBb?|ly9 zX;(^hK5B^{b;Fi;D)2l_-IbABn4I4MPyA-ZOCVQ+H*MA$v+^Brc5{l>XnC`QH>%g5 zq{7XVmsdS;z0lv0Xlwd$#EZm*FHrrr73Z4`m5~|+4)QdY8=MqLPaE2nXp&D1qePbPF=NTL0mj=BIXH3tku$^kfA1|E4 zwzcS<;C!k(7Ugydn25?~JVoB_bUy;MvZlsic^sX3XQJA?1>86)5BSa3>G9E*6M*(V zv4j*CF-3TM#LOKTxLvcuVpO58BJL2^mO8Xu+M~xv&iR736*S3lQdo{L((`n(kAFmj z`4VM(yWWMvd$XxM7EN=4;E9X3V~qEn+;%GXgec)9j6WXVdP$ZOBZgv=B6n76&HZ4C zSye%^!oKT)HfS^qJuV)2#Z!mLZUV=t3|%K=h**I*i#?3?k}%;3)lY_hyH+j@8*IM`Ro!%lzfb!@6i^Vd+8CjsWrQ((fm~K@Y`$bEYl0 z?fDCplqczSt+6s9){hVZqhMA}%``#MhPBfYxQGfZBEDUN-d--#|`mcCcxS(yjASZZ%N!||%9Qe&PJ-xs`!i`p9y zzGMx0sqb6cSRLP0CmIQ+bNR>Zi`tJmJE*{O@}qiM++8;yZ5E~Dx6d)3|3GZ0;x2n6 zY)r_lK)_}_oAJ1u-$RLJiSvU_zl$?GL9ZjkUdhq_?2(hG1m(&rr&jO1EaPk{Ba+|9 zTR|Y?Q?+}%y&sK1vdZ+$c8rTVQZ{}~?#qn%If+aZJQD(@R=BX>4H9XADEo1#ADHZ8 zbFHJK>U52$2nA-+K(DBj5K}U|Ztdk7-+;%+}CvQKz z2Qu?rbdp6BlH@`#zEPjFgVhBz^y;XTOmFdsil6BB9@V%BU^(;n%SkJQhg)|&DQ8ml zB{gnlk%>D3@l?iiTsSN~CS^><+qvVzUO_|u$Ey{ELu9q_e%pvDQR_o8@@-*^80~>N zml}{dJ^9p_GD~v(mPI_u1G0pK5~NUs1KopGW@)-LD2JKT@3&4S$r3s<5Uv;lO6zzJ zcbG6N%2>xlwQ>IsWp5dk<=VB4B9a0kA>AdV;0*{!Hz*;3q<|>hrG#`NNFyoTQYuQ9 zAdPfL!wpD?Gy)QP-mYgo@ArOt>>qm!e>m1ch3h`AdCqyvBdS+G3!)SU*&f9n(&8qy z;Ps5w1L)i{~P@S0uF7;0( z1PfcB3|ka>xYn|O^DVpD18lpP3Y2|EH62va9>Oa0P`1iv!|8IWPb zlb78cEGd@%8-Qd3sWZBokg1PeRw?#&R3I)TRoY7#eZ67+9C~(@S{X7_${6MTZS*P6bUCgWyJ$zgL*fVJs z)mX}ivjd&>84eeH21w(HI8XO(@qWj((NS-+SPE$g@kIHE^V&$)AAS4gSQZjlTxj2F z=It!6v=jh}$$bO5$xoi5k~uO{1)AuL^k2*bpM`SgMuammbXkQ?uV(NkYrf}FkzLI$ z@sP6qs`*Z_L4x1R+0EQem}|Mjtx0gC^+Yn{OJDj zJ|dEdIkXt@Ym*h{HZCe6Ks`3_EcCbet2{=W8>2t>`X$J*AxZCvj*7CQ_|mn-#l`rd z99cBedYIDWNoVcdxsae8yj_yd*qF;$NCj|+)E_Ao>cizRMak2txpOvp7Zxh-B(m89 z3p@6t1rxXb$h2GE~pbF|S ze52z`L16YF1M(9)EEpn-h_u^tOo(B)&ZH8eT{$bJgUT>hJQ(_967>=_pWrxfS z-Dz>3F;uUH_D8Tp-LIjL;#IUi2QxQiq_$&c4H>NeI-A1CCEkN&YdH2v?FPX2np5;X zr|**`Zqx!AzAo$`J5?ISqmE&LV;7FTHs4cfdFT@8Jzj6tN7d?t*R7{4L_~ z)CO__e)z*pf+>BgGjt^5Q0xPX-NnpgALi}W?nRrso-pPF3z$l&bYdG0RxG(0OP^qp ztwumv28VbB;`~|1N@#-*0np3HRbIk-gTF!W(KDK+cDIii%Y@}705~e*w`AlFt{U)m ztINM+u{3_b8VN9Z+^xL*Hk>A!vlGpBOScen zPWpXGS@c6f^%)%9Cs&#vI4Fk(M6?aYmXeW!F-4^jTupT#o4)(&4mrZa&ypMD$qLIt zD)H>FvJfrI)6p~(_}Xh^`c*}6ME&}K?Gg0!E=`Ar(s8#FTD*MaZ*UYpBMAa) z7RGL#Hwq}~=d+zJVP>?{Z_CSseG?fJ+ku)BoALxoG2j6KYzE!VekfvG9zo6LPi*^j z3xqs%;TZ!`Q>ZJk;=TL}&fP!>zDlV? zM!vOm8Tk&0mPnlAmGaae6S|@Op9yzd;QY7K84W$TY#@;v4VYYs^n=9CMKG*08uidmz>q)+> zxMKO6gN|p2Q2j27Hs=n59L1-cXr=C4FAa<^*}k9}7w6xgq(A>~Ia$e6lt0^_+4LkjV&S=&P?p4|!?L_XpUARVbtAK%gOD z^YMp?CkK-MG7-3gQuu_VX)rKda?f(NmnKUJ7I_hOjW1yO1>1;bdjhR0jLlLVv^TU< zs4(+&dc<+}M~XCDOivlFW;YCgXqwhB`moNGkB;_{`dl#N4lKNAf}ZtG$@@>-CfIf^ z6!*QLQ#0{)V2DH>gvtO{UMNAlg$!#C_DqWzcHyUPGFf=iPX$`|VFhJd-LE#N*}j<( zhx8BrVRFq2O5n>J=lxdihQK28)_j527JxB9bM($?6HC5HTFApdLoJ3#R*jNyjTNW( zhq%{CAuciSDtNDa)@^}J(QE%jdq6+%r!F(C?&&DJZZAiumdD4}7!b9{P==6aKhoG# z#bQ&?VzlOOw3$fM&nemnm6!wLe$a+;>iH`3pYnQNwatPYfLzlj6f!qnRsA#>tiv9x@gu`@l7eCC%}WZC#Avf_<&IT z6B><(ymZq;XP>;1pNS(KC0^+t%yF3318Y`jLLO+kq3L9H%wA_4bhSPaqs^KV7(V2L zJ}Bn5HiJbn!yjuWuX$~Cbz1=5z+CwgsUK7I2Khv9l%QkJ)3`&B=S9n0UE`l-*vqfR zDgz`Uz&=ZJw|DpH7LlkL$p$qNSxs^#6^!Y5SGou$64kBFc)UVr8nf z?kPOX=}5!dU7O7cSM{@;ssxUpQjK@u3o<7X!5q|{`?*;p$z@z40UJGQ^iCw&$nZB($%)$Fr?+{moVrL*B zfrwBges!i!@GLI)9!k=Y`l2L_Y_Ig43r#vMcfQx%D5o+-72iPFrA0!rpNiRHh1DsLLAv zPl50kwAa62znjYtLdW#;fmn;Q0vuB%%JCh5aXuO(#$>rGMe=c3CgRly5C4?=<7qsQ zqd?fY_B~lV!I7W7HRT)I(;A$`tcY;j(nt*{CH2^|C?3=m4FIymqOc#<6wKhjuAP)Q zV?Q>o#AI$l24uA87T(rd4|H*+dG8aHNzw7tN5YBRFaQq;>^S7S+wG>RdR651!1|{3`DJ_+#^lU7xm^xs_`ls5|+wwlm>^#Vp?$E*3!VIP|~7 z_sQ`T!!v$jI;lI88!t!q$tAC5MmqL}`xW|;;*}MfB3tzVO--k}_gg)l`GwrKujo8l zrfakJQ)xhf;9s$|+DD(ahr#}fN{c_w#&&DWbcnRGPLk4@bFcipbeHANladEt6=*%QIMPbkmbpR_b}00^tzxq@W9#Ek7T`_lM}H)I&pK1 znEseEHFucjX|>XyFV7^Ofk`;m0P0pwYA=cmm~m(?q6-}`kic@5y)ibV-u}GXri0lf z>nqvxq<2!c5R>_`8yd{xsowRdLYO-*FX_;`w)5mEwT5RgPolnpmPzPeW7ERsEy2~ zAO+ECBeZ^3wx@5`0)K$F6idF^cDE!aVz?s`ZYx93Y5&X#q~Yf2;|UFhlhne3BlafSfRJ{_ww&Y$;8U;OwXlBWtN3&|= zMNQp@zELM&B=)vwMj!{v0)KvIY#=fc5s4F{b=hYrMuD_SW=n#1D4NiUOh@t&ORfXr zo5Kr-tZ!6#U*~{%hPrl9G0@DwMDVQ&ah2nWn_K*Iv!Y1wUsUcRA~HQJ@CN?RC1h^W zR1;T7&mEf>$;upEe@~C2EIdq#$PH@Jb1P1YonafEKO@&EC;4X18AZ`;UJ`K46Fr-d zT1ZAJq@2X~78%S(XV~CnX)rDV-_nl*tD@hMc<#rf#H0KgJ$6oS|Kjn+q+m&fM~Sk{QuoM>9SLT(q$iUSTL(HSa>K!` zj@B^UR45H~B&0;e(&t|f#3rDMPfiY#Bqx)8*a;GIfSOH(4#e~2`8TQtF@L3~i1A3_ z<#X}vlA<3OTRm9v%YcYA<`D&I@2r=EK5lEBu(h%D^}DfL=(WL)WNDm8McqrQk2}U_ zSz$ND5m(_1ae|euwE|yXu11XkWje|SeDI2%v`-DJOu*V?#I$)(y(6%Lba$p08!p4< zcSX>gGPVe%t#?z~YnLeH#yb+zsM{Z&-C4z5cPWY_ZPW))RbL2m%+(qQ7{hAg%I}IM ztl5-7h-jv>MYNe=tjKT<10YqoYL}T;`AYvhA#kqhBoNSiao=8;0gj)-HsG#nUk%!V$%z_XXq_f~cR+upxEmYTAcSM;{ipXQ;e3az;GkPq(4E;@{87CBk`3 zaDpd0zJ1fhmBK}d{D|m%XV_H7U2kfG`7+)41y_h_iCLY9^z}cBL0~Ft(8}#_A z)b3STPk2{dXUdA~iS0r^+X!AC)=NpdGXH*pNQLK9oj(fdtBLFu+9WfqaWWNX!8P*M zVe^c02-tt{_Y_&w$<+mWpB_0DSHh@RXmqnwnrV4q+I8@zjYr0XSPTa zm=w`b%r7$4r@=CI33&pChdIMH#y2H1q)~rwbU4|&b_KF6DDJ$y>xuHRwCRg!b= zYSnD-I~Ama#Y!5W2Md(67Sdbf3qJELt4MsITJTN@r3=|bh)DX${B4r7z^E6zF5WSi zbB5%w9CFM_%)$tBcZ;bs!ravK5!`(huZ=hg7Rn-++gELGJFh4U++^pUkh3XaBMq#b z1vA9%sg(hJM>sgU?_Rb*vq-@8>l0V~-#P+QBZ{iOjNG4b1q^&C00Bd|0G{%DGOQvT z`z0h0+rI9=tJ{N(t4S_^eS&Mh9D_artF!MLMw#}lnE)9C+tQH*i;qMC`-Pc)+}_1* z4t=njU#gL(}@ z9%HMCiX==_yh3NkVE$@ePAWnioB>*$@6_TSM>h{731vQPqD9DJ45K1CNrcf&&~m8FA)`wUPpi5ic7F;5qDMkD zG^--3`ueacuY__>n})_HQI40?GOmxCWv%8U45zC|+zvAc#F4j?(ydepK53D-IPTw- za=BfZ?Z1#6(TdOh$Xq-plKw?~-L}dXZzd_@@Wtc<1#ABPTKM)JmO;S^k(W(y9G;YD zuBcS6qFs?$gs~Ffa6SMzW?s%KeYa=)0L$gO?}{?Z3KQR#OZ^DVM|eY!M{UX3M~X|f z$C)l~m*RQrrJ^|K$8X%TgLoF_ZY$|FIGd|KrVn2ehVfLbyek;qO0nEV8-EXqE)HZA zcweKezQl?z^_hfVayrvmNI5V=uHLViI)aV&vDhzqnd73PCEu(GrSa`0*5_C{fB=vG zW{;m>W=qs=f{8DBYSv%!1Q)odJ%VGMUI&SYiyB4X4FlL2)mZ48wjH2BXX6zF$mzk0 z|GW&A=-?wXoOJo^W9ShZenf=V2;Uvvcgg%Z50IIhzFz# zdDyB3W^cf)fccS;&1b=7y`EN3Y&;5MACLRX7944fXx}dbcf*2*>n}^0fPp!B`1R{R zV!UTRayvU)&5=|nZ0f#G1|+Wk6q7BQhf3{uLc4n6??3V-y@ z33!{C{LCaO7#NIs(8Dnh=g7TmMlsvp(%!rxMcJVSL=&t{c0oZ`0QW)SeA{NBDk2|o z^?_(geb^1vsLKiV7Z?I)F^}5MJa9GogNqU^At>3lQ+{r;wYO8Fh64#pXxdR!2Io?u zPh>Q`ynS9tF%5+mj}!zXnVtVYw}=RpQT#3JFpoCs0E=Z)Rve$dOU#JQbQW25{+jMoGXEypn$ zzP9jvZOv2X3YLL=TULQhH9PX@;(h3ir_}IVP95Tv(FF)E%Zr7(?g7lt^k}AH)2B>A zkGX5M0-ueGtEbYe31y#T;mBVK2VaQuHO6C7ZWG(OtU1RdErJ|I>ah-Xz!CEM$s7wn zBjr~!sV)BsWS7%aN8mCwQt7#^Q@$K9CA9)(;CeJ!*u@Ms6G-Hp2uqIsq}$J8(bmEJ&_r_z zYpwmXko(vv^HPaKlXyBvh>6h3>tJWKwUF;l$(C|a$2vs7+q!C5bh`l?lwkAu^0ns! z<{|)jx)w z;}6DsKH~Al-!IFX@bjLui7;Mm9T0>#Wc2Zw zf{1|E*k9p7;E2(=85HmM$`a&h91>SeV-tDi!`u1?nUbojH3NU`{;p{}tuW$|3ang! zyD02_)=iCrFTI`awH(O&{aDE6+B=|D;~95O;G)oMCn_J3&#QAvhJ=10OLs2)=BsH$2}OpMlhsA5I+i};k@09F+G$o2I2g&ItM+9t8L zRR}vhDS;Xd((5WR)mnds)*Eef=1P-~4Zl{*hUTcYz2oL*$`cGrr%wk}=`v|gak`MB zeuMb!n;8@G5KmdQm!Ecvs;v&vfGjxygCEKN7pDThy6fr9Uoc&i*GHl)Ag z1d0wwq2kRH*{;&TV5UgOJL1|N$IVx(GCNsYgWGZ2W?#IkqP>du$%&1B#a2dEm(j(E zwj)t|2o>gI?9KdZjR?DYThi0{Je{GJ(o;EKD=1M8h=d1J9^%znehtFna_Ibbz;1|l z$`8Sj$Fq1u7&Es9C756-XOM|wqmtF2-W#mWf)dg9zCNI%oa5_}B1n^fH z@08z;9{D7;XY-lqmvX~-0xSm#ohQ7xHfft!uR^4=Q)T_sZAisMM5f*c-}dkZ!wJy- zK5FvzGHIVL0WVX~fVrkt7gORMaq(WZ4%i2Q$YpKrknc4i#=A~;<0`{|MY@Ae|``?^RR#=us zMPRGEzedF&uX(7`xj(!LaTRxg=MHcr!`K%$S`?ed3}9~*0$8>6mRYqj!BKPr5VZRJ zq5C5#+oTTDbX6#x{ZCGgYEUn3ff#HD!&o$w=85905pkdi5M9>G$uJ~tApYzE7K%YM z6nrUt1e8`B^(|kCR8V@_X)!`mnla3bu?k}uqWmux?~-?0Fu}M}tHI-WRyw=JoBf?- zRvbXTD~qk6GYb`iVOrAr<^JlRoe{QCjT2_k2rHw+w-jOLeAmp#Yj_6_s_YCHgV<9Y zW2S@k4o2P14qZ^2-6o7J40^dq0{s5Q8wGI5Lc3+T$%6ov8aQWWkLKX7#zJ0^zsRR? z<^9u&qr(m8Qx+LYZ>`S+(1?3di0fLI92Sq+yPOz&TNo6^xA7#e1y&PiNDH?Bj z&7Y`Yft3m|N&D)R$QR~T5~<6wBG2OmOo7A>*gM#+V9Op3Hm8!9Xyk{}96(?B2f?2K*$LZQe-` z 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 aB#Go`IQG%u@-a{Gsazc095~oZF~0+vM8u*1 literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/install/install_pop_up.png b/docs/assets/images/jsl_lib/install/install_pop_up.png new file mode 100644 index 0000000000000000000000000000000000000000..623e09fa4c4d0456694244130f6da8d35181ffe7 GIT binary patch literal 66318 zcmeFZWmr^w7e1wGw$&-L=b3t_Wo@BLf9weEG__uB6tDaoEcckSG?R%Sovm zJ9Zj*?AQsLGylL(SfwLMjvae>OkPUjiL>?`e$(^v)5F8Vmc!8dw?6w=9!q)eoY&1;PwQDO&|CkSwL5-Reyg-pcrk8s&djN$IsA3V zQo-TSd8d}y#<{t=bh{kFsX|EC9A$E_d!dyo2|%|oVFutT_NJO`bKv-RczzAxV@A~bYQ=ieh( z;j7SncLQJK1P44ym(+!$D|?6!S22hEMNR>Glz$JbEeH+{cHLaqpAdA4=)^O>esv)P4t&uw zJ$?EVe#Fkf!Exu#`h*o6>X0B9*F$s(X+1wNXL`8Z;PiaNBhD&Sk9Ds z9+nnOhDAioUMK&1*u7-tn z`fG&;4-O7?7l(ANJ*3cL6BG`2a(vg;rc%Q5Zy;vZ#R(UvHC~n={8l1+^UHHfiqn7p zUPOaNS3sRxv<>k?6bYRMRdg4rjSkdXlvO`A>F-n)yC;uL|lu^KiLZi0_ zJr5NrJ~mpjp9@FL3?3c`{AcSd1=#7~JP&sVCE}UA5C!2ki2uEnf8HXlss;XM-@Up| zLBdw+b^Pe8FYnzT_P+9;9e3|jAW`Kx?DM}LNdKtTOPAow@a~!UCJ2PX7A_L(0kp8H|P_eK`+a@Qr=iO?G5%63Y zd(SR&=IAzB?saFP*2Dc)nuQmqu=-D)Jei^u9kWX$7BOsz|3-Xs`XAvv^Q1Snc6M>^ zz5*hVmX^kN>`cEpaeAyEnR0_HD4;KxNkQ9Vdwg!ryktg<*R;d9F_O!5V=gTtqXTs! zYGXF5taNvwXysL#@C!F0A|g7Et>HYgZhHdSk|R5Me$54XHU879iFZk9?tb#Uc%QQA}$+18>exS=G&)F&*yvd z+}@v2VAn3bYyO9`q>o9j>fOb?^JkA83zRsjop(nE(398QT`t%B`L5?+bKQ36=PRZl zeyf2D>R%H7ejv{{4Y&TgqfZOy`le~sU$9Jd_z^V_jb5D?9~+y>lh+(9byrYOSYLU` zTbrUc-Ii2XSm^bNrBXl1zN>lkffw;*Bh;!BQqBCYNPLK$%&}7%`Xg+$oT#vw#u6%L2iw+Nqg>fg@-usW-HGr^+o$29xQo7Ksd*@y=eG>j`j zI+q7wh3t<9Pl}Jv^%vTiitn)yD?P|DY>Jn7bNh6=(bAW5=gt)fU7ZdIGJ>UZ*{px_ z<;%@XQUEY=7cx^_cO7skxSH>IGSKyKZNsi!4tb~DqL7h^5L|hzT zZ43P4c}h_UDGDTKJdb=*Y*REJ8wW=>it#>0tk=eTUrKhGdvBp#incb*`b?+m@-IqR ze;PrXkt!-4!-sJ~4trb6Cr*=wib@FhS&dfvxtu>X_`%nAojvR^Hbke$QIX>cd~)g0 z4jv-eS!v){k9rh2OnM*Vc~H2J8ooOkAim~Ha)Y?qj;SZq4v;0zSE|-amB(S`NeOM# zBUM#Zb@fzA3WKrQpwpx@&Ra{LGs%QK5B7E!%LcP`B~esKl0KwqP3-@KMnvSBc0O2C z`A$MB;=H{wj%|+@bKmJmQ~mYpmoLQ~m+kQgha&X>k6nwB=WtD1GDnDzClxl=4(~1V zowezm&)JrE+_b-G;ag(L8A_`A6dxxaU|EgMb^q?%MySW{-w28mcC!4Ft$VPy{rWW7 z#&*NU*w|RMXPHw^<@>(t)vN{I>shJ*n0V( zmX2S(lnw@emPc!JoQH`}G#XMuGxS zv<#b5z-plQwm#(J(`2-{E>5LizkXGSV6Rir|E%M-{0ow|TBa5RfDQ!MYSnx4d`o;A z(Zf^&7(PG(>PjxLfUR%sU6=a~}>RDk^%LsJRg)ArRIJX5S zn8Pz6K0C7-S-$h&%`j?-Kaf3v9dg$9tZi=Y!b=D9;}D_~$6VTz6>&c?0b)CHn^%~# zzB|lzdFw2*Fbcq!AxvNvEx)VMuhY)WuLeU5r+Y`+j`e zbDy%X;!@rfS$Gm{Yc+}ereZ1>16Dqd545iLHH)vifOIvhb3-WP|eM)KFcKkxK z-bmGZ9DOO&2#Idj;+1-~uO+cNGct7{IclBX1c_RN%_q1!E}^~<3ZkLZ@v|VU9NAgCujYI+g-bf#=Y%T9hYe)$(e|dkoE-G z0A=z0j_s>r3d<@=$fPvYlo?sk9~OPdyB}U7{yeXEa~4-5$89?ky>|7cht1H>l+#j9tD5z;6y)Go0^&a^5x6O z$jD`O(dLeyOv-6BR|HAWuB-CZ*7(Pa7#`}{@NHF86J`2|U5N(PB6+gtI?k3w67lqAgqm~o(_h1}6a^k4hDD%Yfatw;G! z14r2$e@MIYzWpEAlcM`fljsJo&e*Sz@1}l#erDmixe7;86(u@>AjmTL}y7Z5hZMd&O(|&$$j&JOBXUs`IG@EE5B( ztDmT;F`2m($IwLg$hFL#KChpcJMb? z*I-}rTJ%1_?7#V@{=LG&q`*<8nJh#|aLr`^I|L;%e>?@_VOqeI5xE*eS5jPYC{;UbxBRno{~En$IjbV)zD~8)~W10*~X{SlO&phoBr5YS4j{JHrrS$KsR8x$wWU=0kj;*xYrWh4D>_nIX#CKxn+ccerLfp3 zDvySHw;8P#YzjvpzhG94AmoFHAI{a#dGekXm7ng-n+1fq&OLIK-#jvt%uZ6%E?eCQ zI|N}LnWDcw4Ry8)rTP3!w!YKX)KpHbmI0`q;$?0u#QZ!u``7jh@Y@0`EL}^ym|2^^u*Feis1i^%aqw&BZKYSni>}AXI5E z^>M;lnsTI**O{7660hwOvM(~oq*jZGS|PLTeyLUTeTrcUD+Y`vy3ga8^fX;9f*sYS z@ZneX>-Q|m@wF*`tPNb$G8)tQ4a-xM;!HbIgEAj>0`yw@hr21zR)}>Tu+kbiEo`DT zQJEWXzbSfIr8{5Ql}IdFItY*hkY&4jeghP-`|mW%@x)a;-tabbfCD<<0ci9%#b*pI|9r- z%-(bZ$%M_}w9wz$;JebLX*K;IU}a_HO^?*|S}({w!>c%R6aUNmm>+40!J@;R{TBkGsi1PpN8+QSw!*}`D+KL z>qj)SvZ(r&7KA?SSpKyPxF7iOLoID|D^j1JCn~-^G~hP227!k z)z{aPO#0}!uZNi~)`&+E4VJj(|E!E{sVCm#ca&bVoj^E4E2WyE)EU6s(sJD=Q@h0U zAgYi-Shxtz4GX!mR7o}oiOgef3oz=e%y*J&ytj03uWj^M&2p3VxV(M)cBfS?Pn0-Z zQNP&|d*9BRf|4>KB0`vHg=~B9nU4F@{8d=3w;x@DeCrt{>kI9tRZ{%6y9cqZQjTds zMAZE_2L&fe*3k&IfdZS#$xRtZ-rA*Z+fY*+C@CTrXTz?1U@-70c3%EMzF6-$KBy3m z;A%n4EmSV+I}UNT+z-THbdbntWPyCe^-;(#IOfFM+z#u8nvCCEmH^Hma@_zsxBre1 z&9@p1=M!i_h}cg(DoK=szObE-RyFxyPpNy62k(a@gu3?VyNe8K6(VECBcu)RNaez* z+k=Q0LTbI*^$SFm0Qfn~UXT>)Oi`x8_xgBp600=|xCP`(e2K~#f>P3W9#8DRvfWgIaLy-xw z_w(8AJ0okDGX%`LRj_`%>{GY>^==m~+6hsu0WU)H6U{l@lg-l@C;W_3-~Yz=-c&+B zzajKXJ0<}TILZ;%klEz|)w+yqZVrxyel&tA9M!3)B1gh~e%F&-qx7L#o@!0tx9FWp za#>phig$k(he*uGXtc(=RIq;I5w-?~JcdI|)NL!8 zjU;B%IYT4w0p**>EGwMjd^EdUm7AgFCieMan3JvT0WkQe!?kJHrhqVKSwDPBOq6=& zVvff>rIa#-W;Ltq;A?}(*YxzsrkIq5n|a2q_r>1h+VtRxaMcL_L>J0tJJUCz)!$od zR|fFu0$3S|?15-1gBIPYY+r3XN(p*7IFSYiy~^XqL7B^hUT53G1~yt7Ur^$!%(D#* z4GI=7D8xxvC%uS>`wh82)|yUH=w26gxZ%GESul^~pNyuE5yX)(v2OtW^jTlzOs~XA)!U|1V2znm4 z;VVWVhcEGO+$8ol0tE-U6+dbL{x@^eoOG0Kkk~_(9f2rfQHqsAi>9ZiYvx;iE84j0 zu~(4!{$@ffJ8_7`*5KA-+v?MqC9az@FUZhI-j%Ni8_WBwC#*K*YQwLT_m%+@lRxix z8dEWg3eYGvR_1m4(0N3z3)Fqghpxr^b^cWCHRBT+9F@ zHY0Kmt_#`AZH~9*7%8JJ_za($g=L%W(xsv+7#oi{t+JZMOXJ;_|AEl1dR^Flb8X|+ zp*Y7D(mUdr=2Yo=}>Wn9>Z>S=((G|ZDbOH*9J9j$yXtD8U%gC&sJbOlM`Nm;+L>d)% z);myd553Ki2L$AiVPrztjfKJJS>MMSOgwM%~`DkZRT8)H|foth6SBEl--1u zuN~#=w$WpRqxUBS=?G`#Ne=!~>~gA39>gOVKuU+*n_0n949>M zs0)l6bjMGblrgUn1#qn_uuPP?F zM`UyPi?px31kD6T61!HxC*u3Cbt(_Pt*S8VbpS)K=9N%84BX{)96_36{Yw?31%-S8 zggI;XDVspNc-`{u8>*#B!>qb>+eH!qTzcGHrCZv7E>066QPmgvVKta(c8P1Sq4@$k z%f}}KMiTz(Lp*I%9>JjlEYIhK?$NiD+JU;V5z{*0sKlF4jqLJa|*uZX}VwO34p z#%e11?wB$WYVM+yUhma{OU*C$x^+CKuaT|J-#b58QM%TqfXnl-PbVG;8U2(==If-z zL)MKfoqV8F1O39`dY0!jkt{0$u?NWBo(rCWiu4horJ4h}w># zY0i*Ycjk2T-A2lA$LTg{sB;1)YI|Fi&w;GPQ3g29_fC6p+9d`9CAc^siVArrs3pfk z?6Ec#gpM9^S)Yj$bybV_b+agzed8(+AsnSmQ9QEUK1{{2oP6G)JcbmAQ)ILmF)mU% zwel3P|E!)A3y&4Fli@Geb_}gE?ZJ*iWmpfcXpH!6_%@TVlP-9Rq%7o5j!}TN<2%1s zvnF4t?_?6{uQLgqm=>jTt!pCj{V`R;f@t*&_3!tsvbIi<(xlE-j=XK17#3pl&`qwT z;3QM@haA-4#z0Wo89`|VwKqkk8NFumNL@+EAG1wkFiO23trz)*D_XE1!xd=_RNB7I z34>DCHpu*`5L2t>UFpxVzJ7hs&4_(o{ty0fqO-U%zwB*jCcBBmA}inW<~(0LN8F?5 zphz=ec8rH9Pk{FZEIS9WnA3umqvH?D>s<-5WPAy?kk(l96vMM9sD~SekTvV?CO>0G z184+SL3hKMo?>*4r9};)DZxrMj@~mp(XBfA<_fZ!ZoC#FV?_rln)?>L zZCgx&12tdUtrxa_F=7jrWx=8c`>QV!ahH|Hu<@OfYo?KM*BD?(ZWnM&lxAl?%1XCV z$t)s8V)fr!n%0D}s=~#alW37vemoDf12D}v`l>xmn##B}rFfAv&AuB&uVBs51r%lb z8*qEEZ**?gno=*ggBjzceF4{XBq#TK#9boIALgwrlCr?G10qje_>R&uWwHGA=?UUL22OeT_ON>Y=N3Jfn-wsJv%Z*o#MXMZ4y;*HI8nnWE={&r zXC)d!5NO3gK5uQ#Kz7 zGFv^@IEZ~I&H5b=l0uradNK?|6fKCFQ+8f%^vX?IQ$BZkV)Nq}kS7Lqr&obkpuSm>kjPmRplS5yAG>Rfl`G(*so1JMv=epe-h4)`bzA^=|h}m zP`+5Yo4IgH1-m(ibKm^|Hmw3)V_8Td2ZsJAn4Lil*P8=4^Ts|A#>g!9{8^3v%u5_ z#D=}%O~NLiG~1Z#Nub2=OV*n-dtsQP6ISQ*2OTx}&AJ|nU*Fi%FNfW-y}kWSGk>8o zz5C5sa{W*s678*%Pbv8npXfDh; zF&r;lJg`HcZB8fCrZrKV)s9 zLYk;R6yR{ZkK&Bz9W-mP@CaQq#7wMBMM-;W?Olz7d3oOF6#U-$M!OoFM3@*1G2DN44 zE{A}CKwihE+e0O;CQA6S(hc zvHV&(FZKG=`I%~mO}O^s;Q9mmQOL+-J}!z6x{s1ej~j33snn%y%W$p{Q(e=~D48!RmWx*nnlM=wXhnu0;7*Jft2 ziEb?5*(`twO2nLDAU>!8R@7i7&@}SKvxhPKih0Ugk|zbH(t{hZT-NCMff7xpnc@9| zI?j05VpY`6sEJmU%aoL}(I2_9?x|Edr~o!9z2(nQx^+JvTIH8SmJekqK0drjyrJAY zbAI#j_e5wd&$c`Pj#~jWadEL)jH_g4CLK30x?Shh6!U~2Xmm4jgDi#j_0bi(KppfT zxq@gl@#YA~Km>i>p!EE8p(mSDLA{E5@l=xa(>%nb_S3<`K1;ydT)A=upk1f(n;;@_ zJ=>23F6*W?Hp^{E3ZQlj!UicWE(X;NM3I@~I-cTIPQeH@>F=4~ad{p>jV<}#R(?ct)NALNhCyk4c%Hydr8*oz>}*d^X4+VE zTcj!mF(3mz?RMrh|MT1Es*zY;vr9a7NXKJaTEH*YqK_Y?_XL{v0vkQNZw2gOJ~ zIVOhT3PAl$?I-iiy4l~Fc$G{v$E6Fe8^e0BpSg5&ixllC%H6*RMJ*aQHxJ&Ah^-#j zULRuiW+*RU9p^PrA;mzDPkV?CxGsuzYKytx9w+Lb{;uD1wcv6k<0&BZ9C~8`iiuC& zsL7~h*8^1PlexzEaeyi)Xqb?(@-7}_tPLyZsCO6}C6ziHURjOS1a#xkQaVdXb5K;e zrEox6Wxi(`=8K2O(|Y_^*Z-HS-?b#OkC!}xvh`|6QRIdUD)Qo5&OlOtNz)-o7L>@H z{3pG6W)TYlZLk9NiqEgAC>}SqYH;u<}-e`2!mpj+7SF0 zg|a9p;A3lczkJ?K-j^WTczuKzWc3!z1M@|!JSPQ*b_RwxFe?9&nktvSVf_1(1YBz7`<6ZF`<9jqpxxRZE!w`dE`g&(sK|H-+@VHp zQnNBV)6#e$C%A7^u1tFHuxi*dC<+tMU2up8(a7xB+*z-?jheeX z`sIW~`Hf*aU{yb73=9%30R)4>H8R*}(ZgPIfjH(iNJZ|=4}$}@!;vebJ9RnGjtD!< ztW^+mtj+g1b)-IqhE+4yxE09IJm}`gS(N&V(W;dCUN^?q%2q|rqrC3W>Ehp#!Ll|2 zDqQ<2E5F?r1fLt@^b)+!kpf=Awqx%subB|I6K3cEf56G^52V5Q2&Mq+W~Tc07qea8 zK#&bRz5$m9K(PAfl_pNVj~PFqKIxB6vD^oH%YMr!!jri!HMMAI2_3W!K(7;2N@zLB zXzpgGrW!+|2;6E zsbnAJ16w-IdKd^f?naHkD?1A}47tOi6=V3PiKIX~i-UeS-t0wPFcXfR9Lk^ya!HkL zHNQ%VVz05byu%aaAL+9WQ7zBZEx z{2-1y1Ej2#XKymkLjIEGd3d`2>r=MM&x~oKwe3=>f?$H#D&+km(*1_!or8p&P^CjX zSesm_nTkUQme#hv8^Tl_f^Y-6&kT|ggU{lKq+4Y}Jyu}AS+cuknk0E^i#VPKI9s;(4xTC{2yT9 zL7;#!r_i;9CFb&|5Jo|2s~&99LT{xA#|-otX~Zw4`|=l|4f6ngGe*FwK58E51|9VH z6|2{fCw}cpf4d5RQ`?%c$JbtwQPAuTJG0k<;2@C*_3Vw)M$W~wL>l(u%>h@OLn1)G48=~+*wH`4vg_+6B3*mMnDW~y6ib2Xq@Wm0l zYf(H#r630pQ?iGayy(p}VUYP4=+P*UusQ?8cBAOvvJM?3qTwg)Y66QVb)*rEWmiVj zu)+iC6VD#P4s0!93C3U!x0dzrk8iGYP5Ixfdt|q@q>G{u3eC_d8`v9-0abkln;q&i zYk%asK6(6aF{-q-2)Zg@8OttLM^Ko%X<_$w5z&GXe`58a_%%LLMwSh44-!gtK~qyx zg5cWlWo@p<4n&e1SRr9YbI|(;#dPPa9K{|lFJ+E71&SgG3MG7AJQzO!8H|q;q^*gw zpHN`;c&n{{84_Xr@cjyEl4J($f~B!K@>QeXtvCm>o-}YCWCOZ^C_{i}ZFr6byUP^& zK-d6ijJF7N=q_ZO^kEl&L>1cpnzTZ2GXYxkzFR^YbZKDoA>>*TYW|0(LZA}_rq>A^ zW}rqr*wPqNO{SdCg*ap#{+&!}$Ao6B5M)p0*Dc`KFreQ7Hh26T2>7S* zw}R2`DzusHM}G1PC;xioKEJUWB19LCndxlSZjsCS*UaTeehbheg6&itBqPn56Rw|4 zk$T7Px?$caZ;gF!1A_8l_Y~7Fw}VCOQ3UNVAhQbqOQC~DF7q1yrq}fkCzY&^(x7ky z6AM(O>CzDfVvh|{Ix%yTf_Em6pxXxM|w74KiG z{04z$o97`%9mDvr(Dfq=ro_D?Kub>W4y_3W$^x~*47!`6G zEeVuvYDCauSe875Izd+2yh4Xu5+C{b>V%jlMIdRLnStc!!dn_QyZ z0_tITD>kF&Moq!g`}cdA#m?UsxXu$CLtC=X2s{612Egm*f4Ww~vx}ANDMdKu^TZU0 z-^5GK!*3}Yjj~yFf;Ye{BIdmGbGpjfC|fB`NSd9~yT1N`-IwckwqVaax?oc9LWs4e zrw8^EZ&{f3-^2*oo5!`@O7a6sJi+4h5Y=q;TuxB6*$c#*{Y4-B^25vMBo9MA`6!w& z;CYiHOrJb{%w^hf3;+0mHyPc*U@BEx0>Hfyuo$d*&hdDr&(uKod7gZBm&K=p;4~XZ zNEFdZc}czd>H`|DD<#>B|{^a$QPuIx-Slt@-sl}U~l+C12|Q?#EvN$h(&J~`>Cd2Md6Z18X{GmnYb z5pupUSWR&Zba1P=9{W4c-cQkze?QtJTm5+|qdZ!vnVADWEHnvniTh1ZF#_)!v457T8Pw&keu&kCb~J)J%O+ z-hIZLIt^fOv_Ja9I;yFu%|zb<8V9Htz`*Lo3O~U!I?)(KzPgf1&^o(l4|1$}g7kN< zF5u#0V)~$`NBY@KHmCK{8UavjZ5}6geuUJLEX+HRcA4j?b3e>&dD3Z zj)0p9%`5=IqweyS3djOUJ-}k_EtXK}$_cjDdHn)|wSB<%K%&z=BtIZ$xXymdKSxZw z?)y>M5f9;)rI9z&B7WE*nhdutY}S<#)I_~_bvV!n%3~PRvGDNl8TLznZK!GodAuwA z%m|>CTNH+oAm%2)htc@i8d#XQ8Q4unj5g)_{|fW|NPie4lA_Scht6&a{Cn^?2wqa) z=?}n~T({i^t(R&uQ^->!5)E|&P@7BV*Qa3Y3poVN$OH;MxCNedGjyxiRv@yH3JRPd zbFa*ZfiE1c+6{DW!Z;Z)GHwSaubKd~5(djRz=!S(B*X6ZhbwGj;AYVCncL&WPIvtj zf8bwC$)OE;ec;>|2n{F|<3=~YS)kM7H=YK&Z?#NpVoY%m#8`c#_}UUR4fS{xn$Smh?*283&hKv`HADA@%UoGqg38$i34V21tQIMT6W z{~NXfm=EFbzhSGR=kUK_tE0zo?EiJx3S&3hoz-#zh4LEXU|afL@nc1zIcozjfV&V@g#ri_5A z)BKQ2z}NSaCCoxA)jHqy{Oa#oug7fg_aIw>_kHd!IUVW_eEI@9NF6NXmXE2gehI+^ ziJjaiz9xTzSj`kg;Wp7owHY#%3cNoBGF#k1kJp>-m8jv-e6@({Ul46TaQC@tGeV_| z7eRlaCW^ly#CqpW+(m->a#8gaa00~0Z7A3?Ecd~0G*)_UpT;y`dv#LSY6RMkH9Ln^ zFzLrBkAoij4MUvffLtQ@Z9W@5zWay(<`BE)CXQ-F^8iPAr!F6$ue$;n@ z%9;Xc`}yD2N69bt40!O23=9CCOq*(I2iZ3?T*ED#&>NSQ!)$ES~ zwV=)|b71XJS)6fz=smj#6?qU_+S1=-GC1 zblf25KeNvXmsa7rSTdO*g5;bD2JfVhuwz`E*Y5i4WQMhb#H;_e6aFlr$OC@|)Uu4s zOdwD5R%^kSnxT0*=7vz(6_?G0`J=OuP=ym%zw0reCwd?EJDRJ#H~)7uS9R#%Pfrsa zo|R#*Ut$5OttI0!3_lB##e)b3hzCq1O)V`g5R;u>JK3^|v9{y&z(&cc9R>jZmLEcR zC}achFZhb4yR&q_e3Tdh9oXhn>nNP33><#?>xbM@EC-8Po`lJuhVb*iFagO1MK~hj zHxLLg@3RYT4nT!n-x6rVJ={Quz&&uM?u}}n$KY(37hp`5<8j)L>drd zbZ$$p%(?JF;n0-VdxxzDo$mt&@pe@mH8>SGO4hqHC)}$)0dc<|^KN4QDh`>wSBXx< zVr}8U!9&1(q{W^P0CO&A#*WkAh-v-CE$8{VigEYhnD1{GW1~c^uBFW#!%o&l(hJAT z4Pem#W?3Y^h-~#)l}&fidLM7{q==nsNm7~ z=@D(r>$renooK-M|6ywg$cCLi0k*l`l?GVeGf?8{KzT#ypId~fylowma14eHxi3C;c?x_a{#3`Wej&Hp8A?q}jRdWG zZSltwoYSHQ!LdWZOr1mEN0|vU-Gc`Yp6G%b6sXKR^PaZ$S6zT%VajD1dttk{pou_Z zqoo{QI$KGpeYsHI=+{XQG`0sJ=b&Bvo4pQ!1_AyC-FM5@v;>H)r%5n*)ZU~U22>a{ z3lFG!Ug1x}<0~F-p(myV>S*-|pzLu^Utix6O!5>$UF^)t*SHK8+8#^Gl`G$JbJqw0 zIjwf19#Nv?AKL|2JibDH{Hjy8o(LRm5k#-o}oT@7IR z#yd_z42A|7sU{6pAH)EIUO<*?UGrq|nJkuRoZ~_zXD7@>KtnUdF49Ibz864i8|y$j z*O3;ow+Oj*)Ixvza#2kN44lI7rd<9RD(F}n1uEPcAJ{F)r}QgRAOadB2HT@R_!AZM z_~mQUDHHBq>DnSM{UfJ%7v~#jugwgy?x+9TQUK&>ldTeCFL+c-GHaT6$p<7BKzp}t zkpc2)vyKH*aL8u#+16v^K&1bM(GXWlK0aLv(uhB;=*)TjaaO@m+r#c*ZSDz!cS?=Z zmF>UtawWYR??A_14lAmAKKLms^$Pc4tExXP@VuAsA_FI^ptKi`# zdkIiKl@$~S^`RfU&~kNjG{%eeSp;6`?X{)2y_mfB%%C4;5<1pD+bQLj6Y}%o;9{v8 zS`YxoN78zjqD^*Pmi_U%y%M}69^f&q)pj_l`aKcF=M%NGpFtoP{3;Gmuv*T11S6eU z0#res4b%DdD(dP}V(dkMyPq#K8+^<(3M5jF7wJJi=z6dre`Piu0Rs)DpfnGh!g@N+ zb}4Fy&N&a%0Be1*$jV;$EjKT6{PSKg6@A5+klVbU2f?i{VjS(nZ2l}_j zwIZDx4OGrho`LK$C#>iX>aa7Za$nE_BhTe{65$I^>e|ox>L_&MOms2VImq|V_^L#J^IRl znlcwnP8*F|8$vmfXt6g>VSl(a6D2%3|L9eLIVQ5(%vHeFz#wUt8ZoJyFclW+bVEo@ zY4yJ|Pd%{zcqz%GvmpK3(keTj7F-Pb1)HJqY!J^=LAK1))WB1)6oSw#Z;o6O>0aR+93cC4mU62M$aATHK!>`eago~nu!6IrjK`vT<-<~N(O;>SaG zHwQhPJm;dWXdFT%Mw_L7{W{j)XR!p1#oAun}^4Q%O$8m>*2ypZIr8STR?X% z48&il53n38ofp&8&=3NpzsCXg%A&i&3f1!3G6MVD%54cK3xl`pqHMQsYrseW3;s0b}Aa5 zn0SDRH`OUdY8JC~_anC8)DD+IfUE)i_0PWIK4eo6EG9M>UYs(Wwz`11)J%z>GqRe1 zYV{k?P80seN&pme7rRPeBgH^A$C92*V=&}^ryU7m~4B!8Wid`=hoc`HdFkq zDln|8szl1_2}FeA2YRT+%3vVa#>pETjkWYc8-Z8Mi~{-A4jxE)4}$Pq#1OVd|Jqv3 zIATL-<#_>4kajV3mPTr<{SL>2>RU!OD*|;O9rjb_8op&$=q}MW4qX*@d596io3Q%i z2-;2Pzb)N#ki9LqQ8&B7{2AT?Q$k+f0z;+yA@}@WbDQHV65Z_?P45~e32r4KEt|c@ z11CLvZg>(k!3@K$PvFPfSc&4(`{4g@{d(x*#2_rG3e*w2Zh+e9{*}p3bNfH;?tF@! zXn?oPoVhHJ%s?!|97Mz--7M5^N8)fmAJZC_TkdvR(28;R4@|CFUapTTi8zg;d{%`GM3*%x05!^TM3Y*$p3+#PC|IIXDw>OJkP4U^l z{BC&(f@@-Z%TV5+yjdHFcF3N$@wIk6dTLW2l-A96sH@7}AhQJ+LL$glcQ2uT7g=#= z7pwDek{C}Q?lvXCKu@=Of0UerjgKnTl{i*<5PCZ)S^UYwwtkxQWFUE*_!<+w_fo+$ z_I%{5xNgPC{E(@*&jkg4+||6JBR`kf@h&sRv+9=*Y~Es9V+)7*+*z5=Cd$Qw($X#0 zF+oR}&3n4=2DD#9#9Y@`xi=d{j1i3M!uz0 zjmt1!xtZ~>d8Pyzws|uTV!`>tO$7AS78^|hgQ-S`G1?S+1fZ@gU3QOSQRLEX`z6D2 zW!ec}yzGJcmZ&C$TD6l*L%4Kw~tQdv`R^faQPF*6J*5^xCrk{wOWl+%6xkqi zuvw_W;EQQ~UJ?pv9qXBDGIR#%vu$4aQ&Vy5G^5)BGTXfDlxI{_)T`G_VOks4MnG#* zN5?jtZ(<_$uTS5c?QTKRt|^f0YzRy~Ionv_R&6gi;nKfY-Sz9jjL|DW(N@UQ8EUIB zG=pxdew{Oc`+Q}Y7b*P^cRQZUjer)?!CiPZM)7fB!*;LTCMR1C7VD+WXp7-x=?qe( zTBFP*Orm!ovCLtSnI*<}m22Wk*GY#$0j}mit0naIzk%S!Q)Xg4tK^6t2o?Vvj z$;WXscexYd)rV9_ii}Eg@=KSzNX1kpSaZatG?3W}p9uZL9b&g;&AW|NEK^b;q;?`! z&r?lXqh!V(@I+uB%REy-B2D;_gx7t9*|Z1~lkSDRH#Ii?z5J1#Y|FN`PpaFb)S&TX z{k|gQ`wheL&!?n!_M%EjJ>ZRI**%xTPFxb(L~Ox}MY`5o;)J^`Ex&CF0;Gig{@T6WR* zMaybNuWdT6gfLlGrNg9qR;ij+6*9XxwP9b!W6UJU;q`}lR5RrUzOozFb}m_QBD8&i ziWgtv`pgVe))#r+J5g7Ln^-Cq#JUlGMD9w^S$!I7Ym<)}H_i3Xj+{NahYy=3GzazK zeuGNVr7^IJuWF$dTQU&N$3pIL+ds2+ORRXbdCP8CD*iKTD`{8fm9R21v86hje#th(iG65oZ4LA)QuV;b;(x_4e!AD+z|{GHE!%8u7yC{Pz(x)HKXlg&@|jDD4-ZXcQ~#jJs? zEoZx8yC(~_rP+(LrCnj{l|FH2@6o{cbP;|pbU2Dk&rWCQEp_lEyK3a#7oT&%kWw?{`cjGkvX?DNx=ncD0X$HsT zyO(EM&R~ZQ_a?=0{o`+L+cBTC`)bT{)Ih>&z+l6-SkTh(G^co$&+eQzz=)@{_V~pa z^%U`N9OKd9_rd3(KREnB^{+O2q4+zs%3|G%1YfT9rxd)boDz{}Xaz6@0*#EQrSUTg zglx5?nPORoj=H)rdqCImvmve&b0W))!?YH=8p`o{CCmTW6Z_Eo?{ww7KorKujqeEG z7d&HAUM&q%Ex*%pt5b3Pe(u%30)v8d`H=TfBoj=NwC_Ix)eF1TT5j91|gT3fYhtN4q$KR&s)_EEzmkImeGj<3(aVC4W#fd-C zmPe_2s&5Lc(!=KOGRG3!B^oCCS$q|EKs@iDzAnLA3&CK}n}}ft2G>MD{HcykR?7>5 z0EwS7lDPzq#rzn}J^()ynjwtF6#X#nV2Az$?w6Sd8Mm5_vRC6|>vYJ1u#CU=TsL$< z&`@Hr*v5;=;Zug?JACs6OWypmsY?Z2${sv9Lom2kGo@PuFF;h2i6knj@|-ACQdGQS z?(2aP$aHv_6rxk}*5(619;oC8N*S=iAB&>`vP< zp*x#phu_w_$aGfeiw<=A!$7!>~kq{Sb&|4`B}HrKxMq6rkRi*DwU-+ zDyT~Qa9g>kkk5`=EnPil2;T1q&)wVm6zcucxuZ-pQ9#{uJ%`oJHYrN4wD&R|u|=5i zA0HN}YuXz_6P!7ghUE*Rz6p^;ljGw(7RpgA=gc^^Q?q8d0yJY%)FehZXEBB?zYBbu;MMF2$u-w8! zegk$Q?$T^}4SVZ*g&j^PuNGLtY7#KQcLU3n$@YHL(-zv*NH7e*3%!g)4U`a9@rXYk zdB*fU_goGYyxi=@IRvQ{b%}1D-{thwCuyBomepMJho&dXgkW8Mg>Lg9#y#`zLsb0!3)rp3k}nUOO&&m+(+*M&@E zVr@qKy8f0*N*-i3$4HE_Pmxc(SCf1yvvR!o+L`A6i@o;@s&ehN1>IXQVOD~Of+C=T zARt-52%-Wi2rP0&vXYdnm=!@layF22&WMU2Su#jcNs=W}< z0v!}qo!|E3fmEux^?wKaaQ(m}+3zKODe$;-Q2Xk_%at2MP<}fB{|aaNoFBwJO9**; zNA}X0equ`TrP2iVTaz_-ze5sa%a<(|qg-N({nvWjJaVZZ{$Se*% zPWmibvh?l6DX}2Vme;FyJawRL|K^#Ks*?7(_hFwGmDEsUuiB8A9XQCjK>88M5y^^;JT8oD55s{sqnhmCREzZ(_?@VO*f{aD|OWU73_ees zqHT}F?LJ^os*4Pld%?%@1Y|kY1Yh)+kolAjUmvK2>fXwZ*~<3ZkdX~#WkI81R%aph zsD{x{U0M0|%&2{bwEuT?8y> zs5q}SMt*pxgc_%TQg@hc)N^lqevG>53GIB{pTt=yIW)K2t_aMTgx^7QP;$WNx0 zIe)g~{{9LhcpHVKosCjW$utD9q}sCo7s-Xen@SUva{N?I=X0ko+4RUTMpB)h&Aq+5 zKCK%urL8I7)<7PsPnVQz z*-8#*uMWcm?$r~{mJr9&wfl8p1vanWDeyCE`|2=eoXlpd)^{%WV+RB`Z_1$?dyyw7nZSIGT*t@3`wavpwZNj_MAy{R4^9=Ci!uCB#w;MZ;ekI2j6c)Tla^cI&oC)85G7@$98l3;0R2$lYT4Bu zD`DI9ign)I`Kx*Y`LbWt_-;PujjgxS4zEqqvTB(oY>Nc5P!~*xTUq;0-d+<)19VQn zNMG$Ft?8$ATwUwX#LLvUaOQP#3aW$;pdQ?lE=jAAYaLUS|AFxqZMNuW zs0=M*!s;DtD9AvGl#P3_6CZ6*Ew_a2A1K2mc-)UuNF`}>pfS#`-X6i4+~!?K*8ULB zYZoO{D#5~XX3H?x@xkTczoJnF&^>>4YV_@f4I51*?@IqUQ~QbALnG#i8VE!UAFet+#xes1;rJC+^g~>E#oWKax{wUO=!C#NG+&Fb3pyn5$PpMH-dBw@Sz#1r-Ur*Gc8nV+{$ zyCzNWrKfto{|)^j&nbe?7<9?tyy4#F5Bc>PGxytUD6&+ zs&g)8wZK;68vi-=_Kp?Igvv8#$%L%eK>)N3shI&qUL=8FJ}!$5BwYgRaV3Yol2o+1 z>&}*(w-q%EN1r_tqNXLF5A|O!=U#}IB)zuuo6P7R{pFa}O)kl9Wn)qOW#Y|fmiGCT zcl1Z9g{xO)qgbxfGWt-e0S3ZTCa}y^y-aHRQcIGz#KSS5Jy!E7axcpm7X$!9mA7uSelK#r-B+aCyk*uX)WzVL1&QG=F~Ec&%k z{Tb=$WgMU8bf+$R=GLqf%Qf#j;x_Vffh@_uAhMl3L)!gbnp);>wEK^VWE@bp zKI;NM*XXYL`#Oa=fB)DaHA{Ez;v(G~xwz&G&dNW-)%|Wrh7gIw$6u-tUs<$@dq;j< z3$LaIx8&#wQCViV?GtO8bEvIU2=hCX^$~8ILMy6=uU8K^3%Zw=Xsu0};7T*M-ok#z z`{Fr{d!v4$9Ar0-+EaM|SZlj<%C&Q#xVW~>Cr@qmmPdaOQrkjeoAn1$p`^^+Ys@e} zplaOe@ZkBo#)$mxhM#@<7wD&cTR^TT_4aS}&u)d6&;^1{bw z8f~MBM}l)Fm*E15{?4Ufp)aQV5+k7EsGqTIT_WtAN^j4d{~fln81?Ga=|H5>2bEqw zybM==!m-OoD4oAr!u4vRq1`lysm2F(4_ak>2$m*QyE-=Uvwx3HO40;RR-8skfd5#A z2huRv`@#iq(hG1r(sYlrxej%nq&s5_RqAPzciA;7IqEa&WmJcw8c9#$PbJd!XYD2A z*|D*8yd2cDeP_PHKJSp~D<1FQ81xa!?)rF}h?iHs<^sL{hkElhnFoyI{^D_c|-@wE1%*vTB}N3ET4Rqp6K!s6^)A~ z?~CZwz7zZUpre^VajHjd%+2MUW(M`u=i(-FKhC)b@AB`?Zm-3jkIv6MGkUsuN#=LM z6PeyHm$lTjHd_ve1x*;FJX@q}=bk!#3x?EteR`vo93U=P21~5h$TSV`J?Bp)D#50w z3yEi3))u=npN(xIm$SDCRz|n?zAth(F~ccDK`YJli!GZiox`^GLqY%!Y1PW5@}Tc& zHRAQmLR`vRV05 zf%rZdjdS8l1c7%*q-U}b0#((dg`(rsz8-mmVzNe}ZV83>VJfIcn9_pyZBJrvy?x!}{|-B^|tS_IxR-r~(B> z%bRN-4!eWO6XbJq`3G|xe=|tiTvh@e?>J`x!{rs3sv(AasI=#@DaqhK# zvo&!4iC%?d5EdI2slgUeC|veY90{+V(-% z;&_I+|0%)B=B5rI6}k_|Z4!d+wQ~iBu~kdxo1nfiajuehGPsX=dfZxC(6*&24Zi`HE>@|@aq6<+euFfvn{yNThW9g`5gjIvb_B5u@y<9j6bxTR3!gp# z{WYu?rK6vnRV=g_Qj8G>agl3Na1skZ?V7OkMAfY7r!P1s`Zh8wi55a;41QUwlgdRI z8J}A+wcKrwbisGIJF|v6RZH{umh(dI!Bz*ur&7D`E-ru|o`g8If44ki0#WF>#liAL zS?S;*>z<~myof%zTSa@Me(AhOW1JOT^+;|1gzlGS`|@TK)ppGlE~hJ7_i++V;VTl- z_iyElkL?2io*b0x3J{)P7|xBv=u^3=CHn^cb-77mQ6E_G9hv_MGM^KV_-VLy=%)5J z@0yFbJ3>aA+zyJ*cCR*!a11AWavdLgZ9Vq+^Jj>O{5)Pxe7RU%y^@f~U*!sSylaM^ zA(eVl0lx`w8LwWw+Vgq=Ns=EYNk^7Z`{om3ml5CvyloFB1^M~0Cn3s14sjgEv9S3l zi#fVDyhe2g4Ndfu-Y$S-PdNTLc`KEJLc|ut3UdU`UVDUtgJR8ZPyf8nPec&8Azo|38oSSYIxYM36&k()a4g@ z7`(kfeS3vQerscK*_=<@0Aj=E>S|vWmZ9Bny9}lZIoRelea`@ESnx4=+1zw*tZwVG z!o=C9LQ-NpNbbVoXx^C0jJpBt@Qa{OH6zPjDAOz0K9_iVdVWEvowK$OM0$Y_g}|tw zWOo4FA3A%l4+o^KH8Br)S{)o}hsVW5m0gkGB~%!BnP_w}Si*Ft9DU}|oX;!M)KD5QCF zeR=RFDUCx4yuCQkM@wKQvw5z#N3Eq==9=@zvcjQ7Vat$#Pxt3p1D?IJYN)F_Ai>d_ zcqpjfQTL?tp?nbJh&;KXpt<22`GBWK;j+EUQKVfgn6sr{A_(pH5d`htby>m=Cfjgd{VG7T({tv|QIy<|%Cx zAh+RWTVYJCxruaaoURr>=zcqKivpO2e&tr;Haps#;GPNEsYKB$#fj9<4|3v#eIG9uMgqR_@_VJ zLc+faKYy_JKl7meDN!kZ#~cY?+@0jB#2@^F*%7+m|D%cWXFSiJ))si!#Lpi9>wkYC zp2h!uqy*6WKWWiuUj_#ULtQH*L-#4U0jrlfHDRq2pG(T27r2D`lKgcK`*K{skXOlNbG5 ztgLT=PC`BB4;l=3Nj>u^&C}lB) zq^GwGIq?*vlg1%cwkaJN92_=K`m>+U(vc(MCO+ydRwu9P>b~B+_bGSLVjY(~@eh)R z<43a@*Zh}nd%c>JtP4NFwiFnonmhA&QkDK0F*lwMAq9fPzzteXIypkZ3a9tLg7*wi##bd444G*JVfzTi80Gyw;FT|sVcZf0g?PEIR&WCXq3WCjiyLe!uL z2;%j6dF?O^f?Eqlr;Woh6ynJwo3WM2z90(`j@|G?Nb5lnPA_I}jmj#g))K`%vUo^6 zBSAvOE3&k;w6ui%n-EZJ)D9w|*FBw@H*YZ}I6u9pL~XQ(Y|>e%#bL~;W|6v-s-0?= zDhdid>_giibwv^Xfap}8i&u!%p z_0QPY*f=`oceKK}dK`&uo7iTMR9${N7aTU10~tTMuyC1h^nJ6MG!6}B#sZzD*Ty_V9qUjsTV(;B;-Aca&jHlsgZo*+c1Ssqc%~l1iK8YC zbCb(I^m^xqQ8ti*{r&yDy)iSxA01^bxeFISBJuC&B238e@C2Um@$u>N!GIgS2!@8z zKuh$w)5CEeVCctoNX+$klZ)XRfS0Yk_wTP!-_hUY2|oK*lV5WLVLU1vekz?&&|>gA zkVwglVd$s@QT_b+6PaXc5r)k4S=tE??SdLK_PyMeNM9cxA7SbeLY`87KD8S>c9keq zflC5%0=%rOC2AV-@;j{;dC9lTO+!Al={@y|@qNvOp!ue$1O)|w1)d(BpT7t^0|@^Y zf(;Wyg^x{88kfN8XbeO|XlQD}>u)jg%4lqC4B*j6v6vZ17|ZZO*ohf~gb*{Btq_~T?YR67-WYE^3B2N2wZfQIr$ zsG7-2>Dsjfl?-EebQ6HUGyR;z1Xz?nUfQ?)#Vwc?q}eFn#GW&K^JT%MEtos|18JNn zMVN2H#iUP0QeYb3Y;{FNy(_YIh5~XlzP;OsFju+`8(OD~j0_kzRhM0!lV9e#IQ(io zA`rNoneLWVWo7Fbt8<)}?A0ehjQ*S2aoN-w(gYP+A;b5CaL4%xOj&?m#=S#tC5B@| z`!jT{-bO}>Buw~)Ye(nP#qY1gEfdZdR-11Y3w-KldShDHgspd-rV?aHqd~+bpy!Lb zty?l63=2<;0**H!naQyTu}U0SQ`Ir7PkX|=UC68h8Fu4fHmv8iXd~On!Bh!#^3A-f zxKG|>?l-Zo>KLmIR*clS58j|vlb3(J7YVLe+%#f`NJ|=~>tN|9-o@xXXS4(4Ng5jF z8Ka;dm!{_qPlI$9%)o;NS)2_>c5NaSohRb1Vc5)titn#Hsqhk7Y2+{nK~AOb(nizN z>OAp>T(w~Nr&sFd_W1hJS{<7J@jm`r==l zrKy)sC4XS0H}l(~SBx{lAZd1X7NiGNeq3z=t+Exvn!3Z=&vyIQfs*^tqA_+Nr`;SYCZ);Q8{N?nMa=q;aDp^pjn?%5fa2bX^ z1R*bskByc~?Rru}zxM+bgzR&9IRv%v`Y+T%DDem0q~DE+cE2nuC%0AP+5;67cjnTd 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 -

+To install the johnsnowlabs Python library and all of John Snow Labs open **source libraries**, just run -## 0. Super Quickstart on Google Colab or Kaggle - -If you work on a fresh Notebook on Kaggle or Google colab, you can just copy paste the following commands into your first cell which -will automatically setup Java, nlu and import nlu, so you are good to go right away! +```shell +pip install johnsnowlabs +``` +This installs [Spark-NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart), [NLU](https://nlu.johnsnowlabs.com/) +, [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) +, [Pyspark](https://spark.apache.org/docs/latest/api/python/) and other open +source [sub-dependencies](TODO link to setup.py). -### 1 line Install NLU on Google Colab -```!wget https://setup.johnsnowlabs.com/nlu/colab.sh -O - | bash``` -### 1 line Install NLU on Kaggle -```!wget https://setup.johnsnowlabs.com/nlu/kaggle.sh -O - | bash``` -### Install via PIP -```! pip install nlu pyspark==3.0.1``` +To quickly test the installation, you can run in your Shell: -You can test it out right away with : +```shell +python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" +``` +or in Python: +```python +from johnsnowlabs import * +jsl.load('emotion').predict('Wow that easy!') +``` +The quickest way **licensed libraries** you have access to, like [Spark-NLP for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or [Spark-OCR for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/ocr) +is to run the following in python ```python -nlu.load('emotion').predict('wow that was easy') +from johnsnowlabs import * +jsl.install() ``` +It will make a **Browser Window Pop Up** or **Clickable Button with Pop Up** appear. +On that page you can give access to you John Snow Labs license which enables installation and usage of all your licensed products +Make sure to **Restart your Notebook** when installing to a notebook. -
-### Setup Java in Google Collab or Kaggle -If you work in a Kaggle or Collab Notebook you can simply configure Java by running the following code in a cell -```bash -import os -! apt-get update -qq > /dev/null -# Install java -! apt-get install -y openjdk-8-jdk-headless -qq > /dev/null -os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64" -os.environ["PATH"] = os.environ["JAVA_HOME"] + "/bin:" + os.environ["PATH"] +**Additional Requirements** + +- Make sure you have `Java 8` installed, for setup instructions + see [How to install Java 8 for Windows/Linux/Mac?](https://nlu.johnsnowlabs.com/docs/en/install#get-prerequisites-java-8) +- Windows Users must additionally follow every step precisely defined + in [How to correctly install Spark NLP for Windows?](https://nlp.johnsnowlabs.com/docs/en/install#windows-support) + +The next segment showcases how you can easily install any of John Snow Labs **Licensed Libraries** + +# Install Licensed Libraries + + +The following is a more detailed overview of the alternative installation methods and parameters you can use. +The parameters of `jsl.install()`parameters fall into 3 categories: + +- **Authorization Flow Choice & Auth Flow Tweaks** +- **Installation Target** such as `Airgap Offline`, `Databricks`, `new Pytho Venv`, `Currently running Python Enviroment`, + or `target Python Environment` +- **Installation process tweaks** + +### Authorization Flows overview + +The `johnsnowlabs` library gives you multiple methods to authorize and provide your license when installing licensed +libraries. +Once access to your license is provided, it is cached locally `~/.johnsnowlabs/licenses` and re-used when +calling `jst.start()` and `jsl.installl()`, so you don't need to authorize again. +Only 1 licenses can be provided and will be cached during authorization flows. +If you have multiple licenses you can re-run an authorization method and use the `license_number` parameter choose +between licenses you have +access to. Licenses are locally numbered in order they have been provided, for more info see [License Caching](TODO) + +| Auth Flow Method | Description | Python `jsl.install()` usage | +|--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license | `jsl.install()` | +| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visist new page to give access to your license | `jsl.install()` | +| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) for more details | `jsl.install(access_token=my_token)` | +| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.install(json_license_path=path)` | +| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | +| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | +| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | +| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](TODO) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | + +### Optional Auth Flow Parameters + +Use these parameters to configure **how to authorize** + +| Parameter | description | +|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True` | +| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have multiple. | +| `license_number` | Specify license number to use when using OAuth based approaches or when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use your 0th license from my.johnsnowlabs | +| `store_in_jsl_home` | By default license data and Jars/Wheels are stored in in JSL home directory.
This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify it once authorized again.
Set to `False` to disable this caching behaviour.
| +| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False` | + +### Optional Installation Target Parameters + +Use these parameters to configure **where** to install to + +| Parameter | description | +|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `python_exec_path` | Specify path to a python executable into whose environment the libraries will be installed. Defaults to the current executing Python process, i.e. `sys.executable` and it's pip module is used for setup. | +| `venv_creation_path` | Specify path to a folder, in which a fresh venv will be created with all libraries. Using this parameter ignores the `python_exec_path` parameter, since the newly created venv's python executable is used for setup. | +| `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installsl`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | +| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](TODO) for me details | + +### Optional Installation Process Parameters + +Use these parameters to configure **what should** be installed to the target + +| Parameter | description | +|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `install_optional` | By default install all open source libraries if missing. Set the `False` to disable. | +| `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | +| `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | +| `product` | Specify product to install. By default installs everything you have access to. | +| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory | +| `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types | +| `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | +| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **Thiswill delete your locally cachedlicenses** | + +### Automatic Databricks Installation + +Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install +all open source and licensed features into a Databricks cluster. +You additionally must use one of the [John Snow Labs License Authorization Flows](TODO) to give access to your John Snow +Labs license, +which will be installed to your Databricks cluster. +A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has +all Jars, Wheels and License Information to run +all features in a Databricks cluster. + +| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | +|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](TODO) for me details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | + +Where to find your Databricks Access Token: +![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) + +### License Variables Names for JSON and OS variables + +The following variable names are checked when using a JSON or environment variables based approach for installing +licensed features or when using +`jsl.start()` . +You can find all of your license information on https://my.johnsnowlabs.com/subscriptions + +- `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. +- `AWS_SECRET_ACCESS_KEY` : Assigned to you by John Snow Labs. Must be defined. +- `HC_SECRET` : The secret for a version of the medical library. Changes between releases. Can be omitted if you don't + have a medical license. +- `HC_LICENSE` : Your license for the medical features. Can be omitted if you don't have a medical license. +- `OCR_SECRET` : The secret for a version of the OCR library. Changes between releases. Can be omitted if you don't have + a OCR license. +- `OCR_LICENSE` : Your license for the OCR features. Can be omitted if you don't have a OCR license. +- `JSL_LEGAL_LICENSE`: Your license for Legal OCR and Legal NLP Features +- `JSL_FINANCE_LICENSE` Your license for Finance OCR and Finance NLP Features + +# Installation Examples + +## Auth Flow Examples + +### Via Auto Detection & Browser Login + +All [default search locations ]() are searched, if any credentials are found they will be used used. +If no credentials are auto-detected, a Browser Window will pop up, asking to Authroize yourself +with https://my.johnsnowlabs.com/ +In Google Colab, a clickable button will appear, which will make a window pop up where you can authorize yourself. + +```python +jsl.install() +``` + +### Via Access Token +Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) + + + +```python +jsl.install(access_token='secret') ``` -
+**Step3:** +Then from the **remote machine shell** unzip via + +```shell +# Unzip all files to ~/johnsowlabs +unzip remote/directory/jsl.zip -d ~/johnsowlabs +``` -## 3. Verify that NLU is working properly -Launch a Python shell an run a simple script. -**On Windows you need to launch your shell as admim** +**Step4 (option1):** +Install the wheels via jsl +```python +# If you unzipped to ~/johnsowlabs, then just update this setting before running and jsl.install() handles the rest for you! +from johnsnowlabs import * +jsl.settings.jsl_root = '~/johnsowlabs' +# Make sure you have Java 8 installed! +jsl.install() + +``` + +**Step4 (option2):** +Install the wheels via pip yourself + +```shell +# Assuming you unzipped to ~/johnsnowlabs, you can install all wheels like this +pip install ~/johnsnowlabs/py_installs/*.whl +``` + +**Step5:** +Test your installation +Via shell +```shell +python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" +``` +or in Python: ```python -import nlu -nlu.load('sentiment').predict('Why is NLU so awesome? Because of the sauce!') +from johnsnowlabs import * +jsl.load('emotion').predict('Wow that easy!') +``` +### Offline/Airgap Manual -# 3. Verify that NLU is working properly -Launch a Python shell an run a simple script. -**On Windows you need to launch your shell as admim** +Download all files yourself from the URLS printed by jsl.install(). +You will have to folly the Automatic Instructions starting from step (2) of the automatic installation. +I.e. provide the files somehow on your offline machine. ```python -import nlu -nlu.load('sentiment').predict('Why is NLU is awesome? Because of the sauce!') +# Print all URLS to files you need to provide on your host machine +jsl.install(offline=True) ``` -
+### Into Databricks `TODO` -# Supported data types +To install in databricks you must provide your `accessToken` and `hostUrl`. +You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` +, `browser`, `json_file`, or `manually defining secrets` +Your get get it from -NLU supports currently the following data formats : -- Pandas Dataframes -- Spark Dataframes -- Modin with Dask backend -- Modin with Ray backend -- 1-D Numpy arrays of Strings -- Strings -- Arrays of Strings +``` python +# Create a new Cluster with Spark NLP and all licensed libraries ready to go +jsl.install(databricks_host='https://?????.cloud.databricks.com', databricks_token = 'dbapi_token123',) +``` +``` python +# Install to an existing cluster +jsl.install(databricks_host='https://?????.cloud.databricks.com', databricks_token = 'dbapi_token123',) +``` -## Compatibility with Spark NLP and Spark NLP for Healthcare +# Storage of License Data and License Search behaviour -NLU 3.X is compatible with all Spark NLP 3.X versions. -NOTE : If Spark NLP releases 3.X+1 and NLU is still on 3.X, then NLU will throw errors. +The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . +After having provided license data once, you don't need to specify it again since the cached licensed will be used. +Use the `license_number` parameter to switch between multiple licenses. +Note: Locally cached licenses are numbered in the order they have been provided, starting at 0 +## List all available licenses +This shows you all licenses for your account in https://my.johnsnowlabs.com/ +Use this to decide which license number to install when installing via browser or access token, +```python +jsl.list_remote_licenses() +``` -
### Where to go next @@ -153,6 +396,7 @@ If you want to get your hands dirty with some NLU work, check out the [Examples Detailed information about NLU APIs, concepts, components and more can be found on the following pages : {:.list4} + - [The NLU load function](load_api) - [The NLU predict function](predict_api) - [The NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) From 0e2c8e2d192651726e72025e60cfcee952a6bbe8 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 17:51:03 +0200 Subject: [PATCH 02/26] updated --- docs/en/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/install.md b/docs/en/install.md index bd440d0e..0b6a978f 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -372,7 +372,7 @@ Name of the json file does not matter, file just needs to end with .json The John Snow Labs Teams are working early to push out new Releases and Features each week! Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. -TODO open Source jar??!? + For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](TODO) again. They will be used to fetch the latest licensed library and install them to your target From 090f0b8385a30099f48b9b05f0515b919eb5d5a3 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 18:54:31 +0200 Subject: [PATCH 03/26] updated --- docs/_data/navigation.yml | 5 +- docs/en/jsl_lib_imports.md | 99 ++++++++++++++++++++++++++++++++++ docs/en/predict_api.md | 8 +++ docs/en/start_sparkseession.md | 69 ++++++++++++++++++++++++ 4 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 docs/en/jsl_lib_imports.md create mode 100644 docs/en/start_sparkseession.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index dcdf76b1..86c558fb 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -19,7 +19,6 @@ header: - title: Spellbook url: /docs/en/spellbook key: tutorial_notebooks - - title: '' url: https://github.com/JohnSnowLabs/nlu - title: '' @@ -29,6 +28,10 @@ docs-en: children: - title: Installation url: /docs/en/install + - title: Starting a Spark Session + url: /docs/en/start-a-sparksession + - title: John Snow Labs module overview & usage + url: /docs/en/import-structure - title: NLU Usage url: /docs/en/concepts - title: General NLU Examples diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md new file mode 100644 index 00000000..663c444a --- /dev/null +++ b/docs/en/jsl_lib_imports.md @@ -0,0 +1,99 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: The John Snow labs library usage & suite overview +permalink: /docs/en/import-structure +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
+ +The John Snow Labs Python library gives you a clean and easy way to structure your Python projects. +The very first line of a project should be: +```python +from johnsnowlabs import * +``` +This imports all licensed and open source Python modules installed from other John Snow Labs Products, as well as +many handy utility imports. + + +The following Functions, Classes and Modules will available in the global namespace + +## The **nlp** Module +------------------- +`nlp` module with classes and methods from [Spark NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart) like `nlp.BertForSequenceClassification` and `nlp.map_annotations()` +- `nlp.AnnotatorName` via Spark NLP [Annotators](https://nlp.johnsnowlabs.com/docs/en/annotators) and [Transformers](https://nlp.johnsnowlabs.com/docs/en/transformers) i.e. `nlp.BertForSequenceClassification` +- Spark NLP [Helper Functions](https://nlp.johnsnowlabs.com/docs/en/auxiliary) i.e. `nlp.map_annotations()` +- `nlp.F` via `import pyspark.sql.functions as F` under the hood +- `nlp.T` via `import pyspark.sql.types as T` under the hood +- `nlp.SQL` via `import pyspark.sql as SQL` under the hood +- `nlp.ML` via `from pyspark import ml as ML` under the hood +- To see all the imports see [the source]() + + +## The **jsl** Module + +`jsl` module with the following methods +- `jsl.install()` for installing John Snow Labs libraries and managing your licenses, [more info here](TODO) +- `jsl.load()` for predicting with any the 10k+ pretrained models in 1 line of code or training new ones, using the [nlu.load() method](https://nlu.johnsnowlabs.com/) under the hood +- `jsl.start()` for starting a Spark Session with access to features, [more info here](TODO) +- `jsl.viz()` for visualizing predictions with any of the 10k+ pretrained models using [nlu.viz()](https://nlu.johnsnowlabs.com/docs/en/viz_examples) under the hood +- `jsl.viz_streamlit()` and other `jsl.viz_streamlit_xyz for using any of the 10k+ pretrained models in 0 lines of code with an [interactive Streamlit GUI and re-usable and stackable Streamlit Components](https://nlu.johnsnowlabs.com/docs/en/streamlit_viz_examples) +- `jsl.to_pretty_df()` for predicting on raw strings getting a nicely structures Pandas DF from a Spark Pipeline using [nlu.to_pretty_df()](https://nlu.johnsnowlabs.com/docs/en/utils_for_spark_nlp) under the hood + + +## The **viz** Module + +`viz` module with classes from [Spark NLP Display](https://nlp.johnsnowlabs.com/docs/en/display) +- `viz.NerVisualizer` for visualizing prediction outputs of Ner based Spark Pipelines +- `viz.DependencyParserVisualizer` for visualizing prediction outputs of DependencyParser based Spark Pipelines +- `viz.RelationExtractionVisualizer` for visualizing prediction outputs of RelationExtraction based Spark Pipelines +- `viz.EntityResolverVisualizer` for visualizing prediction outputs of EntityResolver based Spark Pipelines +- `viz.AssertionVisualizer` for visualizing prediction outputs of Assertion based Spark Pipelines + + +## The **ocr** Module + +`ocr` module with annotator classes and methods from [Spark OCR](https://nlp.johnsnowlabs.com/docs/en/ocr) like `ocr.VisualDocumentClassifier` and `ocr.helpful_method() +- [Pipeline Components](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components) i.e. `ocr.ImageToPdf` +- [Table Recognizers](https://nlp.johnsnowlabs.com/docs/en/ocr_table_recognition) i.e. `ocr.ImageTableDetector` +- [Visual Document Understanding](https://nlp.johnsnowlabs.com/docs/en/ocr_visual_document_understanding) i.e. `ocr.VisualDocumentClassifier` +- [Object detectors](https://nlp.johnsnowlabs.com/docs/en/ocr_object_detection) i.e. `ocr.ImageHandwrittenDetector` +- [Enums, Structures and helpers](https://nlp.johnsnowlabs.com/docs/en/ocr_structures) i.e. `ocr.Color` +- To see all the imports see [the source]() + +## The **medical** Module + + +`medical` module with annotator classes and methods from [Spark NLP for Medicine](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) like `medical.RelationExtractionDL` and `medical.profile()` +- [Medical Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `medical.DeIdentification` +- [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `medical.AnnotationToolJsonReader` +- [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `medical.NerDLEvaluation` +- NOTE: Any class which has `Medical` in its name is available, but the `Medical` prefix has been omitted. I.e. `medical.NerModel` maps to `sparknlp_jsl.annotator.MedicalNerModel` + - This is achieved via `from sparknlp_jsl.annotator import MedicalNerModel as NerModel` under the hood. +- To see all the imports see [the source]() + +## The **legal** Module + +`legal` module with annotator classes and methods from [Spark NLP for Legal](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) like `legal.RelationExtractionDL` and `legal.profile()` +- [Legal Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `legal.DeIdentification` +- [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `legal.AnnotationToolJsonReader` +- [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `legal.NerDLEvaluation` +- NOTE: Any class which has `Legal` in its name is available, but the `Legal` prefix has been omitted. I.e. `legal.NerModel` maps to `sparknlp_jsl.annotator.LegalNerModel` + - This is achieved via `from sparknlp_jsl.annotator import LegalNerModel as NerModel` under the hood. +- To see all the imports see [the source]() + + +## The **finance** Module + + +`finance` module with annotator classes and methods from [Spark NLP for Finance](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) like `finance.RelationExtractionDL` and `finance.profile()` +- [Finance Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `finance.DeIdentification` +- [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `finance.AnnotationToolJsonReader` +- [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `finance.NerDLEvaluation` +- NOTE: Any class which has `Finance` in its name is available, but the `Finance` prefix has been omitted. I.e. `finance.NerModel` maps to `sparknlp_jsl.annotator.FinanceNerModel` + - This is achieved via `from sparknlp_jsl.annotator import FinanceNerModel as NerModel` under the hood. +- To see all the imports see [the source]() +
\ No newline at end of file diff --git a/docs/en/predict_api.md b/docs/en/predict_api.md index 3b28702e..3f99ab77 100644 --- a/docs/en/predict_api.md +++ b/docs/en/predict_api.md @@ -220,6 +220,14 @@ nlu.load('sentiment').predict(text_df[['tweet','tweet_location']]) ## Supported data types NLU supports all of the common Python data types and formats +- Pandas Dataframes +- Spark Dataframes +- Modin with Dask backend +- Modin with Ray backend +- 1-D Numpy arrays of Strings +- Strings +- Arrays of Strings +
diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md new file mode 100644 index 00000000..5d746b67 --- /dev/null +++ b/docs/en/start_sparkseession.md @@ -0,0 +1,69 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Starting a Spark Session +permalink: /docs/en/start-a-sparksession +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
+ +To use most features you must start a Spark Session with `jsl.start()`first. +This will launch a Java [Virtual Machine(JVM)](https://en.wikipedia.org/wiki/Java_virtual_machine) process on your machine +which has all of John Snow Labs and Sparks [Scala/Java Libraries(JARs)](https://de.wikipedia.org/wiki/Java_Archive) loaded into memory. + +The `jsl.start()` method loads all jars for which credentials are provided if they are missing. +If you have installed via `jsl.install()` you can most likely skip the rest of this page, since your secrets have been`~/.jsl_home` and re-use will be re-used. +If you disabled license caching while installing, installed manually or if you want to tweak settings about your spark session continue reading this section further. + + +## Authorization Flow Parameters +Most of the authorization Flows and Parameters of `jsl.install()` +Review detailed [docs here](TODO) + +| Parameter | Description | Example | Default | +|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| +| `None` | Load license automatically from via one of the **Auto-Detection Mechanisms* | `jsl.start()` | `False` | +| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | +| `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) | `jsl.start(access_token='myToken')` | `None` | +| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | +| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | +| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | + + +### Manually specify License Parameters +These can be omitted according to the [License Variable Overview](TODO) + +| Parameter | Description | +|------------------|----------------------------------------| +| `aws_access_key` | Corresponds to `AWS_ACCESS_KEY_ID` | +| `aws_key_id` | Corresponds to `AWS_SECRET_ACCESS_KEY` | +| `hc_secret` | Corresponds to `HC_SECRET` | +| `ocr_secret` | Corresponds to `OCR_SECRET` | +| `hc_license` | Corresponds to `HC_LICENSE` | +| `ocr_license` | Corresponds to `OCR_LICENSE` | +| `fin_license` | Corresponds to `JSL_LEGAL_LICENSE` | +| `leg_license` | Corresponds to `JSL_FINANCE_LICENSE` | + +## Sparksession Parameters +These parameters configure how your spark Session is started up. +See [Spark Configuration](https://spark.apache.org/docs/latest/configuration.html) for a comprehensive overview of all spark settings + +| Parameter | Default | Description | Example | +|----------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------| +| `spark_conf` | `None` | Dictionary Key/Value pairs of [Spark Configurations](https://spark.apache.org/docs/latest/configuration.html) for the Spark Session | `jsl.start(spark_conf={'spark.executor.memory':'6g')` | +| `master_url` | `local[*]` | URL to Spark Cluster master | `jsl.start(master_url=spark://my.master)` | +| `jar_paths` | `None` | List of paths to jars which should be loaded into the Spark Session | `jsl.start(jar_paths=['my/jar_folder/jar1.zip','my/jar_folder/jar2.zip' )` | +| `exclude_nlp` | `False` | Whether to include Spark NLP jar in Session or not. This will always load the jar if available, unless set to `True`. | `jsl.start(exclude_nlp=True)` | +| `exclude_healthcare` | `False` | Whether to include licensed NLP Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_healthcare=True)` | +| `exclude_ocr` | `False` | Whether to include licensed OCR Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_ocr=True)` | +| `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target=True)` | +| `model_cache_folder` | `None` | Specify where models should be downloaded to when using `model.pretrained()` | `jsl.start(model_cache_folder=True)` | + + + + + +
\ No newline at end of file From 0a2db8bcffca40441bd2ea676ca2fc408b7617fd Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 19:13:44 +0200 Subject: [PATCH 04/26] Updated Sparksession Docs --- docs/assets/images/jsl_lib/start/start.png | Bin 0 -> 38931 bytes docs/en/start_sparkseession.md | 36 ++++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) create mode 100644 docs/assets/images/jsl_lib/start/start.png diff --git a/docs/assets/images/jsl_lib/start/start.png b/docs/assets/images/jsl_lib/start/start.png new file mode 100644 index 0000000000000000000000000000000000000000..c8544d10006c61fc2020c3bca3c36a30536c009a GIT binary patch literal 38931 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 z
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 -To use most features you must start a Spark Session with `jsl.start()`first. -This will launch a Java [Virtual Machine(JVM)](https://en.wikipedia.org/wiki/Java_virtual_machine) process on your machine -which has all of John Snow Labs and Sparks [Scala/Java Libraries(JARs)](https://de.wikipedia.org/wiki/Java_Archive) loaded into memory. +To use most features you must start a Spark Session with `jsl.start()`first. +This will launch a [Java Virtual Machine(JVM)](https://en.wikipedia.org/wiki/Java_virtual_machine) process on your machine +which has all of John Snow Labs and Sparks [Scala/Java Libraries(JARs)](https://de.wikipedia.org/wiki/Java_Archive) you have access to loaded into memory. + +The `jsl.start()` method downloads loads and caches all jars for which credentials are provided if they are missing into `~/.jsl_home/java_installs`. +If you have installed via `jsl.install()` you can most likely **skip the rest of this page**, since your secrets have been`~/.jsl_home` and re-use will be re-used. +If you **disabled license caching** while installing or if you want to **tweak settings about your spark session** continue reading this section further. + +Outputs of running `jsl.start()` tell you which jars are loaded and versions of all relevant libraries. +![access_token1.png](/assets/images/jsl_lib/start/start.png) -The `jsl.start()` method loads all jars for which credentials are provided if they are missing. -If you have installed via `jsl.install()` you can most likely skip the rest of this page, since your secrets have been`~/.jsl_home` and re-use will be re-used. -If you disabled license caching while installing, installed manually or if you want to tweak settings about your spark session continue reading this section further. ## Authorization Flow Parameters @@ -51,16 +55,16 @@ These can be omitted according to the [License Variable Overview](TODO) These parameters configure how your spark Session is started up. See [Spark Configuration](https://spark.apache.org/docs/latest/configuration.html) for a comprehensive overview of all spark settings -| Parameter | Default | Description | Example | -|----------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------| -| `spark_conf` | `None` | Dictionary Key/Value pairs of [Spark Configurations](https://spark.apache.org/docs/latest/configuration.html) for the Spark Session | `jsl.start(spark_conf={'spark.executor.memory':'6g')` | -| `master_url` | `local[*]` | URL to Spark Cluster master | `jsl.start(master_url=spark://my.master)` | -| `jar_paths` | `None` | List of paths to jars which should be loaded into the Spark Session | `jsl.start(jar_paths=['my/jar_folder/jar1.zip','my/jar_folder/jar2.zip' )` | -| `exclude_nlp` | `False` | Whether to include Spark NLP jar in Session or not. This will always load the jar if available, unless set to `True`. | `jsl.start(exclude_nlp=True)` | -| `exclude_healthcare` | `False` | Whether to include licensed NLP Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_healthcare=True)` | -| `exclude_ocr` | `False` | Whether to include licensed OCR Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_ocr=True)` | -| `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target=True)` | -| `model_cache_folder` | `None` | Specify where models should be downloaded to when using `model.pretrained()` | `jsl.start(model_cache_folder=True)` | +| Parameter | Default | Description | Example | +|----------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| +| `spark_conf` | `None` | Dictionary Key/Value pairs of [Spark Configurations](https://spark.apache.org/docs/latest/configuration.html) for the Spark Session | `jsl.start(spark_conf={'spark.executor.memory':'6g'})` | +| `master_url` | `local[*]` | URL to Spark Cluster master | `jsl.start(master_url=spark://my.master)` | +| `jar_paths` | `None` | List of paths to jars which should be loaded into the Spark Session | `jsl.start(jar_paths=['my/jar_folder/jar1.zip','my/jar_folder/jar2.zip'] )` | +| `exclude_nlp` | `False` | Whether to include Spark NLP jar in Session or not. This will always load the jar if available, unless set to `True`. | `jsl.start(exclude_nlp=True)` | +| `exclude_healthcare` | `False` | Whether to include licensed NLP Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_healthcare=True)` | +| `exclude_ocr` | `False` | Whether to include licensed OCR Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_ocr=True)` | +| `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target=True)` | +| `model_cache_folder` | `None` | Specify where models should be downloaded to when using `model.pretrained()` | `jsl.start(model_cache_folder=True)` | From 2074b3a75e726b4537f9a8f83f69f7e0a2631d80 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 19:19:34 +0200 Subject: [PATCH 05/26] updated where to go next section --- docs/en/install.md | 72 +++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 27 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 0b6a978f..354cc905 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -26,34 +26,38 @@ To quickly test the installation, you can run in your Shell: ```shell python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" ``` + or in Python: + ```python from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` -The quickest way **licensed libraries** you have access to, like [Spark-NLP for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or [Spark-OCR for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/ocr) + +The quickest way **licensed libraries** you have access to, +like [Spark-NLP for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/licensed_install) +or [Spark-OCR for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/ocr) is to run the following in python + ```python from johnsnowlabs import * jsl.install() ``` + It will make a **Browser Window Pop Up** or **Clickable Button with Pop Up** appear. -On that page you can give access to you John Snow Labs license which enables installation and usage of all your licensed products +On that page you can give access to you John Snow Labs license which enables installation and usage of all your licensed +products Make sure to **Restart your Notebook** when installing to a notebook. Colab Button ![install_button_colab.png](/assets/images/jsl_lib/install/install_button_colab.png) Where the Pop-Up leads you to: - ![install_pop_up.png](/assets/images/jsl_lib/install/install_pop_up.png) +![install_pop_up.png](/assets/images/jsl_lib/install/install_pop_up.png) After clicking **Authorize**: ![install_logs_colab.png](/assets/images/jsl_lib/install/install_logs_colab.png) - - - - **Additional Requirements** - Make sure you have `Java 8` installed, for setup instructions @@ -63,14 +67,14 @@ After clicking **Authorize**: The next segment showcases how you can easily install any of John Snow Labs **Licensed Libraries** -# Install Licensed Libraries - +# Install Licensed Libraries The following is a more detailed overview of the alternative installation methods and parameters you can use. The parameters of `jsl.install()`parameters fall into 3 categories: - **Authorization Flow Choice & Auth Flow Tweaks** -- **Installation Target** such as `Airgap Offline`, `Databricks`, `new Pytho Venv`, `Currently running Python Enviroment`, +- **Installation Target** such as `Airgap Offline`, `Databricks`, `new Pytho Venv` + , `Currently running Python Enviroment`, or `target Python Environment` - **Installation process tweaks** @@ -91,9 +95,12 @@ access to. Licenses are locally numbered in order they have been provided, for m | Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visist new page to give access to your license | `jsl.install()` | | Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) for more details | `jsl.install(access_token=my_token)` | | License JSON file path | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.install(json_license_path=path)` | -| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | -| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | -| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | +| ** +Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | +| ** +Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | +| ** +Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | | Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](TODO) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | ### Optional Auth Flow Parameters @@ -129,10 +136,13 @@ Use these parameters to configure **what should** be installed to the target | `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | | `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | | `product` | Specify product to install. By default installs everything you have access to. | -| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory | +| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and ** +only download jars** to the John Snow Labs home directory | | `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types | | `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | -| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **Thiswill delete your locally cachedlicenses** | +| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **Thiswill +delete your locally +cachedlicenses** | ### Automatic Databricks Installation @@ -186,9 +196,8 @@ jsl.install() ``` ### Via Access Token -Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) - +Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) ```python jsl.install(access_token='secret') @@ -197,7 +206,6 @@ jsl.install(access_token='secret') Where you find the license ![access_token1.png](/assets/images/jsl_lib/install/access_token1.png) - ### Via Json Secrets file Path to a JSON containing secrets, see [License Variable Names](TODO) for more details. @@ -254,6 +262,7 @@ jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') Create a Zip with all Jars/Wheels/Licenses you need to run all libraries in an offline environment. **Step1:** + ```python jsl.install(offline_zip_dir='path/to/where/my/zip/will/be') ``` @@ -297,14 +306,18 @@ pip install ~/johnsnowlabs/py_installs/*.whl **Step5:** Test your installation Via shell + ```shell python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" ``` + or in Python: + ```python from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` + ### Offline/Airgap Manual Download all files yourself from the URLS printed by jsl.install(). @@ -340,22 +353,26 @@ After having provided license data once, you don't need to specify it again sinc Use the `license_number` parameter to switch between multiple licenses. Note: Locally cached licenses are numbered in the order they have been provided, starting at 0 +## List all available licenses -## List all available licenses This shows you all licenses for your account in https://my.johnsnowlabs.com/ -Use this to decide which license number to install when installing via browser or access token, +Use this to decide which license number to install when installing via browser or access token, + ```python jsl.list_remote_licenses() ``` ## List all locally cached licenses -Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license you want to load. + +Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license +you want to load. ```python jsl.list_local_licenses() ``` ## License Search presedence + If there are multiples possible sources for licenses, the following order takes presedence 1. Manually provided license data by defining all license parameters @@ -371,8 +388,7 @@ Name of the json file does not matter, file just needs to end with .json ## Upgrade Flow The John Snow Labs Teams are working early to push out new Releases and Features each week! -Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. - +Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](TODO) again. They will be used to fetch the latest licensed library and install them to your target @@ -389,17 +405,19 @@ Join our channel, to ask for help and share your feedback. Developers and users [NLU Slack](https://spark-nlp.slack.com/archives/C0196BQCDPY){:.button.button--info.button--rounded.button--md} - ### Where to go next -If you want to get your hands dirty with some NLU work, check out the [Examples page](examples) -Detailed information about NLU APIs, concepts, components and more can be found on the following pages : +If you want to get your hands dirty with any of the features check out the [NLU examples page](examples), +or [Licensed Annotators Overview](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) +Detailed information about Johnsnowlabs Libraries APIs, concepts, components and more can be found on the following pages : {:.list4} +- [Starting a Spark Session](start-a-sparksession) +- [John Snow Labs Library usage and import Overview](import-structure) - [The NLU load function](load_api) - [The NLU predict function](predict_api) - [The NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) - [NLU Notebooks](notebooks) -
\ No newline at end of file + \ No newline at end of file From 93ddeb82a49c732f742e50ca4d009c22a130e592 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 19:22:38 +0200 Subject: [PATCH 06/26] fixed table install section --- docs/en/install.md | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 354cc905..93e791a2 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -95,12 +95,9 @@ access to. Licenses are locally numbered in order they have been provided, for m | Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visist new page to give access to your license | `jsl.install()` | | Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) for more details | `jsl.install(access_token=my_token)` | | License JSON file path | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.install(json_license_path=path)` | -| ** -Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | -| ** -Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | -| ** -Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | +| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | +| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | +| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | | Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](TODO) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | ### Optional Auth Flow Parameters @@ -126,6 +123,7 @@ Use these parameters to configure **where** to install to | `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installsl`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | | `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](TODO) for me details | + ### Optional Installation Process Parameters Use these parameters to configure **what should** be installed to the target @@ -136,13 +134,10 @@ Use these parameters to configure **what should** be installed to the target | `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | | `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | | `product` | Specify product to install. By default installs everything you have access to. | -| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and ** -only download jars** to the John Snow Labs home directory | +| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory | | `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types | | `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | -| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **Thiswill -delete your locally -cachedlicenses** | +| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses** | ### Automatic Databricks Installation @@ -167,7 +162,7 @@ Where to find your Databricks Access Token: The following variable names are checked when using a JSON or environment variables based approach for installing licensed features or when using `jsl.start()` . -You can find all of your license information on https://my.johnsnowlabs.com/subscriptions +You can find all of your license information on [https://my.johnsnowlabs.com/subscriptions](https://my.johnsnowlabs.com/subscriptions) - `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. - `AWS_SECRET_ACCESS_KEY` : Assigned to you by John Snow Labs. Must be defined. From 2467f1de9ad227fd933a2357d63c1fd60c6b526f Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 3 Oct 2022 20:06:32 +0200 Subject: [PATCH 07/26] fixed style --- docs/_data/navigation.yml | 6 ++++-- docs/en/install.md | 6 ++---- docs/en/jsl_lib_imports.md | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 86c558fb..5aafbe19 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -24,14 +24,16 @@ header: - title: '' url: https://join.slack.com/t/spark-nlp/shared_invite/zt-lutct9gm-kuUazcyFKhuGY3_0AMkxqA docs-en: - - title: NLU + - title: John Snow Labs children: - title: Installation url: /docs/en/install - title: Starting a Spark Session url: /docs/en/start-a-sparksession - - title: John Snow Labs module overview & usage + - title: John Snow Labs Usage & Overview url: /docs/en/import-structure + - title: NLU + children: - title: NLU Usage url: /docs/en/concepts - title: General NLU Examples diff --git a/docs/en/install.md b/docs/en/install.md index 93e791a2..01162fa7 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -65,8 +65,6 @@ After clicking **Authorize**: - Windows Users must additionally follow every step precisely defined in [How to correctly install Spark NLP for Windows?](https://nlp.johnsnowlabs.com/docs/en/install#windows-support) -The next segment showcases how you can easily install any of John Snow Labs **Licensed Libraries** - # Install Licensed Libraries The following is a more detailed overview of the alternative installation methods and parameters you can use. @@ -366,9 +364,9 @@ you want to load. jsl.list_local_licenses() ``` -## License Search presedence +## License Search precedence -If there are multiples possible sources for licenses, the following order takes presedence +If there are multiples possible sources for licenses, the following order takes precedence 1. Manually provided license data by defining all license parameters 2. Browser/ Access Token diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md index 663c444a..6cec3e0f 100644 --- a/docs/en/jsl_lib_imports.md +++ b/docs/en/jsl_lib_imports.md @@ -1,7 +1,7 @@ --- layout: docs seotitle: NLU | John Snow Labs -title: The John Snow labs library usage & suite overview +title: John Snow labs Usage & Overview permalink: /docs/en/import-structure key: docs-install modify_date: "2020-05-26" From dc8388e8682aaaa68babb68a9466822974e9c4d8 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Tue, 4 Oct 2022 21:20:39 +0200 Subject: [PATCH 08/26] Minor restructure --- docs/en/install.md | 19 +++++++------------ docs/en/start_sparkseession.md | 10 +++++----- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 01162fa7..29229841 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -142,11 +142,10 @@ Use these parameters to configure **what should** be installed to the target Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install all open source and licensed features into a Databricks cluster. You additionally must use one of the [John Snow Labs License Authorization Flows](TODO) to give access to your John Snow -Labs license, -which will be installed to your Databricks cluster. +Labs license,which will be installed to your Databricks cluster. A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has -all Jars, Wheels and License Information to run -all features in a Databricks cluster. +all Jars, Wheels and License Information to run all features in a Databricks cluster. +**Only Licensed Libraries and Spark NLP** will be installed to your cluster, without the | Databricks Auth Flow Method | Description | Python `jsl.install()` usage | |-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| @@ -251,7 +250,7 @@ Create a new Venv from scratch, using the currently exectuing Pythons Venv Modul jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') ``` -### Offline/Airgap Installation (Automatic) +### Into Airgap/Offline Installation (Automatic) Create a Zip with all Jars/Wheels/Licenses you need to run all libraries in an offline environment. **Step1:** @@ -311,7 +310,7 @@ from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` -### Offline/Airgap Manual +### Into Airgap/Offline Manual Download all files yourself from the URLS printed by jsl.install(). You will have to folly the Automatic Instructions starting from step (2) of the automatic installation. @@ -322,7 +321,7 @@ I.e. provide the files somehow on your offline machine. jsl.install(offline=True) ``` -### Into Databricks `TODO` +### Into a freshly created Databricks cluster To install in databricks you must provide your `accessToken` and `hostUrl`. You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` @@ -331,13 +330,9 @@ Your get get it from ``` python # Create a new Cluster with Spark NLP and all licensed libraries ready to go -jsl.install(databricks_host='https://?????.cloud.databricks.com', databricks_token = 'dbapi_token123',) +jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) ``` -``` python -# Install to an existing cluster -jsl.install(databricks_host='https://?????.cloud.databricks.com', databricks_token = 'dbapi_token123',) -``` # Storage of License Data and License Search behaviour diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md index 17d71253..103262bb 100644 --- a/docs/en/start_sparkseession.md +++ b/docs/en/start_sparkseession.md @@ -15,7 +15,7 @@ This will launch a [Java Virtual Machine(JVM)](https://en.wikipedia.org/wiki/Jav which has all of John Snow Labs and Sparks [Scala/Java Libraries(JARs)](https://de.wikipedia.org/wiki/Java_Archive) you have access to loaded into memory. The `jsl.start()` method downloads loads and caches all jars for which credentials are provided if they are missing into `~/.jsl_home/java_installs`. -If you have installed via `jsl.install()` you can most likely **skip the rest of this page**, since your secrets have been`~/.jsl_home` and re-use will be re-used. +If you have installed via `jsl.install()` you can most likely **skip the rest of this page**, since your secrets have been cached in `~/.jsl_home` and will be re-used. If you **disabled license caching** while installing or if you want to **tweak settings about your spark session** continue reading this section further. Outputs of running `jsl.start()` tell you which jars are loaded and versions of all relevant libraries. @@ -24,7 +24,7 @@ Outputs of running `jsl.start()` tell you which jars are loaded and versions of ## Authorization Flow Parameters -Most of the authorization Flows and Parameters of `jsl.install()` +Most of the authorization Flows and Parameters of `jsl.install()` Review detailed [docs here](TODO) | Parameter | Description | Example | Default | @@ -52,18 +52,18 @@ These can be omitted according to the [License Variable Overview](TODO) | `leg_license` | Corresponds to `JSL_FINANCE_LICENSE` | ## Sparksession Parameters -These parameters configure how your spark Session is started up. +These parameters configure how your spark Session is started up. See [Spark Configuration](https://spark.apache.org/docs/latest/configuration.html) for a comprehensive overview of all spark settings | Parameter | Default | Description | Example | |----------------------|------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------| | `spark_conf` | `None` | Dictionary Key/Value pairs of [Spark Configurations](https://spark.apache.org/docs/latest/configuration.html) for the Spark Session | `jsl.start(spark_conf={'spark.executor.memory':'6g'})` | -| `master_url` | `local[*]` | URL to Spark Cluster master | `jsl.start(master_url=spark://my.master)` | +| `master_url` | `local[*]` | URL to Spark Cluster master | `jsl.start(master_url='spark://my.master')` | | `jar_paths` | `None` | List of paths to jars which should be loaded into the Spark Session | `jsl.start(jar_paths=['my/jar_folder/jar1.zip','my/jar_folder/jar2.zip'] )` | | `exclude_nlp` | `False` | Whether to include Spark NLP jar in Session or not. This will always load the jar if available, unless set to `True`. | `jsl.start(exclude_nlp=True)` | | `exclude_healthcare` | `False` | Whether to include licensed NLP Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_healthcare=True)` | | `exclude_ocr` | `False` | Whether to include licensed OCR Jar for Legal,Finance or Healthcare. This will always load the jar if available using your provided license, unless set to `True`. | `jsl.start(exclude_ocr=True)` | -| `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target=True)` | +| `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target='m1')` | | `model_cache_folder` | `None` | Specify where models should be downloaded to when using `model.pretrained()` | `jsl.start(model_cache_folder=True)` | From 557aff13a1803ada8a8c7350095565bb2cf58ed1 Mon Sep 17 00:00:00 2001 From: "Jose J. Martinez" Date: Tue, 4 Oct 2022 21:47:11 +0200 Subject: [PATCH 09/26] Resolves TODO links --- docs/en/install.md | 30 +++++++++++++++--------------- docs/en/jsl_lib_imports.md | 4 ++-- docs/en/start_sparkseession.md | 20 ++++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 29229841..696c9ddb 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -81,22 +81,22 @@ The parameters of `jsl.install()`parameters fall into 3 categories: The `johnsnowlabs` library gives you multiple methods to authorize and provide your license when installing licensed libraries. Once access to your license is provided, it is cached locally `~/.johnsnowlabs/licenses` and re-used when -calling `jst.start()` and `jsl.installl()`, so you don't need to authorize again. +calling `jst.start()` and `jsl.install()`, so you don't need to authorize again. Only 1 licenses can be provided and will be cached during authorization flows. If you have multiple licenses you can re-run an authorization method and use the `license_number` parameter choose between licenses you have -access to. Licenses are locally numbered in order they have been provided, for more info see [License Caching](TODO) +access to. Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour) | Auth Flow Method | Description | Python `jsl.install()` usage | |--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| | Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license | `jsl.install()` | | Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visist new page to give access to your license | `jsl.install()` | -| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) for more details | `jsl.install(access_token=my_token)` | -| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.install(json_license_path=path)` | -| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](TODO) | `jsl.install()` | -| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](TODO) | `jsl.install()` | +| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | +| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | +| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | +| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | | **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | -| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](TODO) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | +| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | ### Optional Auth Flow Parameters @@ -119,7 +119,7 @@ Use these parameters to configure **where** to install to | `python_exec_path` | Specify path to a python executable into whose environment the libraries will be installed. Defaults to the current executing Python process, i.e. `sys.executable` and it's pip module is used for setup. | | `venv_creation_path` | Specify path to a folder, in which a fresh venv will be created with all libraries. Using this parameter ignores the `python_exec_path` parameter, since the newly created venv's python executable is used for setup. | | `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installsl`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | -| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](TODO) for me details | +| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for me details | ### Optional Installation Process Parameters @@ -141,15 +141,15 @@ Use these parameters to configure **what should** be installed to the target Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install all open source and licensed features into a Databricks cluster. -You additionally must use one of the [John Snow Labs License Authorization Flows](TODO) to give access to your John Snow +You additionally must use one of the [John Snow Labs License Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) to give access to your John Snow Labs license,which will be installed to your Databricks cluster. A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has all Jars, Wheels and License Information to run all features in a Databricks cluster. **Only Licensed Libraries and Spark NLP** will be installed to your cluster, without the -| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | -|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| -| `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](TODO) for me details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | +| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | +|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | Where to find your Databricks Access Token: ![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) @@ -200,7 +200,7 @@ Where you find the license ### Via Json Secrets file -Path to a JSON containing secrets, see [License Variable Names](TODO) for more details. +Path to a JSON containing secrets, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. ```python jsl.install(secrets_file='my/secret.json') @@ -208,7 +208,7 @@ jsl.install(secrets_file='my/secret.json') ### Via Manually defining Secrets -Manually specify all secrets. Some of these can be omitted, see [License Variable Names](TODO) for more details. +Manually specify all secrets. Some of these can be omitted, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. ```python jsl.install( @@ -378,7 +378,7 @@ Name of the json file does not matter, file just needs to end with .json The John Snow Labs Teams are working early to push out new Releases and Features each week! Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. -For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](TODO) again. +For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again. They will be used to fetch the latest licensed library and install them to your target ## How to setup Java 8 diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md index 6cec3e0f..955c2a68 100644 --- a/docs/en/jsl_lib_imports.md +++ b/docs/en/jsl_lib_imports.md @@ -36,9 +36,9 @@ The following Functions, Classes and Modules will available in the global namesp ## The **jsl** Module `jsl` module with the following methods -- `jsl.install()` for installing John Snow Labs libraries and managing your licenses, [more info here](TODO) +- `jsl.install()` for installing John Snow Labs libraries and managing your licenses, [more info here](https://nlu.johnsnowlabs.com/docs/en/install) - `jsl.load()` for predicting with any the 10k+ pretrained models in 1 line of code or training new ones, using the [nlu.load() method](https://nlu.johnsnowlabs.com/) under the hood -- `jsl.start()` for starting a Spark Session with access to features, [more info here](TODO) +- `jsl.start()` for starting a Spark Session with access to features, [more info here](https://nlu.johnsnowlabs.com/docs/en/start-a-sparksession) - `jsl.viz()` for visualizing predictions with any of the 10k+ pretrained models using [nlu.viz()](https://nlu.johnsnowlabs.com/docs/en/viz_examples) under the hood - `jsl.viz_streamlit()` and other `jsl.viz_streamlit_xyz for using any of the 10k+ pretrained models in 0 lines of code with an [interactive Streamlit GUI and re-usable and stackable Streamlit Components](https://nlu.johnsnowlabs.com/docs/en/streamlit_viz_examples) - `jsl.to_pretty_df()` for predicting on raw strings getting a nicely structures Pandas DF from a Spark Pipeline using [nlu.to_pretty_df()](https://nlu.johnsnowlabs.com/docs/en/utils_for_spark_nlp) under the hood diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md index 103262bb..9fa772c4 100644 --- a/docs/en/start_sparkseession.md +++ b/docs/en/start_sparkseession.md @@ -25,20 +25,20 @@ Outputs of running `jsl.start()` tell you which jars are loaded and versions of ## Authorization Flow Parameters Most of the authorization Flows and Parameters of `jsl.install()` -Review detailed [docs here](TODO) +Review detailed [docs here](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) -| Parameter | Description | Example | Default | -|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| -| `None` | Load license automatically from via one of the **Auto-Detection Mechanisms* | `jsl.start()` | `False` | -| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | -| `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Accesses Token Example](TODO) | `jsl.start(access_token='myToken')` | `None` | -| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](TODO) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | -| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | -| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | +| Parameter | Description | Example | Default | +|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| +| `None` | Load license automatically from via one of the **Auto-Detection Mechanisms* | `jsl.start()` | `False` | +| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | +| `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](http://nlu.johnsnowlabs.com/docs/en/install#via-access-token) | `jsl.start(access_token='myToken')` | `None` | +| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | +| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | +| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | ### Manually specify License Parameters -These can be omitted according to the [License Variable Overview](TODO) +These can be omitted according to the [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | Parameter | Description | |------------------|----------------------------------------| From 8fbc1c65028656e4e39167caf58b5bb7069c0b06 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Wed, 5 Oct 2022 02:21:41 +0200 Subject: [PATCH 10/26] doc updates --- docs/_data/navigation.yml | 3 ++ docs/en/install.md | 17 +++++++--- docs/en/jsl_home.md | 62 ++++++++++++++++++++++++++++++++++ docs/en/jsl_lib_imports.md | 6 ++-- docs/en/start_sparkseession.md | 36 ++++++++++---------- 5 files changed, 98 insertions(+), 26 deletions(-) create mode 100644 docs/en/jsl_home.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index 5aafbe19..c22b2f5a 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -32,6 +32,9 @@ docs-en: url: /docs/en/start-a-sparksession - title: John Snow Labs Usage & Overview url: /docs/en/import-structure + - title: Settings & Cache Folder + url: /docs/en/john-snow-labs-home + - title: NLU children: - title: NLU Usage diff --git a/docs/en/install.md b/docs/en/install.md index 696c9ddb..a2000811 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -76,6 +76,13 @@ The parameters of `jsl.install()`parameters fall into 3 categories: or `target Python Environment` - **Installation process tweaks** + +### List all of your accessible Licenses + +You can use `jsl.list_remote_licenses()` to list all available licenses in your [my.johnsnowlabs.com/](https://my.johnsnowlabs.com/) account +and `jsl.list_local_licenses()` to list all locally cached licenses. +``` + ### Authorization Flows overview The `johnsnowlabs` library gives you multiple methods to authorize and provide your license when installing licensed @@ -96,7 +103,7 @@ access to. Licenses are locally numbered in order they have been provided, for m | **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | | **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | | **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | -| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license hc_secret=hc_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | +| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | ### Optional Auth Flow Parameters @@ -163,8 +170,8 @@ You can find all of your license information on [https://my.johnsnowlabs.com/sub - `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. - `AWS_SECRET_ACCESS_KEY` : Assigned to you by John Snow Labs. Must be defined. -- `HC_SECRET` : The secret for a version of the medical library. Changes between releases. Can be omitted if you don't - have a medical license. +- `HC_SECRET` : The secret for a version of the enterprise NLP engine library. Changes between releases. Can be omitted if you don't + have access to enterprise nlp. - `HC_LICENSE` : Your license for the medical features. Can be omitted if you don't have a medical license. - `OCR_SECRET` : The secret for a version of the OCR library. Changes between releases. Can be omitted if you don't have a OCR license. @@ -213,7 +220,7 @@ Manually specify all secrets. Some of these can be omitted, see [License Variabl ```python jsl.install( hc_license='Your Secret', - hc_secret='Your Secret', + enterprise_nlp_secret='Your Secret', ocr_secret='Your Secret', ocr_license='Your Secret', aws_access_key='Your Secret', @@ -368,7 +375,7 @@ If there are multiples possible sources for licenses, the following order takes 3. `Os environment Variables` for any var names that match up with secret names 4. `/content/*.json` for any json file smaller than 1 MB 5. `current_working_dir/*.json` for any json smaller than 1 MB -6. `~/.johnsnowlabs/jsl_config` for jsl config for +6. `~/.johnsnowlabs/licenses` for any licenses JSON files are scanned if they have any keys that match up with names of secrets. Name of the json file does not matter, file just needs to end with .json diff --git a/docs/en/jsl_home.md b/docs/en/jsl_home.md new file mode 100644 index 00000000..0c6810e4 --- /dev/null +++ b/docs/en/jsl_home.md @@ -0,0 +1,62 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: John Snow Labs Configurations +permalink: /docs/en/john-snow-labs-home +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
+ + + +## Installed Library Version Settings +Each version of the John Snow Labs library comes with a **hardcoded set of versions** for very of product of the John Snow Labs company. +It will not accept **library secrets** which correspond to **versions do not match the settings**. +This essentially prevents you from installing **outdated** or **new but not deeply tested** libraries, or from shooting yourself in the foot you might say. + +[incombatible_lib_secrets.png](TODO) + +You can work around this protection mechanism, by configuring which version of licensed and open source libraries should be installed and accepted by updating the +`jsl.settings` module. + +```python +#Example of all library versions to configure +from johnsnowlabs import * +jsl.settings.raw_version_jsl_lib='1.2.3' +jsl.settings.raw_version_nlp='1.2.3.rc1' +jsl.settings.raw_version_medical='1.2.3rc2' +jsl.settings.raw_version_secret_medical='1.2.3.a3' +jsl.settings.raw_version_secret_ocr='1.2.3.abc' +jsl.settings.raw_version_ocr='1.2.3.abc' +jsl.settings.raw_version_nlu='1.2.3.abc' +jsl.settings.raw_version_pyspark='1.2.3.abc' +jsl.settings.raw_version_nlp_display='1.2.3.abc' +``` + + +## John Snow Labs Home Cache Folder +The John Snow Labs library maintains a home folder in `~/.johnsnowlabs` which contains all your Licenses, Jars for Java and Wheels for Python to install and run any feature. +Additionally, each directory has an `info.json` file, telling you more about Spark compatibility, Hardware Targets and versions of the files. + + +```shell +~/.johnsnowlabs/ + ├─ licenses/ + │ ├─ info.json + │ ├─ license1.json + │ ├─ license2.json + ├─ java_installs/ + │ ├─ info.json + │ ├─ app1.jar + │ ├─ app2.jar + ├─ py_installs/ + │ ├─ info.json + │ ├─ app1.tar.gz + │ ├─ app2.tar.gz + ├─ info.json + +``` +
\ No newline at end of file diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md index 955c2a68..7b0af8ea 100644 --- a/docs/en/jsl_lib_imports.md +++ b/docs/en/jsl_lib_imports.md @@ -71,7 +71,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Medical Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `medical.DeIdentification` - [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `medical.AnnotationToolJsonReader` - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `medical.NerDLEvaluation` -- NOTE: Any class which has `Medical` in its name is available, but the `Medical` prefix has been omitted. I.e. `medical.NerModel` maps to `sparknlp_jsl.annotator.MedicalNerModel` +- **NOTE:** Any class which has `Medical` in its name is available, but the `Medical` prefix has been omitted. I.e. `medical.NerModel` maps to `sparknlp_jsl.annotator.MedicalNerModel` - This is achieved via `from sparknlp_jsl.annotator import MedicalNerModel as NerModel` under the hood. - To see all the imports see [the source]() @@ -81,7 +81,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Legal Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `legal.DeIdentification` - [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `legal.AnnotationToolJsonReader` - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `legal.NerDLEvaluation` -- NOTE: Any class which has `Legal` in its name is available, but the `Legal` prefix has been omitted. I.e. `legal.NerModel` maps to `sparknlp_jsl.annotator.LegalNerModel` +- **NOTE:** Any class which has `Legal` in its name is available, but the `Legal` prefix has been omitted. I.e. `legal.NerModel` maps to `sparknlp_jsl.annotator.LegalNerModel` - This is achieved via `from sparknlp_jsl.annotator import LegalNerModel as NerModel` under the hood. - To see all the imports see [the source]() @@ -93,7 +93,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Finance Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) , i.e. `finance.DeIdentification` - [Training Methods](https://nlp.johnsnowlabs.com/docs/en/licensed_training) i.e. `finance.AnnotationToolJsonReader` - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `finance.NerDLEvaluation` -- NOTE: Any class which has `Finance` in its name is available, but the `Finance` prefix has been omitted. I.e. `finance.NerModel` maps to `sparknlp_jsl.annotator.FinanceNerModel` +- **NOTE:** Any class which has `Finance` in its name is available, but the `Finance` prefix has been omitted. I.e. `finance.NerModel` maps to `sparknlp_jsl.annotator.FinanceNerModel` - This is achieved via `from sparknlp_jsl.annotator import FinanceNerModel as NerModel` under the hood. - To see all the imports see [the source]() \ No newline at end of file diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md index 9fa772c4..fcbeafdf 100644 --- a/docs/en/start_sparkseession.md +++ b/docs/en/start_sparkseession.md @@ -24,32 +24,32 @@ Outputs of running `jsl.start()` tell you which jars are loaded and versions of ## Authorization Flow Parameters -Most of the authorization Flows and Parameters of `jsl.install()` +Most of the authorization Flows and Parameters of `jsl.install()` are supported. Review detailed [docs here](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) -| Parameter | Description | Example | Default | -|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| -| `None` | Load license automatically from via one of the **Auto-Detection Mechanisms* | `jsl.start()` | `False` | -| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | +| Parameter | Description | Example | Default | +|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| +| `None` | Load license automatically via one of the **Auto-Detection Mechanisms** | `jsl.start()` | `False` | +| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | | `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](http://nlu.johnsnowlabs.com/docs/en/install#via-access-token) | `jsl.start(access_token='myToken')` | `None` | -| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | -| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | -| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | +| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | +| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | +| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | ### Manually specify License Parameters These can be omitted according to the [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) -| Parameter | Description | -|------------------|----------------------------------------| -| `aws_access_key` | Corresponds to `AWS_ACCESS_KEY_ID` | -| `aws_key_id` | Corresponds to `AWS_SECRET_ACCESS_KEY` | -| `hc_secret` | Corresponds to `HC_SECRET` | -| `ocr_secret` | Corresponds to `OCR_SECRET` | -| `hc_license` | Corresponds to `HC_LICENSE` | -| `ocr_license` | Corresponds to `OCR_LICENSE` | -| `fin_license` | Corresponds to `JSL_LEGAL_LICENSE` | -| `leg_license` | Corresponds to `JSL_FINANCE_LICENSE` | +| Parameter | Description | +|-------------------------|----------------------------------------| +| `aws_access_key` | Corresponds to `AWS_ACCESS_KEY_ID` | +| `aws_key_id` | Corresponds to `AWS_SECRET_ACCESS_KEY` | +| `enterprise_nlp_secret` | Corresponds to `HC_SECRET` | +| `ocr_secret` | Corresponds to `OCR_SECRET` | +| `hc_license` | Corresponds to `HC_LICENSE` | +| `ocr_license` | Corresponds to `OCR_LICENSE` | +| `fin_license` | Corresponds to `JSL_LEGAL_LICENSE` | +| `leg_license` | Corresponds to `JSL_FINANCE_LICENSE` | ## Sparksession Parameters These parameters configure how your spark Session is started up. From 8f43325ecd101e2a138fae22f844473e3fd4e62a Mon Sep 17 00:00:00 2001 From: "Jose J. Martinez" Date: Wed, 5 Oct 2022 02:24:35 +0200 Subject: [PATCH 11/26] Updates installation docs --- docs/en/install.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index a2000811..18514489 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -179,6 +179,8 @@ You can find all of your license information on [https://my.johnsnowlabs.com/sub - `JSL_LEGAL_LICENSE`: Your license for Legal OCR and Legal NLP Features - `JSL_FINANCE_LICENSE` Your license for Finance OCR and Finance NLP Features +NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you may have 1 generic `SPARK_NLP_LICENSE`. + # Installation Examples ## Auth Flow Examples @@ -210,7 +212,7 @@ Where you find the license Path to a JSON containing secrets, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. ```python -jsl.install(secrets_file='my/secret.json') +jsl.install(json_file_path='my/secret.json') ``` ### Via Manually defining Secrets @@ -219,14 +221,14 @@ Manually specify all secrets. Some of these can be omitted, see [License Variabl ```python jsl.install( - hc_license='Your Secret', - enterprise_nlp_secret='Your Secret', - ocr_secret='Your Secret', - ocr_license='Your Secret', - aws_access_key='Your Secret', - aws_key_id='Your Secret', - fin_license='Your Secret', - leg_license='Your Secret', + hc_license='Your HC License', + fin_license='Your FIN License', + leg_license='Your LEG License', + enterprise_nlp_secret='Your NLP Secret', + ocr_secret='Your OCR Secret', + ocr_license='Your OCR License', + aws_access_key='Your Access Key', + aws_key_id='Your Key ID', ) ``` @@ -333,7 +335,7 @@ jsl.install(offline=True) To install in databricks you must provide your `accessToken` and `hostUrl`. You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` , `browser`, `json_file`, or `manually defining secrets` -Your get get it from +Your can get it from ``` python # Create a new Cluster with Spark NLP and all licensed libraries ready to go From ab3d2a00704ee9289d01ea152b57cbd2608b5fff Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Wed, 5 Oct 2022 03:15:17 +0200 Subject: [PATCH 12/26] link updates --- docs/en/install.md | 2 +- docs/en/jsl_home.md | 1 - docs/en/jsl_lib_imports.md | 11 ++++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index a2000811..acda6569 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -19,7 +19,7 @@ pip install johnsnowlabs This installs [Spark-NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart), [NLU](https://nlu.johnsnowlabs.com/) , [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) , [Pyspark](https://spark.apache.org/docs/latest/api/python/) and other open -source [sub-dependencies](TODO link to setup.py). +source [sub-dependencies](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/setup.py). To quickly test the installation, you can run in your Shell: diff --git a/docs/en/jsl_home.md b/docs/en/jsl_home.md index 0c6810e4..8f69b0e1 100644 --- a/docs/en/jsl_home.md +++ b/docs/en/jsl_home.md @@ -17,7 +17,6 @@ Each version of the John Snow Labs library comes with a **hardcoded set of versi It will not accept **library secrets** which correspond to **versions do not match the settings**. This essentially prevents you from installing **outdated** or **new but not deeply tested** libraries, or from shooting yourself in the foot you might say. -[incombatible_lib_secrets.png](TODO) You can work around this protection mechanism, by configuring which version of licensed and open source libraries should be installed and accepted by updating the `jsl.settings` module. diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md index 7b0af8ea..531b5416 100644 --- a/docs/en/jsl_lib_imports.md +++ b/docs/en/jsl_lib_imports.md @@ -30,7 +30,7 @@ The following Functions, Classes and Modules will available in the global namesp - `nlp.T` via `import pyspark.sql.types as T` under the hood - `nlp.SQL` via `import pyspark.sql as SQL` under the hood - `nlp.ML` via `from pyspark import ml as ML` under the hood -- To see all the imports see [the source]() +- To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/nlp.py) ## The **jsl** Module @@ -62,7 +62,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Visual Document Understanding](https://nlp.johnsnowlabs.com/docs/en/ocr_visual_document_understanding) i.e. `ocr.VisualDocumentClassifier` - [Object detectors](https://nlp.johnsnowlabs.com/docs/en/ocr_object_detection) i.e. `ocr.ImageHandwrittenDetector` - [Enums, Structures and helpers](https://nlp.johnsnowlabs.com/docs/en/ocr_structures) i.e. `ocr.Color` -- To see all the imports see [the source]() +- To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/ocr.py) ## The **medical** Module @@ -73,7 +73,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `medical.NerDLEvaluation` - **NOTE:** Any class which has `Medical` in its name is available, but the `Medical` prefix has been omitted. I.e. `medical.NerModel` maps to `sparknlp_jsl.annotator.MedicalNerModel` - This is achieved via `from sparknlp_jsl.annotator import MedicalNerModel as NerModel` under the hood. -- To see all the imports see [the source]() +- To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/medical.py) ## The **legal** Module @@ -83,7 +83,7 @@ The following Functions, Classes and Modules will available in the global namesp - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `legal.NerDLEvaluation` - **NOTE:** Any class which has `Legal` in its name is available, but the `Legal` prefix has been omitted. I.e. `legal.NerModel` maps to `sparknlp_jsl.annotator.LegalNerModel` - This is achieved via `from sparknlp_jsl.annotator import LegalNerModel as NerModel` under the hood. -- To see all the imports see [the source]() +- To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/legal.py) ## The **finance** Module @@ -95,5 +95,6 @@ The following Functions, Classes and Modules will available in the global namesp - [Evaluation Methods](https://nlp.johnsnowlabs.com/docs/en/evaluation), i.e. `finance.NerDLEvaluation` - **NOTE:** Any class which has `Finance` in its name is available, but the `Finance` prefix has been omitted. I.e. `finance.NerModel` maps to `sparknlp_jsl.annotator.FinanceNerModel` - This is achieved via `from sparknlp_jsl.annotator import FinanceNerModel as NerModel` under the hood. -- To see all the imports see [the source]() +- To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/finance.py) +- \ No newline at end of file From 9e69132411e641887e3410d56eee89a31f350081 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Wed, 5 Oct 2022 03:22:57 +0200 Subject: [PATCH 13/26] fix typo --- docs/en/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/install.md b/docs/en/install.md index 9215c324..456b53a4 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -81,7 +81,7 @@ The parameters of `jsl.install()`parameters fall into 3 categories: You can use `jsl.list_remote_licenses()` to list all available licenses in your [my.johnsnowlabs.com/](https://my.johnsnowlabs.com/) account and `jsl.list_local_licenses()` to list all locally cached licenses. -``` + ### Authorization Flows overview From 8a12bd5d34f7e74eca22883be684ee230a74df5e Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Wed, 5 Oct 2022 05:31:41 +0200 Subject: [PATCH 14/26] Custom Version install --- docs/en/jsl_home.md | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/docs/en/jsl_home.md b/docs/en/jsl_home.md index 8f69b0e1..181ea6b2 100644 --- a/docs/en/jsl_home.md +++ b/docs/en/jsl_home.md @@ -18,21 +18,13 @@ It will not accept **library secrets** which correspond to **versions do not mat This essentially prevents you from installing **outdated** or **new but not deeply tested** libraries, or from shooting yourself in the foot you might say. -You can work around this protection mechanism, by configuring which version of licensed and open source libraries should be installed and accepted by updating the -`jsl.settings` module. +You can work around this protection mechanism, by configuring `jsl.settings.enforce_versions=False`. +This will ignore bad secret versions. ```python -#Example of all library versions to configure from johnsnowlabs import * -jsl.settings.raw_version_jsl_lib='1.2.3' -jsl.settings.raw_version_nlp='1.2.3.rc1' -jsl.settings.raw_version_medical='1.2.3rc2' -jsl.settings.raw_version_secret_medical='1.2.3.a3' -jsl.settings.raw_version_secret_ocr='1.2.3.abc' -jsl.settings.raw_version_ocr='1.2.3.abc' -jsl.settings.raw_version_nlu='1.2.3.abc' -jsl.settings.raw_version_pyspark='1.2.3.abc' -jsl.settings.raw_version_nlp_display='1.2.3.abc' +jsl.settings.enforce_versions=False +jsl.install(secret='1.2.3-My.Custom.Secret') ``` From 84a7e4c065e28e81ea646786a6458598cfecb624 Mon Sep 17 00:00:00 2001 From: Lev Date: Wed, 5 Oct 2022 14:35:41 +0300 Subject: [PATCH 15/26] Update h2 title --- docs/_includes/scripts/lib/toc.js | 2 +- docs/_sass/custom.scss | 15 +++++ docs/en/NLU_under_the_hood.md | 4 +- docs/en/concepts.md | 4 +- docs/en/examples.md | 43 +++++------- docs/en/examples_healthcare.md | 45 +++++-------- docs/en/install.md | 72 +++++++++++++++++--- docs/en/jsl_home.md | 5 +- docs/en/jsl_lib_imports.md | 14 +++- docs/en/load_api.md | 4 +- docs/en/model_namespace.md | 14 ++-- docs/en/nlu_for_healthcare.md | 30 +++------ docs/en/nlu_for_ocr.md | 33 +++++---- docs/en/notebooks.md | 60 +++++++++-------- docs/en/predict_api.md | 4 +- docs/en/release_notes.md | 107 ++++++++++++++++++------------ docs/en/start_sparkseession.md | 13 ++-- docs/en/streamlit_viz_examples.md | 78 ++++++++++++---------- docs/en/training.md | 46 ++++++++----- docs/en/utils_for_sparknlp.md | 11 +-- docs/en/viz_examples.md | 29 +++++--- 21 files changed, 369 insertions(+), 264 deletions(-) diff --git a/docs/_includes/scripts/lib/toc.js b/docs/_includes/scripts/lib/toc.js index f8c560ca..407f8e0c 100644 --- a/docs/_includes/scripts/lib/toc.js +++ b/docs/_includes/scripts/lib/toc.js @@ -47,7 +47,7 @@ $root.append($tocUl); $headings.each(function() { var $this = $(this); - $tocUl.append($('
  • ').addClass('toc-' + $this.prop('tagName').toLowerCase()) + $tocUl.append($('
  • ').addClass('toc-' + $this.prop('tagName').toLowerCase() + ' ' + $this.prop('className')) .css("white-space", "normal !important") .append($('
    ').text($this.text()).attr('href', '#' + $this.prop('id')))); }); diff --git a/docs/_sass/custom.scss b/docs/_sass/custom.scss index a88e2686..35a6a4a4 100644 --- a/docs/_sass/custom.scss +++ b/docs/_sass/custom.scss @@ -344,6 +344,7 @@ header { li { margin: 0 0 10px; white-space: normal; + overflow: visible; &.toc-h3 { margin-bottom: 10px; position: relative; @@ -359,6 +360,7 @@ header { font-size: 15px; line-height: 20px; margin: 0; + position: relative; font-weight: normal; color: $color-darkblue; border: none; @@ -370,6 +372,19 @@ header { color: $color-blue; font-weight: bold; } + &.h2-select a { + font-size: 16px; + &:before { + content: ''; + position: absolute; + width: 100%; + height: 1px; + left: 0; + bottom: -3px; + background: #536b76; + display: block; + } + } } } } diff --git a/docs/en/NLU_under_the_hood.md b/docs/en/NLU_under_the_hood.md index 6fc640a7..56df5a1c 100644 --- a/docs/en/NLU_under_the_hood.md +++ b/docs/en/NLU_under_the_hood.md @@ -8,9 +8,7 @@ permalink: /docs/en/under_the_hood modify_date: "2019-05-16" --- -
    - -
    +
    This page acts as reference on the internal working and implementation of NLU. It acts as a reference for internal development and open source contributers. diff --git a/docs/en/concepts.md b/docs/en/concepts.md index 40a2eadc..09877c4d 100644 --- a/docs/en/concepts.md +++ b/docs/en/concepts.md @@ -8,9 +8,7 @@ key: docs-concepts modify_date: "2020-05-08" --- -
    - -
    +
    The NLU library provides 2 simple methods with which most NLU tasks can be solved while achieving state of the art results. The **load** and **predict** method. diff --git a/docs/en/examples.md b/docs/en/examples.md index 8154f5ae..13857ed6 100644 --- a/docs/en/examples.md +++ b/docs/en/examples.md @@ -8,9 +8,7 @@ permalink: /docs/en/examples modify_date: "2019-05-16" --- -
    - -
    +
    ## Usage examples of NLU.load() The following examples demonstrate how to use nlu's load api accompanied by the outputs generated by it. @@ -1043,7 +1041,7 @@ nlu.load('sentence_detector').predict('NLU can detect things. Like beginning and |Like beginning and endings of sentences. | [[0.4970400035381317, -0.013454999774694443, 0...]| [NNP, MD, VB, NNS, ., IN, VBG, CC, NNS, IN, NN...]| [O, O, O, O, O, B-sent, O, O, O, O, O, O, B-se...] | |It can also do much more! | [[0.4970400035381317, -0.013454999774694443, 0...]| [NNP, MD, VB, NNS, ., IN, VBG, CC, NNS, IN, NN...]| [O, O, O, O, O, B-sent, O, O, O, O, O, O, B-se...] | -
    +
    @@ -1064,6 +1062,8 @@ df |------|-------------| | ` Example

    This is an example of a simple HTML page with one paragraph.

    ` |Example This is an example of a simple HTML page with one paragraph.| +
    + ## Word Segmenter [Word Segmenter Example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/japanese_ner_pos_and_tokenization.ipynb) The WordSegmenter segments languages without any rule-based tokenization such as Chinese, Japanese, or Korean @@ -1098,7 +1098,7 @@ df | ませ| | ん| - +
    ## Translation [Translation example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/translation_demo.ipynb) @@ -1129,17 +1129,13 @@ df |-----------|--------------| |Billy likes to go to the mall every sunday | Billy geht gerne jeden Sonntag ins Einkaufszentrum| - - - - +
    ## T5 [Example of every T5 task](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) ### Overview of every task available with T5 [The T5 model](https://arxiv.org/pdf/1910.10683.pdf) is trained on various datasets for 17 different tasks which fall into 8 categories. - 1. Text summarization 2. Question answering 3. Translation @@ -1149,6 +1145,8 @@ df 7. Sentence Completion 8. Word sense disambiguation +
    + ### Every T5 Task with explanation: @@ -1177,8 +1175,7 @@ df - [Every T5 Task example notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) to see how to use every T5 Task. - [T5 Open and Closed Book question answering notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) - - +
    ## Text Summarization [Summarization example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) @@ -1208,6 +1205,7 @@ pipe.predict(data) |------------------|-------| | manchester united face newcastle in the premier league on wednesday . louis van gaal's side currently sit two points clear of liverpool in fourth . the belgian duo took to the dance floor on monday night with some friends . | the belgian duo took to the dance floor on monday night with some friends . manchester united face newcastle in the premier league on wednesday . red devils will be looking for just their second league away win in seven . louis van gaal’s side currently sit two points clear of liverpool in fourth . | +
    ## Binary Sentence similarity/ Paraphrasing [Binary sentence similarity example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) @@ -1242,6 +1240,7 @@ t5.predict(data) |We acted because we saw the existing evidence in a new light , through the prism of our experience on 11 September , " Rumsfeld said .| Rather , the US acted because the administration saw " existing evidence in a new light , through the prism of our experience on September 11 " . | equivalent | | I like to eat peanutbutter for breakfast| I like to play football | not_equivalent | +
    ### How to configure T5 task for MRPC and pre-process text `.setTask('mrpc sentence1:)` and prefix second sentence with `sentence2:` @@ -1254,7 +1253,7 @@ sentence1: We acted because we saw the existing evidence in a new light , throug sentence2: Rather , the US acted because the administration saw " existing evidence in a new light , through the prism of our experience on September 11", ``` - +
    ## Regressive Sentence similarity/ Paraphrasing @@ -1299,12 +1298,12 @@ t5.predict(data) |What was it like in Ancient rome? | What was Ancient rome like?| 5.0 | |What was live like as a King in Ancient Rome?? | What is it like to live in Rome? | 3.2 | +
    ### How to configure T5 task for stsb and pre-process text `.setTask('stsb sentence1:)` and prefix second sentence with `sentence2:` - - +
    ### Example pre-processed input for T5 STSB - Regressive semantic sentence similarity @@ -1314,9 +1313,7 @@ sentence1: What attributes would have made you highly desirable in ancient Rome? sentence2: How I GET OPPERTINUTY TO JOIN IT COMPANY AS A FRESHER?', ``` - - - +
    ## Grammar Checking [Grammar checking with T5 example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb)) @@ -1339,10 +1336,7 @@ pipe.predict(data) | Anna and Mike is going skiing and they is liked is | unacceptable | | Anna and Mike like to dance | acceptable | - - - - +
    ## Open book question answering [T5 Open and Closed Book question answering tutorial](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) @@ -1420,7 +1414,7 @@ surged 5% | How did Alibaba stocks react? | 100 rural teachers | Whom did Jack Ma meet? | Chinese regulators |Who did Jack Ma hide from?| - +
    ## Closed book question answering [T5 Open and Closed Book question answering tutorial](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) @@ -1454,5 +1448,4 @@ nlu.load('en.t5').predict('What is the capital of Germany?') >>> Berlin ``` - - +
    \ No newline at end of file diff --git a/docs/en/examples_healthcare.md b/docs/en/examples_healthcare.md index d4b98cbe..cb1f419e 100644 --- a/docs/en/examples_healthcare.md +++ b/docs/en/examples_healthcare.md @@ -7,9 +7,7 @@ key: docs-examples-hc permalink: /docs/en/examples_hc modify_date: "2019-05-16" --- -
    - -
    +
    ## Usage examples of NLU.load() The following examples demonstrate how to use nlu's load api accompanied by the outputs generated by it. @@ -18,9 +16,7 @@ You need to pass one NLU reference to the load method. You can also pass multiple whitespace separated references. [You can find all NLU references here](https://nlu.johnsnowlabs.com/docs/en/spellbook) - - - +
    ## Medical Named Entity Recognition (NER) [Medical NER tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/medical_named_entity_recognition/overview_medical_entity_recognizers.ipynb) @@ -48,6 +44,8 @@ df = nlu.load('med_ner.jsl.wip.clinical en.resolve_chunk.cpt_clinical').predict( See the [Models Hub for all avaiable Entity Resolution Models](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition) +
    + ## Entity Resolution (for sentences) [Entity Resolution tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/entity_resolution/entity_resolvers_overview.ipynb) @@ -67,8 +65,7 @@ data = ["""He has a starvation ketosis but nothing found for significant for dry See the [Models Hub for all avaiable Entity Resolution Models](https://nlp.johnsnowlabs.com/models?task=Entity+Resolution) - - +
    ## Entity Resolution (for chunks) [Entity Resolution tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/entity_resolution/entity_resolvers_overview.ipynb) @@ -95,10 +92,9 @@ df = nlu.load('med_ner.jsl.wip.clinical en.resolve_chunk.cpt_clinical').predict( | for 2 days | Duration | 0.5479 | 35390 | for 2 days | 2.3929 | 1 | 35390 | 2.3929 | 0.22 | - - See the [Models Hub for all avaiable Entity Resolution Models](https://nlp.johnsnowlabs.com/models?task=Entity+Resolution) +
    ## Relation Extraction [Relation Extraction tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/relation_extraction/overview_relation.ipynb) @@ -150,12 +146,7 @@ df = nlu.load('en.med_ner.jsl.wip.clinical.greedy en.relation').predict(data) | MRI demonstrated infarction in the upper brain stem , left cerebellum and right basil ganglia" | 0 | Internal_organ_or_component | Internal_organ_or_component | cerebellum | basil ganglia | 0.975779 | ['MRI', 'infarction', 'upper', 'brain stem', 'left', 'cerebellum', 'right', 'basil ganglia'] | ['Test', 'Disease_Syndrome_Disorder', 'Direction', 'Internal_organ_or_component', 'Direction', 'Internal_organ_or_component', 'Direction', 'Internal_organ_or_component'] | ['0.9979', '0.5062', '0.2152', '0.2636', '0.4775', '0.8135', '0.5086', '0.3236'] | | MRI demonstrated infarction in the upper brain stem , left cerebellum and right basil ganglia" | 1 | Direction | Internal_organ_or_component | right | basil ganglia | 0.999613 | ['MRI', 'infarction', 'upper', 'brain stem', 'left', 'cerebellum', 'right', 'basil ganglia'] | ['Test', 'Disease_Syndrome_Disorder', 'Direction', 'Internal_organ_or_component', 'Direction', 'Internal_organ_or_component', 'Direction', 'Internal_organ_or_component'] | ['0.9979', '0.5062', '0.2152', '0.2636', '0.4775', '0.8135', '0.5086', '0.3236'] | - - - - - - +
    ## Assertion [Assertion tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/assertion/assertion_overview.ipynb) @@ -174,6 +165,7 @@ assert_df = nlu.load('en.med_ner.clinical en.assert ').predict(data) See the [Models Hub for all avaiable Assertion Models](https://nlp.johnsnowlabs.com/models?task=Assertion+Status) +
    ## De-Identification [De-Identification tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/de_identification/DeIdentification_model_overview.ipynb) @@ -192,6 +184,7 @@ df = nlu.load('de_identify').predict(data) See the [Models Hub for all avaiable De-Identification Models](https://nlp.johnsnowlabs.com/models?task=De-identification) +
    ## Drug Normalizer [Drug Normalizer tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/drug_normalization/drug_norm.ipynb) @@ -217,6 +210,7 @@ nlu.load('norm_drugs').predict(data) | interferon alfa - 2b 10000000 unt ( 1 ml ) injection | interferon alfa-2b 10 million unit ( 1 ml ) injec | | Sodium Chloride / Potassium Chloride 13 bag | Sodium Chloride/Potassium Chloride 13bag | +
    ## Rule based NER with Context Matcher [Rule based NER with context matching tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/Training/rule_based_named_entity_recognition_and_resolution/rule_based_NER_and_resolution_with_context_matching.ipynb) @@ -270,6 +264,8 @@ gender_NER_pipe.predict(sample_text) | girl | 0.13 | | girl | 0.13 | +
    + ### Context Matcher Parameters You can define the following parameters in your rules.json file to define the entities to be matched @@ -290,20 +286,20 @@ You can define the following parameters in your rules.json file to define the en | completeMatchRegex | `Optional[str]`| Wether to use complete or partial matching, either `"true"` or `"false"` | | ruleScope | `str` | currently only `sentence` supported | - - - - +
    ## Authorize access to licensed features and install healthcare dependencies You need a set of **credentials** to access the licensed healthcare features. [You can grab one here](https://www.johnsnowlabs.com/spark-nlp-try-free/) +
    ### Automatically Authorize Google Colab via JSON file By default, nlu checks `/content/spark_nlp_for_healthcare.json` on google colabe enviroments for a `spark_nlp_for_healthcare.json` file that you recieve via E-mail from us. If you upload the `spark_nlp_for_healthcare.json` file to the standard colab directory, `nlu.load()` will automatically find it and authorize your enviroment. +
    + ### Authorize anywhere via providing via JSON file You can specify the location of your `spark_nlp_for_healthcare.json` like this : ```python @@ -311,6 +307,7 @@ path = '/path/to/spark_nlp_for_healthcare.json' nlu.auth(path).load('licensed_model').predict(data) ``` +
    ### Authorize via providing String parameters ```python @@ -321,12 +318,6 @@ AWS_SECRET_ACCESS_KEY = 'YOUR_SECRETS' JSL_SECRET = 'YOUR_SECRETS' nlu.auth(SPARK_NLP_LICENSE,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,JSL_SECRET) - - ``` - - - - - +
    \ No newline at end of file diff --git a/docs/en/install.md b/docs/en/install.md index 456b53a4..c00e87c3 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -8,7 +8,7 @@ modify_date: "2020-05-26" header: true --- -
    +
    To install the johnsnowlabs Python library and all of John Snow Labs open **source libraries**, just run @@ -65,7 +65,10 @@ After clicking **Authorize**: - Windows Users must additionally follow every step precisely defined in [How to correctly install Spark NLP for Windows?](https://nlp.johnsnowlabs.com/docs/en/install#windows-support) -# Install Licensed Libraries +
    + +{:.h2-select} +## Install Licensed Libraries The following is a more detailed overview of the alternative installation methods and parameters you can use. The parameters of `jsl.install()`parameters fall into 3 categories: @@ -76,12 +79,14 @@ The parameters of `jsl.install()`parameters fall into 3 categories: or `target Python Environment` - **Installation process tweaks** +
    ### List all of your accessible Licenses You can use `jsl.list_remote_licenses()` to list all available licenses in your [my.johnsnowlabs.com/](https://my.johnsnowlabs.com/) account and `jsl.list_local_licenses()` to list all locally cached licenses. +
    ### Authorization Flows overview @@ -105,6 +110,8 @@ access to. Licenses are locally numbered in order they have been provided, for m | **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
    Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | | Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | +
    + ### Optional Auth Flow Parameters Use these parameters to configure **how to authorize** @@ -117,6 +124,8 @@ Use these parameters to configure **how to authorize** | `store_in_jsl_home` | By default license data and Jars/Wheels are stored in in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify it once authorized again.
    Set to `False` to disable this caching behaviour.
    | | `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False` | +
    + ### Optional Installation Target Parameters Use these parameters to configure **where** to install to @@ -128,6 +137,7 @@ Use these parameters to configure **where** to install to | `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installsl`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | | `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for me details | +
    ### Optional Installation Process Parameters @@ -144,6 +154,8 @@ Use these parameters to configure **what should** be installed to the target | `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | | `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses** | +
    + ### Automatic Databricks Installation Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install @@ -161,6 +173,8 @@ all Jars, Wheels and License Information to run all features in a Databricks clu Where to find your Databricks Access Token: ![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) +
    + ### License Variables Names for JSON and OS variables The following variable names are checked when using a JSON or environment variables based approach for installing @@ -181,11 +195,14 @@ You can find all of your license information on [https://my.johnsnowlabs.com/sub NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you may have 1 generic `SPARK_NLP_LICENSE`. -# Installation Examples +
    + +{:.h2-select} +## Installation Examples -## Auth Flow Examples +### Auth Flow Examples -### Via Auto Detection & Browser Login +#### Via Auto Detection & Browser Login All [default search locations ]() are searched, if any credentials are found they will be used used. If no credentials are auto-detected, a Browser Window will pop up, asking to Authroize yourself @@ -196,7 +213,9 @@ In Google Colab, a clickable button will appear, which will make a window pop up jsl.install() ``` -### Via Access Token +
    + +#### Via Access Token Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) @@ -207,7 +226,9 @@ jsl.install(access_token='secret') Where you find the license ![access_token1.png](/assets/images/jsl_lib/install/access_token1.png) -### Via Json Secrets file +
    + +#### Via Json Secrets file Path to a JSON containing secrets, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. @@ -215,7 +236,9 @@ Path to a JSON containing secrets, see [License Variable Names](https://nlu.john jsl.install(json_file_path='my/secret.json') ``` -### Via Manually defining Secrets +
    + +#### Via Manually defining Secrets Manually specify all secrets. Some of these can be omitted, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. @@ -232,6 +255,8 @@ jsl.install( ) ``` +
    + ## Installation Target Examples ### Into Current Python Process @@ -242,6 +267,8 @@ Uses sys.executable by default, i.e. the Python that is currently running the pr jsl.install() ``` +
    + ### Into Custom Python Env Using specific python executable, which is not the currently running python. @@ -251,6 +278,9 @@ Will use the provided python's executable pip module to installl libraries jsl.install(python_exec_path='my/python.exe') ``` +
    + + ### Into freshly created venv Create a new Venv from scratch, using the currently exectuing Pythons Venv Modulle @@ -259,6 +289,8 @@ Create a new Venv from scratch, using the currently exectuing Pythons Venv Modul jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') ``` +
    + ### Into Airgap/Offline Installation (Automatic) Create a Zip with all Jars/Wheels/Licenses you need to run all libraries in an offline environment. @@ -319,6 +351,8 @@ from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` +
    + ### Into Airgap/Offline Manual Download all files yourself from the URLS printed by jsl.install(). @@ -330,6 +364,8 @@ I.e. provide the files somehow on your offline machine. jsl.install(offline=True) ``` +
    + ### Into a freshly created Databricks cluster To install in databricks you must provide your `accessToken` and `hostUrl`. @@ -342,14 +378,18 @@ Your can get it from jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) ``` +
    -# Storage of License Data and License Search behaviour +{:.h2-select} +## Storage of License Data and License Search behaviour The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . After having provided license data once, you don't need to specify it again since the cached licensed will be used. Use the `license_number` parameter to switch between multiple licenses. Note: Locally cached licenses are numbered in the order they have been provided, starting at 0 +
    + ## List all available licenses This shows you all licenses for your account in https://my.johnsnowlabs.com/ @@ -359,6 +399,8 @@ Use this to decide which license number to install when installing via browser o jsl.list_remote_licenses() ``` +
    + ## List all locally cached licenses Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license @@ -368,6 +410,8 @@ you want to load. jsl.list_local_licenses() ``` +
    + ## License Search precedence If there are multiples possible sources for licenses, the following order takes precedence @@ -382,6 +426,8 @@ If there are multiples possible sources for licenses, the following order takes JSON files are scanned if they have any keys that match up with names of secrets. Name of the json file does not matter, file just needs to end with .json +
    + ## Upgrade Flow The John Snow Labs Teams are working early to push out new Releases and Features each week! @@ -390,18 +436,24 @@ Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again. They will be used to fetch the latest licensed library and install them to your target +
    + ## How to setup Java 8 - [Setup Java 8 on Windows](https://access.redhat.com/documentation/en-us/openjdk/8/html/openjdk_8_for_windows_getting_started_guide/getting_started_with_openjdk_for_windows) - [Setup Java 8 on Linux](https://openjdk.java.net/install/) - [Setup Java 8 on Mac](https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html) +
    + ### Join our Slack channel Join our channel, to ask for help and share your feedback. Developers and users can help each other get started here. [NLU Slack](https://spark-nlp.slack.com/archives/C0196BQCDPY){:.button.button--info.button--rounded.button--md} +
    + ### Where to go next If you want to get your hands dirty with any of the features check out the [NLU examples page](examples), @@ -417,4 +469,4 @@ Detailed information about Johnsnowlabs Libraries APIs, concepts, components and - [The NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) - [NLU Notebooks](notebooks) -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/jsl_home.md b/docs/en/jsl_home.md index 8f69b0e1..bb1470cc 100644 --- a/docs/en/jsl_home.md +++ b/docs/en/jsl_home.md @@ -8,7 +8,7 @@ modify_date: "2020-05-26" header: true --- -
    +
    @@ -35,6 +35,7 @@ jsl.settings.raw_version_pyspark='1.2.3.abc' jsl.settings.raw_version_nlp_display='1.2.3.abc' ``` +
    ## John Snow Labs Home Cache Folder The John Snow Labs library maintains a home folder in `~/.johnsnowlabs` which contains all your Licenses, Jars for Java and Wheels for Python to install and run any feature. @@ -58,4 +59,4 @@ Additionally, each directory has an `info.json` file, telling you more about Spa ├─ info.json ``` -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/jsl_lib_imports.md b/docs/en/jsl_lib_imports.md index 531b5416..00604791 100644 --- a/docs/en/jsl_lib_imports.md +++ b/docs/en/jsl_lib_imports.md @@ -8,7 +8,7 @@ modify_date: "2020-05-26" header: true --- -
    +
    The John Snow Labs Python library gives you a clean and easy way to structure your Python projects. The very first line of a project should be: @@ -21,6 +21,8 @@ many handy utility imports. The following Functions, Classes and Modules will available in the global namespace +
    + ## The **nlp** Module ------------------- `nlp` module with classes and methods from [Spark NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart) like `nlp.BertForSequenceClassification` and `nlp.map_annotations()` @@ -32,6 +34,7 @@ The following Functions, Classes and Modules will available in the global namesp - `nlp.ML` via `from pyspark import ml as ML` under the hood - To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/nlp.py) +
    ## The **jsl** Module @@ -43,6 +46,7 @@ The following Functions, Classes and Modules will available in the global namesp - `jsl.viz_streamlit()` and other `jsl.viz_streamlit_xyz for using any of the 10k+ pretrained models in 0 lines of code with an [interactive Streamlit GUI and re-usable and stackable Streamlit Components](https://nlu.johnsnowlabs.com/docs/en/streamlit_viz_examples) - `jsl.to_pretty_df()` for predicting on raw strings getting a nicely structures Pandas DF from a Spark Pipeline using [nlu.to_pretty_df()](https://nlu.johnsnowlabs.com/docs/en/utils_for_spark_nlp) under the hood +
    ## The **viz** Module @@ -53,6 +57,7 @@ The following Functions, Classes and Modules will available in the global namesp - `viz.EntityResolverVisualizer` for visualizing prediction outputs of EntityResolver based Spark Pipelines - `viz.AssertionVisualizer` for visualizing prediction outputs of Assertion based Spark Pipelines +
    ## The **ocr** Module @@ -64,6 +69,8 @@ The following Functions, Classes and Modules will available in the global namesp - [Enums, Structures and helpers](https://nlp.johnsnowlabs.com/docs/en/ocr_structures) i.e. `ocr.Color` - To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/ocr.py) +
    + ## The **medical** Module @@ -75,6 +82,8 @@ The following Functions, Classes and Modules will available in the global namesp - This is achieved via `from sparknlp_jsl.annotator import MedicalNerModel as NerModel` under the hood. - To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/medical.py) +
    + ## The **legal** Module `legal` module with annotator classes and methods from [Spark NLP for Legal](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) like `legal.RelationExtractionDL` and `legal.profile()` @@ -85,6 +94,7 @@ The following Functions, Classes and Modules will available in the global namesp - This is achieved via `from sparknlp_jsl.annotator import LegalNerModel as NerModel` under the hood. - To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/legal.py) +
    ## The **finance** Module @@ -97,4 +107,4 @@ The following Functions, Classes and Modules will available in the global namesp - This is achieved via `from sparknlp_jsl.annotator import FinanceNerModel as NerModel` under the hood. - To see all the imports see [the source](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/johnsnowlabs/finance.py) - -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/load_api.md b/docs/en/load_api.md index 48981822..9c708a7a 100644 --- a/docs/en/load_api.md +++ b/docs/en/load_api.md @@ -8,9 +8,7 @@ key: docs-developers modify_date: "2020-05-08" --- -
    - -
    +
    The nlu.load() method takes in one or multiple NLU pipeline, model or component references separated by whitespaces. See [the NLU spellbook]( /docs/en/spellbook) for an overview of all possible NLU references. diff --git a/docs/en/model_namespace.md b/docs/en/model_namespace.md index f69d214e..39f9649f 100644 --- a/docs/en/model_namespace.md +++ b/docs/en/model_namespace.md @@ -8,11 +8,7 @@ key: docs-spellbook modify_date: "2020-05-08" --- -
    - -
    - - +
    ## Default Component References @@ -1734,7 +1730,7 @@ wrapped inside of a NLU Pipeline. | Multilingual | [xx.classify.lang.21](https://nlp.johnsnowlabs.com/2020/12/05/detect_language_21_xx.html) | [detect_language_21](https://nlp.johnsnowlabs.com/2020/12/05/detect_language_21_xx.html) | | Multilingual | [xx.classify.lang.20](https://nlp.johnsnowlabs.com) | [detect_language_20](https://nlp.johnsnowlabs.com) | -
    +
    @@ -2055,9 +2051,7 @@ wrapped inside of a NLU Pipeline. | [Portuguese](https://iso639-3.sil.org/code/por) | [pt.med_ner.deid.subentity](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_subentity_pt_3_0.html) | [ner_deid_subentity](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_subentity_pt_3_0.html) | | [Portuguese](https://iso639-3.sil.org/code/por) | [pt.med_ner.deid.generic](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | [ner_deid_generic](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | -
    - - +
    ## Healthcare Pipeline references @@ -2083,3 +2077,5 @@ wrapped inside of a NLU Pipeline. | [English](https://iso639-3.sil.org/code/eng) | [en.explain_doc.carp](https://nlp.johnsnowlabs.com/2021/04/01/explain_clinical_doc_carp_en.html) | [explain_clinical_doc_carp](https://nlp.johnsnowlabs.com/2021/04/01/explain_clinical_doc_carp_en.html) | | [French](https://iso639-3.sil.org/code/fra) | [fr.deid_obfuscated](https://nlp.johnsnowlabs.com/2022/03/04/clinical_deidentification_fr_2_4.html) | [clinical_deidentification](https://nlp.johnsnowlabs.com/2022/03/04/clinical_deidentification_fr_2_4.html) | | [Moldavian, Moldovan, Romanian](https://iso639-3.sil.org/code/ron) | [ro.deid.clinical](https://nlp.johnsnowlabs.com/2022/06/28/clinical_deidentification_ro_3_0.html) | [clinical_deidentification](https://nlp.johnsnowlabs.com/2022/06/28/clinical_deidentification_ro_3_0.html) | + +
    \ No newline at end of file diff --git a/docs/en/nlu_for_healthcare.md b/docs/en/nlu_for_healthcare.md index fe3dd8b9..e1079f50 100644 --- a/docs/en/nlu_for_healthcare.md +++ b/docs/en/nlu_for_healthcare.md @@ -6,9 +6,7 @@ key: docs-nlu-for-healthcare permalink: /docs/en/nlu_for_healthcare modify_date: "2019-05-16" --- -
    - -
    +
    This page gives you an overview of every healthcare problem and domain that can be solved with NLU for healthcare models, together with concrete examples. See [this notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/healthcare_webinar/NLU_healthcare_webinar.ipynb) @@ -56,6 +54,7 @@ This algorithm is provided by **Spark NLP for Healthcare's** [MedicalNerModel]( | [Radiology Clinical
    JSL-V2](https://nlp.johnsnowlabs.com/2021/04/01/jsl_rd_ner_wip_greedy_clinical_en.html) | Find radiology
    related entities in clinical setting |`med_ner.jsl.wip.clinical.rd` | | `Kidney_Disease`, `HDL`, `Diet`, `Test`, `Imaging_Technique`,
    `Triglycerides`, `Obesity`, `Duration`, `Weight`,
    `Social_History_Header`, `ImagingTest`, `Labour_Delivery`,
    `Disease_Syndrome_Disorder`,
    `Communicable_Disease`, `Overweight`,
    `Units`, `Smoking`,
    `Score`, `Substance_Quantity`,
    `Form`, `Race_Ethnicity`,
    `Modifier`, `Hyperlipidemia`, `ImagingFindings`,
    `Psychological_Condition`, `OtherFindings`,
    `Cerebrovascular_Disease`, `Date`, `Test_Result`,
    `VS_Finding`, `Employment`,
    `Death_Entity`, `Gender`, `Oncological`,
    `Heart_Disease`, `Medical_Device`,
    `Total_Cholesterol`, `ManualFix`,
    `Time`, `Route`, `Pulse`,
    `Admission_Discharge`, `RelativeDate`
    , `O2_Saturation`, `Frequency`,
    `RelativeTime`, `Hypertension`, `Alcohol`,
    `Allergen`, `Fetus_NewBorn`,
    `Birth_Entity`, `Age`,
    `Respiration`, `Medical_History_Header`,
    `Oxygen_Therapy`, `Section_Header`, `LDL`,
    `Treatment`, `Vital_Signs_Header`, `Direction`,
    `BMI`, `Pregnancy`,
    `Sexually_Active_or_Sexual_Orientation`, `Symptom`,
    `Clinical_Dept`, `Measurements`,
    `Height`, `Family_History_Header`,
    `Substance`,
    `Strength`,
    `Injury_or_Poisoning`,
    `Relationship_Status`,
    `Blood_Pressure`, `Drug`, `Temperature, ` ,
    `EKG_Findings`, `Diabetes`, `BodyPart`,
    `Vaccine`, `Procedure`, `Dosage` | [Dataset by John Snow Labs](https://www.johnsnowlabs.com/data/), | [General
    Medical Terms ](https://nlp.johnsnowlabs.com/2021/04/01/ner_medmentions_coarse_en.html) | Find general medical terms
    and medical entities. |`med_ner.medmentions` | | `Qualitative_Concept`, `Organization`, `Manufactured_Object`,
    `Amino_Acid`, `Peptide_or_Protein`,
    `Pharmacologic_Substance`, `Professional_or_Occupational_Group`,
    `Cell_Component`, `Neoplastic_Process`, `Substance`, `Laboratory_Procedure`,
    `Nucleic_Acid_Nucleoside_or_Nucleotide`,
    `Research_Activity`, `Gene_or_Genome`, `Indicator_Reagent_or_Diagnostic_Aid`,
    `Biologic_Function`, `Chemical`, `Mammal`,
    `Molecular_Function`, `Quantitative_Concept`,
    `Prokaryote`, `Mental_or_Behavioral_Dysfunction`,
    `Injury_or_Poisoning`, `Body_Location_or_Region`,
    `Spatial_Concept`, `Nucleotide_Sequence`,
    `Tissue`, `Pathologic_Function`,
    `Body_Substance`, `Fungus`, `Mental_Process`,
    `Medical_Device`, `Plant`, `Health_Care_Activity`,
    `Clinical_Attribute`, `Genetic_Function`,
    `Food`, `Therapeutic_or_Preventive_Procedure`,
    `Body_Part_Organ`,
    `Organ_Component`, `Geographic_Area`, `Virus`,
    `Biomedical_or_Dental_Material`, `Diagnostic_Procedure`, `Eukaryote`,
    `Anatomical_Structure`, `Organism_Attribute`,
    `Molecular_Biology_Research_Technique`, `Organic_Chemical`, `Cell`,
    `Daily_or_Recreational_Activity`,
    `Population_Group`, `Disease_or_Syndrome`,
    `Group`, `Sign_or_Symptom`, `Body_System` | [MedMentions](https://arxiv.org/abs/1902.09476) +
    ## Entity Status Assertion Named Entities extracted by an NER model can be further classified into sub-classes or statuses, depending on the context of the sentence. See the following two examples : @@ -76,8 +75,7 @@ Keep in mind: This is a simplified example, entities should actually be mapped t This algorithm is provided by **Spark NLP for Healthcare's** [AssertionDLModel](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators#assertiondl) -
    -
    +
    {:.table2} | Domain | Description |Spell | Predicted Entities | Examples | Reference Dataset | @@ -87,15 +85,7 @@ This algorithm is provided by **Spark NLP for Healthcare's** [AssertionDLModel] | [Healthcare/Clinical JSL powerd](https://nlp.johnsnowlabs.com/2021/07/24/assertion_jsl_large_en.html) | Predict status of Healthcare/Clinical related entities.
    Additional training with JSL Dataset |`assert.jsl_large` | `present`, `absent`, `possible`, `planned`, `someoneelse`, `past` | - `present`: Patient diagnosed with `cancer` in 1999
    - `absent`: No sign of `cancer` was shown by the scans
    - `possible`: Tests indicate patient might have `cancer`
    - `planned`: `CT-Scan` is scheduled for 23.03.1999
    - `someoneelse`: The patient gave `Aspirin` to daugther
    - `past`: The patient has no more `headaches` since the operation |[2010 i2b2](https://portal.dbmi.hms.harvard.edu/projects/n2c2-nlp/) + [Data provided by JSL](https://www.johnsnowlabs.com/welcome-to-the-healthcare-data-library/) | [Healthcare/Clinical classic](https://nlp.johnsnowlabs.com/2021/07/24/assertion_jsl_en.html) | Predict status of Healthcare/Clinical related entities |`assert.biobert` | `present` , `absent`, `possible`, `conditional`, `associated_with_someone_else` ,`hypothetical` | - `present`: Patient diagnosed with `cancer` in 1999
    - `absent`: No sign of `cancer` was shown by the scans
    - `possible`: Tests indicate patient might have `cancer`
    - `conditional` If the test is positive, patient has `AIDS`
    - `associated_with_someone_else`: The patients father has `cancer`.
    -`hypothetical` :`Death` could be possible. |[2010 i2b2](https://portal.dbmi.hms.harvard.edu/projects/n2c2-nlp/) -
    -
    - - - -
    - -
    - +
    ## Entity Resolution **Named entities** are sub-strings in a text that can be classified into catogires of a domain. For example, in the String @@ -136,8 +126,7 @@ This algorithm is provided by **Spark NLP for Healthcare's** [SentenceEntitiyRe | [SNOMED Conditions ](https://nlp.johnsnowlabs.com/2021/08/28/sbertresolve_snomed_conditions_en.html) | Get `SNOMED Conditions` codes of `Medical and Clinical Entities`.
    |`resolve.snomed_conditions` | `schizophrenia` | `58214004` | [SNOMED](http://www.snomed.org/) | [RxNorm
    and RxCUI
    (Concept Uinque Indentifier)](https://nlp.johnsnowlabs.com/2021/05/16/sbiobertresolve_rxcui_en.html) | Get Normalized `RxNorm` and `RxCUI` codes of `Medical, Clinical and Drug Entities`.
    |`resolve.rxnorm` | `50 mg of eltrombopag oral` | `825427` | [[RxNorm Overview]](https://www.nlm.nih.gov/research/umls/rxnorm/overview.html#:~:text=An%20RXCUI%20is%20a%20machine,scope%20receive%20RxNorm%20normalized%20names.) [[November 2020 RxNorm Clinical Drugs ontology graph]](https://www.nlm.nih.gov/pubs/techbull/nd20/brief/nd20_rx_norm_november_release.html) | -
    -
    +
    ## Entity Relationship Extraction Most sentences and documents have a lof of `entities` which can be extracted with NER. These entities alone already provide a lot of insight and information about your data, but there is even more information extractable... @@ -169,8 +158,7 @@ Keep in mind: This is a simplified example, entities should actually be mapped t These algorithms are provided by **Spark NLP for Healthcare's** [RelationExtraction](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators#relationextraction) and [RelationExtractionDL](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators#relationextractiondl) - - +
    ### Entity Relationship Extraction - Overview @@ -189,8 +177,7 @@ These algorithms are provided by **Spark NLP for Healthcare's** [RelationExtrac | [Posology
    (Drugs, Dosage,
    Duration, Frequency,
    Strength)](https://demo.johnsnowlabs.com/healthcare/RE_POSOLOGY/) | Predict multi-class posology relationships between
    **Drug Entities**,**Dosage Entities**,
    **Strength Entities**,**Route Entities**,
    **Form Entities**, **Duration Entities** and **Frequency Entities** |**relation.posology** | - **DRUG-ADE** if **Problem Entity** Adverse effect of **Drug Entity**
    - **DRUG-DOSAGE** if **Dosage Entity** refers to a **Drug Entity**
    - **DRUG-DURATION** if **Duration Entity** refers to a **Drug Entity**
    - **DRUG-FORM** if **Mode/Form Entity** refers to intake form of **Drug Entity**
    - **DRUG-FREQUENCY** if **Frequency Entity** refers to usage of **Drug Entity**
    - **DRUG-REASON** if **Problem Entity** is reason for taking **Drug Entity**
    - **DRUG-ROUTE** if **Route Entity** refer to administration method of **Drug Entity**
    - **DRUG-STRENGTH** if **Strength Entity** refers to **Drug Entity** | [Chemicals and Proteins](https://nlp.johnsnowlabs.com/2021/07/24/redl_chemprot_biobert_en.html) | Predict Regulator, Upregulator, Downregulator, Agonist,
    Antagonist, Modulator, Cofactor,
    Substrate relationships between
    **Chemical Entities** and **Protein Entities** |**relation.chemprot** | - **CPR:1** if **One ChemProt Entity** is **Part of** of **Another ChemProt Entity**
    - **CPR:2** if **One ChemProt Entity** is **Regulator (Direct or Indirect)** of **Another ChemProt Entity**
    - **CPR:3** if **One ChemProt Entity** is **Upregulator/Activator/Indirect Upregulator** of **Another ChemProt Entity**
    - **CPR:4** if **One ChemProt Entity** is **Downregulator/Inhibitor/Indirect Downregulator** of **Another ChemProt Entity**
    - **CPR:5** if **One ChemProt Entity** is **Agonist** of **Another ChemProt Entity**
    - **CPR:6** if **One ChemProt Entity** is **Antagonist** of **Another ChemProt Entity**
    - **CPR:7** if **One ChemProt Entity** is **Modulator (Activator/Inhibitor)** of **Another ChemProt Entity**
    - **CPR:8** if **One ChemProt Entity** is **Cofactor** of **Another ChemProt Entity**
    - **CPR:9** if **One ChemProt Entity** is **Substrate and product of** of **Another ChemProt Entity**
    - **CPR:10** if **One ChemProt Entity** is **Not Related** to **Another ChemProt Entity** -
    -
    +
    ### Entity Relationship Extraction - Examples @@ -209,5 +196,4 @@ These algorithms are provided by **Spark NLP for Healthcare's** [RelationExtrac | [Posology
    (Drugs, Dosage,
    Duration, Frequency,
    Strength)](https://demo.johnsnowlabs.com/healthcare/RE_POSOLOGY/) | - **DRUG-ADE**: had a **headache** after taking **Paracetamol**
    - **DRUG-DOSAGE**: took **0.5ML** of** Celstone**
    - **DRUG-DURATION**: took **Aspirin** daily **for two weeks**
    - **DRUG-FORM**: took **Aspirin** as **tablets**
    - **DRUG-FREQUENCY** : **Aspirin** usage is **weekly**
    - **DRUG-REASON** : Took **Aspirin** because of **headache**
    - **DRUG-ROUTE**: **Aspirin** taken **orally**
    - **DRUG-STRENGTH**: **2mg** of **Aspirin** | - **DRUG-ADE** for **headache** and **Paracetamol**
    - **DRUG-DOSAGE** for **0.5ML** and ** Celstone**
    - **DRUG-DURATION** for **Aspirin** and **for two weeks**
    - **DRUG-FORM** for **Aspirin** and **tablets**
    - **DRUG-FREQUENCY** for **Aspirin** and **weekly**
    - **DRUG-REASON** for **Aspirin** and **headache**
    - **DRUG-ROUTE** for **Aspirin** and **orally**
    - **DRUG-STRENGTH** for **2mg** and **Aspirin** | [Magge, Scotch, Gonzalez-Hernandez (2018)](http://proceedings.mlr.press/v90/magge18a.html) | [Chemicals and Proteins](https://nlp.johnsnowlabs.com/2021/07/24/redl_chemprot_biobert_en.html) | - **CPR:1 (Part of)** : The **amino acid** sequence of the **rabbit alpha(2A)-adrenoceptor** has many interesting properties.
    - **CPR:2 (Regulator)** : **Triacsin** inhibited **ACS** activity
    - **CPR:3 (Upregulator)** : **Ibandronate** increases the expression of the **FAS gene**
    - **CPR:4 (Downregulator)** : **Vitamin C** treatment resulted in reduced **C-Rel** nuclear translocation
    - **CPR:5 (Agonist)** : Reports show **tricyclic antidepressants** act as agnonists at distinct **opioid receptors**
    - **CPR:6 (Antagonist)** : **GDC-0152** is a drug triggers tumor cell apoptosis by selectively antagonizing **LAPs**
    - **CPR:7 (Modulator)** : **Hydrogen sulfide** is a allosteric modulator of **ATP-sensitive potassium channels**
    - **CPR:8 (Cofactor)** : **polyinosinic:polycytidylic acid ** and the **IFNα/β** demonstrate capability of endogenous IFN.
    - **CPR:9 (Substrate)** : **ZIP9** plays an important role in the transport and toxicity of **Cd(2+) cells**
    - **CPR:10 (Not Related) **: Studies indicate that **GSK-3β** inhibition by palinurin cannot be competed out by **ATP** | - **CPR:1 (Part of)** for **amino acid** and **rabbit alpha(2A)-adrenoceptor**
    - **CPR:2 (Regulator)** for **Triacsin** and **ACS**
    - **CPR:3 (Upregulator)** for **Ibandronate** and **FAS gene**
    - **CPR:4 (Downregulator)** for **Vitamin C** and **C-Rel**
    - **CPR:5 (Agonist)** for **tricyclic antidepressants** and **opioid receptors**
    - **CPR:6 (Antagonist) (Antagonist)** for **GDC-0152** and **LAPs**
    - **CPR:7 (Modulator)** for **Hydrogen sulfide** and **ATP-sensitive potassium channels**
    - **CPR:8 (Cofactor)** for **polyinosinic:polycytidylic acid ** and **IFNα/β**
    - **CPR:9 (Substrate)** for **ZIP9** and **Cd(2+) cells**
    - **CPR:10 (Not Related) ** for **GSK-3β** and **ATP** | [ChemProt](https://biocreative.bioinformatics.udel.edu/) [Paper](https://academic.oup.com/database/article/doi/10.1093/database/baz054/5498050) -
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/nlu_for_ocr.md b/docs/en/nlu_for_ocr.md index 995401c4..c335fa83 100644 --- a/docs/en/nlu_for_ocr.md +++ b/docs/en/nlu_for_ocr.md @@ -6,7 +6,7 @@ key: docs-nlu-for-ocr permalink: /docs/en/nlu_for_ocr modify_date: "2019-05-16" --- -
    +
    This page gives you an overview of every OCR model in NLU which are provided by [Spark @@ -19,9 +19,7 @@ Additionally you can refer to the OCR tutorial Notebooks - [OCR Tutorial for extracting `Tables` from Image/PDF/DOC(X) files ](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/ocr/table_extraction.ipynb.ipynb) [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/ocr/table_extraction.ipynb) -
    - -
    +
    ## Overview of all OCR features @@ -45,7 +43,7 @@ containing Pandas DataFrame for every table detected | nlu.load(`ppt2table`) | [PptToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#ppttotexttable) | | nlu.load(`doc2table`) | [DocToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotexttable) | - +
    ## File Path handling for OCR Models @@ -65,6 +63,7 @@ have file types which are applicable with the loaded OCR pipeline. NLU checks the file endings to determine whether the OCR models can be applied or not, i.e. `.pdf`, `.img` etc.. If your files lack these endings, NLU will not process them. +
    ## Image to Text Sample image: @@ -83,6 +82,8 @@ nlu.load('img2text').predict('path/to/haiku.png') | A frog jumps into the pond— | | Splash! Silence again. | +
    + ## PDF to Text Sample PDF: ![MarineGEO circle logo](/assets/images/ocr/nlu_ocr/haiku_pdf.png ) @@ -99,6 +100,8 @@ nlu.load('pdf2text').predict('path/to/haiku.pdf') | Is transferred to another candle— | | Spring twilight | +
    + ## DOCX to text Sample DOCX: ![MarineGEO circle logo](/assets/images/ocr/nlu_ocr/haiku_docx.png ) @@ -115,6 +118,7 @@ nlu.load('doc2text').predict('path/to/haiku.docx') | The apparition of these faces in the crowd; | | Petals on a wet, black bough. | +
    ## PDF with Tables @@ -143,6 +147,8 @@ nlu.load('pdf2table').predict('/path/to/sample.pdf') | 15 | 8 | 301 | 335 | 3.54 | 3.57 | 14.6 | 0 | 1 | 5 | | 21.4 | 4 | 121 | 109 | 4.11 | 2.78 | 18.6 | 1 | 1 | 4 | +
    + ## DOCX with Tables Sample DOCX: ![Sample DOCX](/assets/images/ocr/nlu_ocr/tables/doc.png ) @@ -161,9 +167,7 @@ nlu.load('doc2table').predict('/path/to/sample.docx') | System Access | 181 | 10% | | VoiceOver | 159 | 9% | - - - +
    ## PPT with Tables @@ -196,8 +200,7 @@ and | 6.2 | 3.4 | 5.4 | 2.3 | virginica | | 5.9 | 3 | 5.1 | 1.8 | virginica | - - +
    ## Combine OCR and NLP models @@ -232,10 +235,13 @@ nlu.load('img2text ner').predict('path/to/presidents.png') | Nelson Rockefeller | PERSON | 0.98615 | | 1967 | DATE | 0.589 | +
    + ## Authorize NLU for OCR You need a set of **credentials** to access the licensed OCR features. [You can grab one here](https://www.johnsnowlabs.com/spark-nlp-try-free/) +
    ### Authorize anywhere via providing via JSON file If you provide a JSON file with credentials, nlu will check whether there are only OCR or also Healthcare secrets. @@ -247,6 +253,8 @@ path = '/path/to/secrets.json' nlu.auth(path).load('licensed_model').predict(data) ``` +
    + ### Authorize via providing String parameters You can manually enter your secrets and authorize nlu for OCR and Healthcare features ```python @@ -261,7 +269,4 @@ SPARK_NLP_LICENSE = 'YOUR_SECRETS' nlu.auth(SPARK_NLP_LICENSE,AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,JSL_SECRET, OCR_LICENSE, OCR_SECRET) ``` - - -
    -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/notebooks.md b/docs/en/notebooks.md index ec503248..216c7c0e 100644 --- a/docs/en/notebooks.md +++ b/docs/en/notebooks.md @@ -8,18 +8,17 @@ permalink: /docs/en/notebooks modify_date: "2019-05-16" --- -# Tutorials Overview -The following tables give an overview on the different tutorials with NLU. The tables are splitted by category. By using the correct model, NLU can do anything for you, ranging from simple translations (even from scriptures, based on non-Latin letters) to textprocessing tasks (sentiment prediction, named entity recognition and on on). There are also colab notebooks for you to read. - +
    +{:.h2-select} +## Tutorials Overview +The following tables give an overview on the different tutorials with NLU. The tables are splitted by category. By using the correct model, NLU can do anything for you, ranging from simple translations (even from scriptures, based on non-Latin letters) to textprocessing tasks (sentiment prediction, named entity recognition and on on). There are also colab notebooks for you to read. +
    ## Embeddings Tutorials Overview - - {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Albert Word Embeddings with NLU | `albert`, `sentiment pos albert emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ALBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Albert-Paper](https://arxiv.org/pdf/1909.11942.pdf), [Albert on Github](https://github.com/google-research/ALBERT), [Albert on TensorFlow](https://tfhub.dev/s?q=albert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Albert](https://medium.com/spark-nlp/1-line-to-albert-word-embeddings-with-nlu-in-python-1691bc048ed1), [Albert_Embedding](https://nlp.johnsnowlabs.com/2021/06/23/albert_base_uncased_en.html) | @@ -32,10 +31,11 @@ The following tables give an overview on the different tutorials with NLU. The t | XLNET Word Embeddings with NLU | `xlnet`, `sentiment pos xlnet emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_XLNET_word_embeddings_and_t-SNE_visualization_example.ipynb) | [XLNet-Paper](https://arxiv.org/abs/1906.08237), [Bert Github](https://github.com/zihangdai/xlnet), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-XLNet](https://medium.com/spark-nlp/1-line-to-xlnet-word-embeddings-with-nlu-in-python-5efc57d7ac79), [Xlnet_Embedding](https://nlp.johnsnowlabs.com/2021/07/07/xlnet_base_cased_en.html) | | Multiple Word-Embeddings and Part of Speech in 1 Line of code | `bert electra elmo glove xlnet albert pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_multiple_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Bert-Paper](https://arxiv.org/pdf/1810.04805.pdf), [Albert-Paper](https://openreview.net/forum?id=H1eA7AEtvS), [ELMO-Paper](https://arxiv.org/abs/1802.05365), [Electra-Paper](https://arxiv.org/abs/2003.10555), [XLNet-Paper](https://arxiv.org/pdf/1906.08237.pdf), [Glove-Paper](https://nlp.stanford.edu/pubs/glove.pdf) | +
    + ## Text Preprocessing and Cleaning {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Normalzing with NLU | `norm` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_normalizer_example.ipynb) | - | @@ -46,20 +46,22 @@ The following tables give an overview on the different tutorials with NLU. The t | Tokenization with NLU | `tokenize` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_tokenization_example.ipynb) | - | | Normalization of Documents | `norm_document` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/document_normalizer_demo.ipynb) | - | +
    + ## Sequence to Sequence {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Open and Closed book question answering with Google's T5 | `en.t5` , `answer_question` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf), [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | | Overview of every task available with T5 | `en.t5.base` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf), [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | | Translate between more than 200 Languages in 1 line of code with Marian Models | `tr.translate_to.fr`, `en.translate_to.fr` ,`fr.translate_to.he` , `en.translate_to.de` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/translation_demo.ipynb) | [Marian-Papers](https://marian-nmt.github.io/publications/), [Translation-Pipeline (En to Fr)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_fr_xx.html), [Translation-Pipeline (En to Ger)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_de_xx.html) | +
    + ## Sentence Embeddings {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | BERT Sentence Embeddings with NLU | `embed_sentence.bert`, `pos sentiment embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_BERT_sentence_embeddings_and_t-SNE_visualization_Example.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | @@ -67,20 +69,20 @@ The following tables give an overview on the different tutorials with NLU. The t | USE Sentence Embeddings with NLU | `use`, `pos sentiment use emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_USE_sentence_embeddings_and_t-SNE_visualization_example.ipynb) | [Universal Sentence Encoder](https://arxiv.org/abs/1803.11175), [USE-TensorFlow](https://tfhub.dev/google/universal-sentence-encoder/2), [Sentence-USE-Embedding](https://nlp.johnsnowlabs.com/2020/04/17/tfhub_use_lg.html) | | Sentence similarity with NLU using BERT embeddings | `embed_sentence.bert`, `use en.embed_sentence.electra embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/sentence_similarirty_stack_overflow_questions.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | +
    ## Part of Speech {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part of Speech tagging with NLU | `pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/part_of_speechPOS/NLU_part_of_speech_ANC_example.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html) | +
    ## Named Entity Recognition (NER) {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NER Aspect Airline ATIS | `en.ner.aspect.airline` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/named_entity_recognition_NER/NER_aspect_airline_ATIS.ipynb) | [NER Airline Model](https://nlp.johnsnowlabs.com/2021/01/25/nerdl_atis_840b_300d_en.html), [Atis intent Dataset](https://www.kaggle.com/hassanamin/atis-airlinetravelinformationsystem) | @@ -88,39 +90,41 @@ The following tables give an overview on the different tutorials with NLU. The t | Named-entity recognition with Deep Learning ONTO NOTES | `ner.onto` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/named_entity_recognition_NER/NLU_ner_ONTO_18class_example.ipynb) | [NER_Onto](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html) | | Aspect based NER-Sentiment-Restaurants | `en.ner.aspect_sentiment` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/named_entity_recognition_NER/aspect_based_ner_sentiment_restaurants.ipynb) | - | +
    ## Multilingual Tasks {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Detect Named Entities (NER), Part of Speech Tags (POS) and Tokenize in Chinese | `zh.segment_words`, `zh.pos`, `zh.ner`, `zh.translate_to.en` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/chinese_ner_pos_and_tokenization.ipynb) | [Translation-Pipeline (Zh to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_zh_en_xx.html) | | Detect Named Entities (NER), Part of Speech Tags (POS) and Tokenize in Japanese | `ja.segment_words`, `ja.pos`, `ja.ner`, `ja.translate_to.en` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/japanese_ner_pos_and_tokenization.ipynb) | [Translation-Pipeline (Ja to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_ja_en_xx.html) | | Detect Named Entities (NER), Part of Speech Tags (POS) and Tokenize in Korean | `ko.segment_words`, `ko.pos`, `ko.ner.kmou.glove_840B_300d`, `ko.translate_to.en` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/master/examples/colab/component_examples/multilingual/korean_ner_pos_and_tokenization.ipynb) | - | +
    + ## Matchers {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Date Matching | `match.datetime` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/matchers/NLU_date_matching.ipynb) | - | +
    + ## Dependency Parsing {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Typed Dependency Parsing with NLU | `dep` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_typed_dependency_parsing_example.ipynb) | [Dependency Parsing ](https://nlp.johnsnowlabs.com/2021/03/27/Typed_Dependency_Parsing_en.html) | | Untyped Dependency Parsing with NLU | `dep.untyped` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_untyped_dependency_parsing_example.ipynb) | - | +
    ## Classifiers {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | E2E Classification with NLU | `e2e` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/E2E_classification.ipynb) | [e2e-Model](https://nlp.johnsnowlabs.com/2021/01/21/multiclassifierdl_use_e2e_en.html) | @@ -142,20 +146,21 @@ The following tables give an overview on the different tutorials with NLU. The t |Notebook for Classification of Questions vs Statements|`en.classify.question_vs_statement`|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/Question_vs_Statement.ipynb)| [Bert for Sequence Classification (Question vs Statement) ](https://nlp.johnsnowlabs.com/2021/11/04/bert_sequence_classifier_question_statement_en.html) | |Notebook for Classification of News into 4 classes|`en.classify.distilbert_sequence.ag_news`|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/News_Classification.ipynb)| [DistilBERT Sequence Classification Base - AG News (distilbert_base_sequence_classifier_ag_news)](https://nlp.johnsnowlabs.com/2021/11/21/distilbert_base_sequence_classifier_ag_news_en.html) | +
    + ## Chunkers {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Grammatical Chunk Matching with NLU | `match.chunks` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_chunking_example.ipynb) | - | | Getting n-Grams with NLU | `ngram` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_n-gram.ipynb) | - | +
    ## Healthcare {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Assertion | `en.med_ner.clinical en.assert`, `en.med_ner.clinical.biobert en.assert.biobert`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/assertion/assertion_overview.ipynb) | [Healthcare-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_clinical_en.html), [NER_Clinical-Classifier]( https://nlp.johnsnowlabs.com/2021/11/03/ner_profiling_biobert_en.html), [Toxic-Classifier](https://nlp.johnsnowlabs.com/2021/01/26/assertion_dl_biobert_en.html) | @@ -165,20 +170,20 @@ The following tables give an overview on the different tutorials with NLU. The t | Medical Named Entity Recognition | `en.med_ner.ade.clinical`, `en.med_ner.ade.clinical_bert`, `en.med_ner.anatomy`,`en.med_ner.anatomy.biobert`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/medical_named_entity_recognition/overview_medical_entity_recognizers.ipynb) | - | | Relation Extraction | `en.med_ner.jsl.wip.clinical.greedy en.relation`, `en.med_ner.jsl.wip.clinical.greedy en.relation.bodypart.problem`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/relation_extraction/overview_relation.ipynb) | - | +
    ## Visualization {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Visualization of NLP-Models with Spark-NLP and NLU | `ner`, `dep.typed`, `med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in`, `med_ner.jsl.wip.clinical resolve.icd10cm` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/visualization/NLU_visualizations_tutorial.ipynb) | [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Dependency Parsing](https://nlp.johnsnowlabs.com/2021/03/27/Typed_Dependency_Parsing_en.html), [NER-Clinical](https://nlp.johnsnowlabs.com/2021/11/03/ner_profiling_clinical_en.html), [Entity-Resolver (Chunks) clinical](https://nlp.johnsnowlabs.com/2021/04/16/chunkresolve_rxnorm_in_clinical_en.html) | +
    ## Example Notebooks on Kaggle, Examination on real life Problems. {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NLU Covid-19 Emotion Showcase | `emotion` | [![Open In GitHub]()](https://github.com/JohnSnowLabs/nlu/blob/master/examples/kaggle/nlu_covid_emotion_showcase.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | @@ -186,29 +191,30 @@ The following tables give an overview on the different tutorials with NLU. The t | NLU Airline Emotion Demo | `emotion` | [![Open In GitHub]()](https://github.com/JohnSnowLabs/nlu/blob/master/examples/kaggle/nlu_emotion_airline_demo.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | | NLU Airline Sentiment Demo | `sentiment` | [![Open In GitHub]()](https://github.com/JohnSnowLabs/nlu/blob/master/examples/kaggle/nlu_sentiment_airline_demo.ipynb) | [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | +
    ## Release Notebooks {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Bengali NER Hindi Embeddings for 30 Models | `bn.ner`, `bn.lemma`, `ja.lemma`, `am.lemma`, `bh.lemma`,` en.ner.onto.bert.small_l2_128`,.. | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/master/examples/release_notebooks/NLU1.1.2_Bengali_ner_Hindi_Embeddings_30_new_models.ipynb) | [Bengali-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_jifs_glove_840B_300d_bn.html), [Bengali-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_bn.html), [Japanese-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/15/lemma_ja.html), [Amharic-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_am.html) | | Entity Resolution | `med_ner.jsl.wip.clinical en.resolve.umls`, `med_ner.jsl.wip.clinical en.resolve.loinc`, `med_ner.jsl.wip.clinical en.resolve.loinc.biobert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/release_notebooks/NLU_3_0_2_release_notebook.ipynb) | - | +
    ## Crash-Course {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NLU 20 Minutes Crashcourse - the fast Data Science route | `spell`, `sentiment`, `pos`, `ner`, `yake`, `en.t5`, `emotion`, `answer_question`, `en.t5.base` ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/AI4_2021/NLU_crash_course_AI4.ipynb) | [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html), [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) , [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | +
    + ## Natural Language Processing (NLP) {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Chapter 0: Intro: 1-liners | `sentiment`, `pos`, `ner`, `bert`, `elmo`, `embed_sentence.bert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/NYC_DC_NLP_MEETUP/0_liners_intro.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | @@ -217,29 +223,29 @@ The following tables give an overview on the different tutorials with NLU. The t | Chapter 3: Answer questions and summarize Texts with T5 | `answer_question`, `en.t5`, `en.t5.base` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) | [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | | Chapter 4: Overview of T5-Tasks | `en.t5.base` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) | [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | +
    ## NLU-Crashcourse Graph AI {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Graph NLU 20 Minutes Crashcourse - State of the Art Text Mining for Graphs | `spell`, `sentiment`, `pos`, `ner`, `yake`, `emotion`, `med_ner.jsl.wip.clinical`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/graph_ai_summit/Healthcare_Graph_NLU_COVID_Tigergraph.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html), [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | +
    ## Healthcare-Training {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Healthcare with NLU | `med_ner.human_phenotype.gene_biobert`, `med_ner.ade_biobert`, `med_ner.anatomy`, `med_ner.bacterial_species`,... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/healthcare_webinar/NLU_healthcare_webinar.ipynb) | - | +
    ## Multilingual-Training {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part 0: Intro: 1-liners | `spell`, `sentiment`, `pos`, `ner`, `bert`, `elmo`, `embed_sentence.bert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/0_liners_intro.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Bert](https://medium.com/spark-nlp/1-line-to-bert-word-embeddings-with-nlu-f50d2b08cddc) , [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html) , [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | @@ -252,12 +258,14 @@ The following tables give an overview on the different tutorials with NLU. The t | Part 7: Overview of all tasks available with T5 | `en.t5.base` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/7_T5_SQUAD_GLUE_SUPER_GLUE_TASKS.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf) | | Part 8: Overview of some of the Multilingual modes with State Of the Art accuracy (1-liner) | `bn.lemma`, `ja.lemma`, `am.lemma`, `bh.lemma`, `zh.segment_words`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/8_Multi_lingual_ner_pos_stop_words_senti) | [Bengali-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_bn.html), [Japanese-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/15/lemma_ja.html) , [Amharic-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_am.html) | +
    + ## Multilinigual-Examples {:.table2} - | Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Overview of some Multilingual modes avaiable with State Of the Art accuracy (1-liner) | `bn.ner.cc_300d`, `ja.ner`, `zh.ner`, `th.ner.lst20.glove_840B_300D`, `ar.ner` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/python_web_conf/Multi_Linigual_examples.ipynb) | [Bengali-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_jifs_glove_840B_300d_bn.html) | | NLU 20 Minutes Crashcourse - the fast Data Science route | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/python_web_conf/NLU_crashcourse_py_web.ipynb) | | +
    \ No newline at end of file diff --git a/docs/en/predict_api.md b/docs/en/predict_api.md index 3f99ab77..799c1869 100644 --- a/docs/en/predict_api.md +++ b/docs/en/predict_api.md @@ -8,9 +8,7 @@ permalink: /docs/en/predict_api modify_date: "2019-05-16" --- -
    - -
    +
    ## The predict function NLU expects either a column named 'text' in the dataframe passed to it or alternatively it will assume the first column of the dataframe passed to it as the column it should predict for. diff --git a/docs/en/release_notes.md b/docs/en/release_notes.md index 69b4997e..faaf8601 100644 --- a/docs/en/release_notes.md +++ b/docs/en/release_notes.md @@ -8,13 +8,15 @@ key: docs-release-notes modify_date: "2020-06-12" --- -
    +
    ## NLU Version 4.0.0 OCR Visual Tables into Pandas DataFrames from PDF/DOC(X)/PPT files, 1000+ new state-of-the-art transformer models for Question Answering (QA) for over 30 languages, up to 700% speedup on GPU, 20 Biomedical models for over 8 languages, 50+ Terminology Code Mappers between RXNORM, NDC, UMLS,ICD10, ICDO, UMLS, SNOMED and MESH, Deidentification in Romanian, various Spark NLP helper methods and much more in 1 line of code with John Snow Labs NLU 4.0.0 ______________________ +
    + #### NLU 4.0 for OCR Overview On the OCR side, we now support extracting tables from PDF/DOC(X)/PPT files into structured pandas dataframe, making it easier than ever before to analyze bulks of files visually! @@ -34,6 +36,9 @@ containing Pandas DataFrame for every table detected This is powerd by [John Snow Labs Spark OCR](https://www.johnsnowlabs.com/spark-ocr/) Annotataors for [PdfToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotexttable), [DocToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotexttable), [PptToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#ppttotexttable) ---------------------------------------- + +
    + #### NLU 4.0 Core Overview - On the NLU core side we have over 1000+ new state-of-the-art models in over 30 languages for modern extractive transformer-based Question Answering problems powerd by the ALBERT/BERT/DistilBERT/DeBERTa/RoBERTa/Longformer Spark NLP Annotators trained on various SQUAD-like QA datasets for domains like Twitter, Tech, News, Biomedical COVID-19 and in various model subflavors like [sci_bert](https://www.aclweb.org/anthology/D19-1371/), [electra](https://arxiv.org/abs/2003.10555), [mini_lm](https://arxiv.org/abs/2002.10957), [covid_bert](https://arxiv.org/abs/2005.07503), [bio_bert](https://arxiv.org/abs/1901.08746), [indo_bert](https://arxiv.org/abs/2011.00677), [muril](https://arxiv.org/abs/2103.10730), [sapbert](https://github.com/cambridgeltl/sapbert), [bioformer](https://github.com/WGLab/Bioformer), [link_bert](https://arxiv.org/abs/2203.15827), [mac_bert](https://aclanthology.org/2020.findings-emnlp.58/) @@ -46,6 +51,7 @@ This is powerd by [John Snow Labs Spark OCR](https://www.johnsnowlabs.com/spark- ----------------------------- +
    #### NLU 4.0 for Healthcare Overview @@ -72,6 +78,7 @@ This is powerd by [John Snow Labs Spark OCR](https://www.johnsnowlabs.com/spark- ---------------------------------- +
    #### Extract Tables from PDF files as Pandas DataFrames @@ -101,6 +108,8 @@ nlu.load('pdf2table').predict('/path/to/sample.pdf') | 15 | 8 | 301 | 335 | 3.54 | 3.57 | 14.6 | 0 | 1 | 5 | | 21.4 | 4 | 121 | 109 | 4.11 | 2.78 | 18.6 | 1 | 1 | 4 | +
    + #### Extract Tables from DOC/DOCX files as Pandas DataFrames Sample DOCX: @@ -119,9 +128,7 @@ nlu.load('doc2table').predict('/path/to/sample.docx') | System Access | 181 | 10% | | VoiceOver | 159 | 9% | - - - +
    #### Extract Tables from PPT files as Pandas DataFrame @@ -158,6 +165,7 @@ and ---------------- +
    #### Span Classifiers for question answering Albert, Bert, DeBerta, DistilBert, LongFormer, RoBerta, XlmRoBerta based Transformer Architectures are now avaiable for question answering with almost 1000 models avaiable for 35 unique languages powerd by their corrosponding Spark NLP XXXForQuestionAnswering Annotator Classes and in various tuning and dataset flavours. @@ -212,6 +220,8 @@ These substrings define the `` substring, if it does not map to a spa - Size tweaks `xl`, `xxl`, `large`, `base`, `medium`, `base`, `small`, `tiny`, `cased`, `uncased` - Dimension tweaks : `1024d`,`768d`,`512d`,`256d`,`128d`,`64d`,`32d` +
    + #### QA DataFormat You need to use one of the Data formats below to pass context and question correctly to the model. @@ -240,15 +250,15 @@ returns : |:---------|--------------------:|:---------------------------------------|:-----------------| | Clara | 0.994931 | My name is Clara and I live in Berkely | What is my name? | - - - - ---------------- +
    + #### New NLU helper Methods You can see all features showcased in the [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb) notebook or on [the new docs page for Spark NLP utils](https://nlu.johnsnowlabs.com/docs/en/spellbook/utils_for_spark_nlp) +
    + #### nlu.viz(pipe,data) Visualize input data with an already configured Spark NLP pipeline, for Algorithms of type (Ner,Assertion, Relation, Resolution, Dependency) @@ -280,6 +290,8 @@ first annotator that provides the correct output type for a specific viz. You can specify which columns to use for a viz by using the corresponding ner_col, pos_col, dep_untyped_col, dep_typed_col, resolution_col, relation_col, assertion_col, parameters. +
    + #### nlu.autocomplete_pipeline(pipe) Auto-Complete a pipeline or single annotator into a runnable pipeline by harnessing NLU's DAG Autocompletion algorithm and returns it as NLU pipeline. The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlu pipe @@ -325,7 +337,7 @@ returns : | 1 | 1 | numbness | gums | External_body_part_or_region | | 1 | 1 | tongue | gums | External_body_part_or_region | - +
    #### nlu.to_pretty_df(pipe,data) Annotates a Pandas Dataframe/Pandas Series/Numpy Array/Spark DataFrame/Python List strings /Python String @@ -360,6 +372,7 @@ Some columns are omitted from metadata to reduce total amount of output columns, For a given pipeline output level is automatically set to the last anntators output level by default. This can be changed by defining `to_preddty_df(pipe,text,output_level='my_level'` for levels `token`,`sentence`, `document`,`chunk` and `relation` . +
    #### nlu.to_nlu_pipe(pipe) Convert a pipeline or list of annotators into a NLU pipeline making `.predict()` and `.viz()` avaiable for every Spark NLP pipeline. @@ -399,10 +412,10 @@ and - - --------------- +
    + #### 4 new Demo Notebooks These notebooks showcase some of latest classifier models for Banking Queries, Intents in Text, Question and new s classification * [Notebook for Classification of Banking Queries](https://github.com/JohnSnowLabs/nlu/blob/4.0.0/examples/colab/component_examples/classifiers/Banking_Queries_Classification.ipynb) @@ -414,8 +427,7 @@ These notebooks showcase some of latest classifier models for Banking Queries, I ---------------------- - - +
    #### NLU captures every Annotator of Spark NLP and Spark NLP for healthcare @@ -481,10 +493,9 @@ The following annotator classes are newly captured: - Lemmatizer - Normalizer - -------------------- - +
    ##### All NLU 4.0 for Healthcare Models @@ -687,8 +698,7 @@ All healthcare models added in NLU 4.0 : ----------------------------- - - +
    #### All NLU 4.0 Core Models @@ -1662,6 +1672,7 @@ Can be found on the [NLU website](https://nlu.johnsnowlabs.com/docs/en/release_n --------------------- +
    #### Minor Improvements - IOB Schema Detection for Tokenclassifiers and adding NER Converting in those cases @@ -1669,6 +1680,8 @@ Can be found on the [NLU website](https://nlu.johnsnowlabs.com/docs/en/release_n ------------------------- +
    + #### Bug Fixes - fixed bug in multi lang parsing - fixed bug for Normalizers @@ -1679,13 +1692,7 @@ Can be found on the [NLU website](https://nlu.johnsnowlabs.com/docs/en/release_n ------------------------------------------------- - - - - - - - +
    ## NLU Version 3.4.4 @@ -1699,6 +1706,8 @@ architectures as well as various new models for On the healthcare side we have `Portuguese De-identification Models`, have `NER` models for Gene detection and finally RxNorm Sentence resolution model for mapping and extracting pharmaceutical actions (e.g. analgesic, hypoglycemic) as well as treatments (e.g. backache, diabetes). +
    + #### General NLP Models @@ -1812,7 +1821,7 @@ The languages for these models are covered for the very first time ever by NLU. | 101 | [Serbo-Croatian](https://iso639-3.sil.org/code/sh) | [sh.embed.w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/03/16/w2v_cc_300d_sh_3_0.html) | [w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/03/16/w2v_cc_300d_sh_3_0.html) | Embeddings | WordEmbeddingsModel | [sh](https://iso639-3.sil.org/code/sh) | [nan](https://iso639-3.sil.org/code/sh) | [nan](https://iso639-3.sil.org/code/sh) | Macrolanguage | Living | | 102 | [Uzbek](https://iso639-3.sil.org/code/uzb) | [uz.embed.w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/03/16/w2v_cc_300d_uz_3_0.html) | [w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/03/16/w2v_cc_300d_uz_3_0.html) | Embeddings | WordEmbeddingsModel | [uz](https://iso639-3.sil.org/code/uzb) | [uzb](https://iso639-3.sil.org/code/uzb) | [uzb](https://iso639-3.sil.org/code/uzb) | Macrolanguage | Living | - +
    ##### All general NLP models Powered by the incredible [Spark NLP 3.4.4](https://github.com/JohnSnowLabs/spark-nlp/releases/tag/3.4.4) and previous releases. @@ -2461,6 +2470,7 @@ Powered by the incredible [Spark NLP 3.4.4](https://github.com/JohnSnowLabs/spar | 639 | [qhe.lemma](https://nlp.johnsnowlabs.com/2022/05/01/lemma_hiencs_qhe_3_0.html) | [lemma_hiencs](https://nlp.johnsnowlabs.com/2022/05/01/lemma_hiencs_qhe_3_0.html) | Lemmatization | [Reserved for local use](https://iso639-3.sil.org/code/qhe) | LemmatizerModel | [nan](https://iso639-3.sil.org/code/qhe) | [qhe](https://iso639-3.sil.org/code/qhe) | [qhe](https://iso639-3.sil.org/code/qhe) | nan | Local | | 640 | [qtd.pos](https://nlp.johnsnowlabs.com/2022/05/01/pos_sagt_qtd_3_0.html) | [pos_sagt](https://nlp.johnsnowlabs.com/2022/05/01/pos_sagt_qtd_3_0.html) | Part of Speech Tagging | [Reserved for local use](https://iso639-3.sil.org/code/qtd) | PerceptronModel | [nan](https://iso639-3.sil.org/code/qtd) | [qtd](https://iso639-3.sil.org/code/qtd) | [qtd](https://iso639-3.sil.org/code/qtd) | nan | Local | +
    #### All Healthcare Powered by the amazing @@ -2479,9 +2489,7 @@ Powered by the amazing | 6 | [pt.med_ner.deid.generic](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | [ner_deid_generic](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | De-identification | [Portuguese](https://iso639-3.sil.org/code/por) | MedicalNerModel | [pt](https://iso639-3.sil.org/code/por) | [por](https://iso639-3.sil.org/code/por) | [por](https://iso639-3.sil.org/code/por) | Living | Individual | | 7 | [pt.med_ner.deid](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | [ner_deid_generic](https://nlp.johnsnowlabs.com/2022/04/13/ner_deid_generic_pt_3_0.html) | De-identification | [Portuguese](https://iso639-3.sil.org/code/por) | MedicalNerModel | [pt](https://iso639-3.sil.org/code/por) | [por](https://iso639-3.sil.org/code/por) | [por](https://iso639-3.sil.org/code/por) | Living | Individual | - - - +
    ## NLU Version 3.4.3 @@ -2495,7 +2503,7 @@ Lemmatizers, Parts of Speech Taggers, and Word2Vec Embeddings for over `66 langu for the first time by NLU, including ancient and exotic languages like `Ancient Greek`, `Old Russian`, `Old French` and much more. Once again we would like to thank our community to make this release possible. - +
    #### NLU for Healthcare @@ -2505,6 +2513,8 @@ clinical entities in an unsupervised fashion, no training required! Additionally, New French and Italian Deidentification models are available for clinical and healthcare domains. Powerd by the fantastic [ Spark NLP for helathcare 3.5.0 release](https://nlp.johnsnowlabs.com/docs/en/licensed_release_notes) +
    + #### Zero-Shot Relation Extraction Zero-shot Relation Extraction to extract relations between clinical entities with no training dataset @@ -2541,6 +2551,8 @@ df[ | it | [it.med_ner.deid_generic](https://nlp.johnsnowlabs.com/2022/03/25/ner_deid_generic_it_3_0.html) | [ner_deid_generic](https://nlp.johnsnowlabs.com/2022/03/25/ner_deid_generic_it_3_0.html) | Named Entity Recognition | MedicalNerModel | | it | [it.med_ner.deid_subentity](https://nlp.johnsnowlabs.com/2022/03/22/ner_deid_subentity_it_3_0.html) | [ner_deid_subentity](https://nlp.johnsnowlabs.com/2022/03/22/ner_deid_subentity_it_3_0.html) | Named Entity Recognition | MedicalNerModel | +
    + #### NLU general On the general NLP side we have new transformer based `DeBERTa v3 sequence classifiers` models fine-tuned in Urdu, French and English for @@ -2548,6 +2560,7 @@ Sentiment and News classification. Additionally, 100+ Part Of Speech Taggers and languages new word2vec embeddings, including `hi`,`azb`,`bo`,`diq`,`cy`,`es`,`it`, powered by the amazing [Spark NLP 3.4.3 release](https://github.com/JohnSnowLabs/spark-nlp/releases/tag/3.4.3) +
    #### New Languages covered: First time languages covered by NLU are : @@ -2559,6 +2572,8 @@ First time languages covered by NLU are : and their respective ISO-639-3 and ISO 630-2 codes are : `azb`,`bo`,`diq`,`ckb`, `lt` `gd`, `fo`,`lzh`,`grc`,`got`,`orv`,`cu`,`fro`,`qtd`,`ug`,`cop`,`hr`,`be`,`qhe`,`sr` +
    + #### New NLP Models Overview @@ -2745,12 +2760,14 @@ and their respective ISO-639-3 and ISO 630-2 codes are : | fr | [fr.pos.partut](https://nlp.johnsnowlabs.com/2022/04/01/pos_partut_fr_3_0.html) | [pos_partut](https://nlp.johnsnowlabs.com/2022/04/01/pos_partut_fr_3_0.html) | Part of Speech Tagging | PerceptronModel | | it | [it.pos.vit](https://nlp.johnsnowlabs.com/2022/04/01/pos_vit_it_3_0.html) | [pos_vit](https://nlp.johnsnowlabs.com/2022/04/01/pos_vit_it_3_0.html) | Part of Speech Tagging | PerceptronModel | +
    + #### Bugfixes - Improved Error Messages and integrated detection and stopping of endless loops which could occur during construction of nlu pipelines - +
    #### Additional NLU resources * [140+ NLU Tutorials](https://nlu.johnsnowlabs.com/docs/en/notebooks) @@ -2761,7 +2778,7 @@ and their respective ISO-639-3 and ISO 630-2 codes are : * [NLU documentation](https://nlu.johnsnowlabs.com/docs/en/install) * [Discussions](https://github.com/JohnSnowLabs/spark-nlp/discussions) Engage with other community members, share ideas, and show off how you use Spark NLP and NLU! - +
    #### Install NLU in 1 line! @@ -2771,7 +2788,7 @@ and their respective ISO-639-3 and ISO 630-2 codes are : * Install NLU via Pip : ! pip install nlu pyspark streamlit==0.80.0` ``` - +
    ## NLU Version 3.4.2 @@ -2785,6 +2802,8 @@ For the healthcare side we have new NER models for randomized clinical trials (R `BACKGROUND`, `CONCLUSIONS`, `METHODS`, `OBJECTIVE`, `RESULTS` from clinical text. Additionally, new Spanish Deidentification NER models for entities like `STATE`, `PATIENT`, `DEVICE`, `COUNTRY`, `ZIP`, `PHONE`, `HOSPITAL` and many more. +
    + #### New Open Source Models Integrates models from [Spark NLP 3.4.2](https://github.com/JohnSnowLabs/spark-nlp/releases/tag/3.4.2) release @@ -2797,6 +2816,7 @@ Integrates models from [Spark NLP 3.4.2](https://github.com/JohnSnowLabs/spark-n | en | [en.embed.deberta_v3_large](https://nlp.johnsnowlabs.com/2022/03/10/deberta_v3_large_en_3_0.html) | [deberta_v3_large](https://nlp.johnsnowlabs.com/2022/03/10/deberta_v3_large_en_3_0.html) | Embeddings | DeBertaEmbeddings | | xx | [xx.embed.mdeberta_v3_base](https://nlp.johnsnowlabs.com/2022/03/10/mdeberta_v3_base_xx_3_0.html) | [mdeberta_v3_base](https://nlp.johnsnowlabs.com/2022/03/10/mdeberta_v3_base_xx_3_0.html) | Embeddings | DeBertaEmbeddings | +
    #### New Healthcare Models @@ -2810,6 +2830,7 @@ Integrates models from [Spark NLP For Healthcare 3.4.2](https://nlp.johnsnowlabs | en | [en.med_ner.deid.generic_augmented](https://nlp.johnsnowlabs.com/2021/06/30/ner_deid_generic_augmented_en.html) | [ner_deid_generic_augmented](https://nlp.johnsnowlabs.com/2021/06/30/ner_deid_generic_augmented_en.html) | ['Named Entity Recognition', 'De-identification'] | MedicalNerModel | | en | [en.med_ner.deid.subentity_augmented](https://nlp.johnsnowlabs.com/2021/06/01/ner_deid_subentity_augmented_en.html) | [ner_deid_subentity_augmented](https://nlp.johnsnowlabs.com/2021/06/01/ner_deid_subentity_augmented_en.html) | ['Named Entity Recognition', 'De-identification'] | MedicalNerModel | +
    #### Additional NLU resources * [140+ NLU Tutorials](https://nlu.johnsnowlabs.com/docs/en/notebooks) @@ -2820,6 +2841,7 @@ Integrates models from [Spark NLP For Healthcare 3.4.2](https://nlp.johnsnowlabs * [NLU documentation](https://nlu.johnsnowlabs.com/docs/en/install) * [Discussions](https://github.com/JohnSnowLabs/spark-nlp/discussions) Engage with other community members, share ideas, and show off how you use Spark NLP and NLU! +
    #### Install NLU in 1 line! @@ -2828,10 +2850,7 @@ Integrates models from [Spark NLP For Healthcare 3.4.2](https://nlp.johnsnowlabs * Install NLU on Kaggle : !wget https://setup.johnsnowlabs.com/nlu/kaggle.sh -O - | bash * Install NLU via Pip : ! pip install nlu pyspark streamlit==0.80.0` ``` - - - - +
    ## NLU Version 3.4.1 @@ -2846,7 +2865,7 @@ German Sentiment Classifiers and English Emotion and Typo Classifiers. The healthcare side covers Medical Spanish models, Classifiers for Drugs, Gender, the Pico Framework, and Relation Extractors for Adverse Drug events and Temporality. Finally, Spark 3.2.X is now supported and bugs related to Databricks environments have been fixed. - +
    #### General NLU Improvements - Support for Spark 3.2.x @@ -2858,6 +2877,7 @@ integrates new Multilingual embeddings for 12 Major Indian languages, embeddings for Vietnamese, French, and English Clinical domains. Additionally new Multilingual NER model for 9 African languages, English 6 Class Emotion classifier and Typo detectors. +
    #### New Embeddings - **Multilingual ALBERT - IndicBert** model pretrained exclusively on 12 major Indian languages with size smaller and performance on par or better than competing models. Languages covered are Assamese, Bengali, English, Gujarati, Hindi, Kannada, Malayalam, Marathi, Oriya, Punjabi, Tamil, Telugu. @@ -2867,6 +2887,8 @@ Additionally new Multilingual NER model for 9 African languages, English 6 Class tasks and on datasets. Available with [en.embed.longformer.clinical](https://nlp.johnsnowlabs.com/2022/02/08/clinical_longformer_en.html) - **Fine tuned Static French Word2Vec Embeddings** in 3 sizes, 200d, 300d and 100d. Available with [fr.embed.word2vec_wiki_1000](https://nlp.johnsnowlabs.com/2022/01/26/word2vec_wiki_1000_fr.html), [fr.embed.word2vec_wac_200](https://nlp.johnsnowlabs.com/2022/02/01/word2vec_wac_200_fr.html) and [fr.embed.w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/02/03/w2v_cc_300d_fr.html) +
    + #### New Transformer based Token and Sequence Classifiers - **Multilingual NER Distilbert** model which detects entities `DATE`, `LOC`, `ORG`, `PER` for the languages 9 African languages (Hausa, Igbo, Kinyarwanda, Luganda, Nigerian, Pidgin, Swahili, Wolof, and Yorùbá). Available with [xx.ner.masakhaner.distilbert](https://nlp.johnsnowlabs.com/2021/12/06/xlm_roberta_large_token_classifier_masakhaner_xx.html) @@ -2888,8 +2910,7 @@ Additionally new Multilingual NER model for 9 African languages, English 6 Class | fr | [fr.embed.w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/02/03/w2v_cc_300d_fr.html) | [w2v_cc_300d](https://nlp.johnsnowlabs.com/2022/02/03/w2v_cc_300d_fr.html) | Embeddings | WordEmbeddingsModel | | vi | [vi.embed.distilbert.cased](https://nlp.johnsnowlabs.com/2022/01/13/distilbert_base_cased_vi.html) | [distilbert_base_cased](https://nlp.johnsnowlabs.com/2022/01/13/distilbert_base_cased_vi.html) | Embeddings | DistilBertEmbeddings | - - +
    #### New Healthcare Models Integrated from the amazing [3.4.1 Spark NLP For Healthcare Release](https://nlp.johnsnowlabs.com/docs/en/licensed_release_notes#341). @@ -2898,7 +2919,7 @@ various medical Spanish models, RxNorm Resolvers, Transformer based sequence classifiers for Drugs, Gender and the PICO framework, and Relation extractors for Temporality and Causality of Drugs and Adverse Events. - +
    #### New Medical Spanish Models - **Spanish Word2Vec Embeddings** available with [es.embed.sciwiki_300d](https://nlp.johnsnowlabs.com/2020/05/27/embeddings_sciwiki_300d_es.html) @@ -2932,12 +2953,13 @@ and Relation extractors for Temporality and Causality of Drugs and Adverse Event | en | [en.relation.adverse_drug_events.clinical](https://nlp.johnsnowlabs.com/2021/07/12/re_ade_clinical_en.html) | [re_ade_clinical](https://nlp.johnsnowlabs.com/2021/07/12/re_ade_clinical_en.html) | Relation Extraction | RelationExtractionModel | | en | [en.relation.adverse_drug_events.clinical.biobert](https://nlp.johnsnowlabs.com/2021/07/12/redl_ade_biobert_en.html) | [redl_ade_biobert](https://nlp.johnsnowlabs.com/2021/07/12/redl_ade_biobert_en.html) | Relation Extraction | RelationExtractionDLModel | - +
    #### Bugfixes - Fixed bug that caused non-default output level of components to be sentence - Fixed a bug that caused nlu references pointing to pretrained pipelines in spark nlp to crash in Databricks environments +
    #### Additional NLU resources * [140+ NLU Tutorials](https://nlu.johnsnowlabs.com/docs/en/notebooks) @@ -2948,6 +2970,7 @@ and Relation extractors for Temporality and Causality of Drugs and Adverse Event * [NLU documentation](https://nlu.johnsnowlabs.com/docs/en/install) * [Discussions](https://github.com/JohnSnowLabs/spark-nlp/discussions) Engage with other community members, share ideas, and show off how you use Spark NLP and NLU! +
    #### Install NLU in 1 line! @@ -2956,7 +2979,7 @@ and Relation extractors for Temporality and Causality of Drugs and Adverse Event * Install NLU on Kaggle : !wget https://setup.johnsnowlabs.com/nlu/kaggle.sh -O - | bash * Install NLU via Pip : ! pip install nlu pyspark streamlit==0.80.0` ``` - +
    diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md index fcbeafdf..2561f36a 100644 --- a/docs/en/start_sparkseession.md +++ b/docs/en/start_sparkseession.md @@ -8,7 +8,7 @@ modify_date: "2020-05-26" header: true --- -
    +
    To use most features you must start a Spark Session with `jsl.start()`first. This will launch a [Java Virtual Machine(JVM)](https://en.wikipedia.org/wiki/Java_virtual_machine) process on your machine @@ -21,7 +21,7 @@ If you **disabled license caching** while installing or if you want to **tweak s Outputs of running `jsl.start()` tell you which jars are loaded and versions of all relevant libraries. ![access_token1.png](/assets/images/jsl_lib/start/start.png) - +
    ## Authorization Flow Parameters Most of the authorization Flows and Parameters of `jsl.install()` are supported. @@ -36,6 +36,7 @@ Review detailed [docs here](https://nlu.johnsnowlabs.com/docs/en/install#authori | `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | | `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | +
    ### Manually specify License Parameters These can be omitted according to the [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) @@ -51,6 +52,8 @@ These can be omitted according to the [License Variable Overview](https://nlu.jo | `fin_license` | Corresponds to `JSL_LEGAL_LICENSE` | | `leg_license` | Corresponds to `JSL_FINANCE_LICENSE` | +
    + ## Sparksession Parameters These parameters configure how your spark Session is started up. See [Spark Configuration](https://spark.apache.org/docs/latest/configuration.html) for a comprehensive overview of all spark settings @@ -66,8 +69,4 @@ See [Spark Configuration](https://spark.apache.org/docs/latest/configuration.htm | `hardware_target` | `cpu` | Specify for which hardware Jar should be optimized. Valid values are `gpu`,`cpu`,`m1`,`aarch` | `jsl.start(hardware_target='m1')` | | `model_cache_folder` | `None` | Specify where models should be downloaded to when using `model.pretrained()` | `jsl.start(model_cache_folder=True)` | - - - - -
    \ No newline at end of file +
    \ No newline at end of file diff --git a/docs/en/streamlit_viz_examples.md b/docs/en/streamlit_viz_examples.md index 1bea1997..836c2151 100644 --- a/docs/en/streamlit_viz_examples.md +++ b/docs/en/streamlit_viz_examples.md @@ -8,7 +8,7 @@ permalink: /docs/en/streamlit_viz_examples modify_date: "2019-05-16" --- -
    +
    This page contains examples and tutorials on how to visualize the 1000+ state-of-the-art NLP models provided by NLU in *just 1 line of code* in `streamlit`. @@ -21,6 +21,8 @@ Besides that, you can also compare the results of the 200+ NER models John Snow +
    + ## Install [For detailed instructions refer to the NLU install documentation here](https://nlu.johnsnowlabs.com/docs/en/install) You need `Open JDK 8` installed and the following python packages @@ -28,17 +30,22 @@ You need `Open JDK 8` installed and the following python packages pip install nlu streamlit pyspark==3.0.1 sklearn plotly ``` Problems? [Connect with us on Slack!](https://join.slack.com/t/spark-nlp/shared_invite/zt-lutct9gm-kuUazcyFKhuGY3_0AMkxqA) -z + +
    + ## Impatient and want some action? Just run this Streamlit app, you can use it to generate python code for each NLU-Streamlit building block ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/01_dashboard.py ``` +
    + ## Quick Starter cheat sheet - All you need to know in 1 picture for NLU + Streamlit For NLU models to load, see [the NLU spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) or the [John Snow Labs Modelshub](https://modelshub.johnsnowlabs.com/models) or go [straight to the source](https://github.com/JohnSnowLabs/nlu/blob/master/nlu/spellbook.py). ![NLU Streamlit Cheatsheet](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/NLU_Streamlit_Cheetsheet.png) +
    ## Examples Just try out any of these. @@ -57,6 +64,7 @@ streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/03_text_similarity_matrix.py ``` +
    ### Example: [`04_dependency_tree`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/04_dependency_tree.py) ```shell @@ -88,15 +96,14 @@ streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/09_entity_embedding_manifolds.py ``` +
    ## How to use NLU? All you need to know about NLU is that there is the [`nlu.load()`](https://nlu.johnsnowlabs.com/docs/en/load_api) method which returns a `NLUPipeline` object which has a [`.predict()`](https://nlu.johnsnowlabs.com/docs/en/predict_api) that works on most [common data types in the pydata stack like Pandas dataframes](https://nlu.johnsnowlabs.com/docs/en/predict_api#supported-data-types) . Ontop of that, there are various visualization methods a NLUPipeline provides easily integrate in Streamlit as re-usable components. [`viz() method`](https://nlu.johnsnowlabs.com/docs/en/viz_examples) - - - +
    ### Overview of NLU + Streamlit buildingblocks @@ -113,10 +120,12 @@ Ontop of that, there are various visualization methods a NLUPipeline provides ea | [`nlu.load('').viz(data, write_to_streamlit=True)`](TODO.com) | Display the raw visualization without any UI elements. See [viz docs for more info](https://nlu.johnsnowlabs.com/docs/en/viz_examples). By default all aplicable nlu model references will be shown. | | [`nlu.enable_streamlit_caching()`](#test) | Enable caching the `nlu.load()` call. Once enabled, the `nlu.load()` method will automatically cached. **This is recommended** to run first and for large peformance gans | +
    -# Detailed visualizer information and API docs +{:.h2-select} +## Detailed visualizer information and API docs -## function `pipe.viz_streamlit` +### function `pipe.viz_streamlit` Display a highly configurable UI that showcases almost every feature available for Streamlit visualization with model selection dropdowns in your applications. @@ -137,9 +146,10 @@ nlu.load('ner').viz_streamlit(['I love NLU and Streamlit!','I hate buggy softwar ``` - ![NLU Streamlit UI Overview](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/ui.gif) +
    + ### function parameters `pipe.viz_streamlit` | Argument | Type | Default |Description | @@ -161,7 +171,7 @@ nlu.load('ner').viz_streamlit(['I love NLU and Streamlit!','I hate buggy softwar | `show_code_snippets` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization |`num_similarity_cols` | `int` | `2` | How many columns should for the layout in Streamlit when rendering the similarity matrixes. - +
    ## function `pipe.viz_streamlit_classes` @@ -173,6 +183,7 @@ nlu.load('sentiment').viz_streamlit_classes(['I love NLU and Streamlit!','I love ``` ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/class.gif) +
    ### function parameters `pipe.viz_streamlit_classes` @@ -192,7 +203,7 @@ nlu.load('sentiment').viz_streamlit_classes(['I love NLU and Streamlit!','I love | `show_logo` | `bool` | `True` | Show logo | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. - +
    ## function `pipe.viz_streamlit_ner` Visualize the predicted classes and their confidences and additional metadata to Streamlit. @@ -213,6 +224,8 @@ nlu.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel f ``` ![NER coloring](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/NER_colored.png) +
    + ### function parameters `pipe.viz_streamlit_ner` | Argument | Type | Default |Description | @@ -233,8 +246,7 @@ nlu.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel f | `show_logo` | `bool` | `True` | Show logo | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. - - +
    ## function `pipe.viz_streamlit_dep_tree` Visualize a typed dependency tree, the relations between tokens and part of speech tags predicted. @@ -245,6 +257,8 @@ nlu.load('dep.typed').viz_streamlit_dep_tree('POS tags define a grammatical labe ``` ![Dependency Tree](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/DEP.png) +
    + ### function parameters `pipe.viz_streamlit_dep_tree` | Argument | Type | Default |Description | @@ -262,9 +276,7 @@ nlu.load('dep.typed').viz_streamlit_dep_tree('POS tags define a grammatical labe | `show_logo` | `bool` | `True` | Show logo | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. - - - +
    ## function `pipe.viz_streamlit_token` Visualize predicted token and text features for every model loaded. @@ -275,6 +287,7 @@ nlu.load('stemm pos spell').viz_streamlit_token('I liek pentut buttr and jelly ! ``` ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/token.gif) +
    ### function parameters `pipe.viz_streamlit_token` @@ -295,8 +308,7 @@ nlu.load('stemm pos spell').viz_streamlit_token('I liek pentut buttr and jelly ! | `show_logo` | `bool` | `True` | Show logo | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. - - +
    ## function `pipe.viz_streamlit_similarity` @@ -314,6 +326,8 @@ nlu.load('bert').viz_streamlit_word_similarity(['I love love loooove NLU! <3','I ``` ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/SIM.gif) +
    + ### function parameters `pipe.viz_streamlit_similarity` | Argument | Type | Default |Description | @@ -338,11 +352,12 @@ nlu.load('bert').viz_streamlit_word_similarity(['I love love loooove NLU! <3','I | `show_logo` | `bool` | `True` | Show logo | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +
    +{:.h2-select} +## Embedding visualization via Manifold and Matrix Decomposition algorithms -# Embedding visualization via Manifold and Matrix Decomposition algorithms - -## function `pipe.viz_streamlit_word_embed_manifold` +### function `pipe.viz_streamlit_word_embed_manifold` Visualize Word Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 11 Supported methods from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition). @@ -361,8 +376,7 @@ nlu.load('bert',verbose=True).viz_streamlit_word_embed_manifold(default_texts=[' - - +
    ### function parameters `pipe.viz_streamlit_word_embed_manifold` @@ -388,15 +402,13 @@ nlu.load('bert',verbose=True).viz_streamlit_word_embed_manifold(default_texts=[' | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU namespace structure.| | `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | - - +
    ### Larger Example showcasing more dimension reduction techniques on a larger corpus : - - +
    ## function `pipe.viz_streamlit_sentence_embed_manifold` @@ -416,6 +428,8 @@ nlu.load('embed_sentence.bert').viz_streamlit_sentence_embed_manifold(['text1',' +
    + ### function parameters `pipe.viz_streamlit_sentence_embed_manifold` | Argument | Type | Default |Description | @@ -439,9 +453,7 @@ nlu.load('embed_sentence.bert').viz_streamlit_sentence_embed_manifold(['text1',' | `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU namespace structure.| | `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | - - - +
    ## Streamlit Entity Manifold visualization ## function `pipe.viz_streamlit_entity_embed_manifold` @@ -459,6 +471,8 @@ nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Lab ``` +
    + ### function parameters `pipe.viz_streamlit_sentence_embed_manifold` | Argument | Type | Default |Description | |----------------------------|------------|-----------------------------------------------------------|---------------------------------------------------------| @@ -476,9 +490,6 @@ nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Lab | `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | - - - ### [Supported Manifold Algorithms for Word, Sentence, and Entity Embeddings](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) - [TSNE](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html#sklearn.manifold.TSNE) - [ISOMAP](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.Isomap.html#sklearn.manifold.Isomap) @@ -496,5 +507,4 @@ nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Lab - [Latent Dirichlet Allocation](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html) -
    - +
    \ No newline at end of file diff --git a/docs/en/training.md b/docs/en/training.md index f3b22357..b95d806b 100644 --- a/docs/en/training.md +++ b/docs/en/training.md @@ -8,13 +8,11 @@ key: docs-developers modify_date: "2020-05-08" --- -
    - -
    +
    You can fit load a trainable NLU pipeline via ```nlu.load('train.')``` -# Binary Text Classifier Training +## Binary Text Classifier Training [Sentiment classification training demo](https://colab.research.google.com/drive/1f-EORjO3IpvwRAktuL4EvZPqPr2IZ_g8?usp=sharing) To train the a Sentiment classifier model, you must pass a dataframe with a ```text``` column and a ```y``` column for the label. Uses a Deep Neural Network built in Tensorflow. @@ -38,7 +36,9 @@ fitted_pipe = nlu.load('embed_sentence.electra train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` -# Multi Class Text Classifier Training +
    + +## Multi Class Text Classifier Training [Multi Class Text Classifier Training Demo](https://colab.research.google.com/drive/12FA2TVvvRWw4pRhxDnK32WAzl9dbF6Qw?usp=sharing) To train the Multi Class text classifier model, you must pass a dataframe with a ```text``` column and a ```y``` column for the label. By default *Universal Sentence Encoder Embeddings (USE)* are used as sentence embeddings. @@ -56,7 +56,9 @@ fitted_pipe = nlu.load('embed_sentence.bert train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` -# Multi Label Classifier training +
    + +## Multi Label Classifier training [ Train Multi Label Classifier on E2E dataset](https://colab.research.google.com/drive/15ZqfNUqliRKP4UgaFcRg5KOSTkqrtDXy?usp=sharing) [Train Multi Label Classifier on Stack Overflow Question Tags dataset](https://drive.google.com/file/d/1Nmrncn-y559od3AKJglwfJ0VmZKjtMAF/view?usp=sharing) This model can predict multiple labels for one sentence. @@ -87,9 +89,7 @@ fitted_pipe = nlu.load('embed_sentence.electra train.multi_classifier').fit(trai preds = fitted_pipe.predict(train_df) ``` - - -# Part of Speech (POS) Training +## Part of Speech (POS) Training Your dataset must be in the form of universal dependencies [Universal Dependencies](https://universaldependencies.org/). You must configure the dataset_path in the ```fit()``` method to point to the universal dependencies you wish to train on. @@ -101,9 +101,10 @@ fitted_pipe = nlu.load('train.pos').fit(dataset_path=train_path, label_seperator preds = fitted_pipe.predict(train_df) ``` +
    +## Named Entity Recognizer (NER) Training -# Named Entity Recognizer (NER) Training [NER training demo](https://colab.research.google.com/drive/1_GwhdXULq45GZkw3157fAOx4Wqo-fmFV?usp=sharing) You can train your own custom NER model with an [CoNLL 20003 IOB](https://www.aclweb.org/anthology/W03-0419.pdf) formatted dataset. By default *Glove 100d Token Embeddings* are used as features for the classifier. @@ -121,8 +122,9 @@ train_path = '/content/eng.train' fitted_pipe = nlu.load('bert train.ner').fit(dataset_path=train_path) ``` +
    -# Chunk Entity Resolver Training +## Chunk Entity Resolver Training [Chunk Entity Resolver Training Tutorial Notebook]() Named Entities are sub pieces in textual data which are labled with classes. These classes and strings are still ambious though and it is not possible to group semantically identically entities withouth any definition of `terminology`. @@ -151,6 +153,7 @@ fitted_pipe.predict(["Peter told me to buy Tesla ", 'I have money to loose, is T | '1.0000' | '23] | 'TESLA' | Peter told me to buy Tesla | | '1.0000' | '23] | 'TESLA' | I have money to loose, is TSLA a good option? | +
    ### Train with default glove embeddings ```python @@ -159,6 +162,8 @@ trained_chunk_resolver = untrained_chunk_resolver.fit(df) trained_chunk_resolver.predict(df) ``` +
    + ### Train with custom embeddings ```python # Use Healthcare Embeddings @@ -167,9 +172,9 @@ trained_chunk_resolver = untrained_chunk_resolver.fit(df) trained_chunk_resolver.predict(df) ``` +
    - -# Rule based NER with Context Matcher +## Rule based NER with Context Matcher [Rule based NER with context matching tutorial notebook](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/Training/rule_based_named_entity_recognition_and_resolution/rule_based_NER_and_resolution_with_context_matching.ipynb) Define a rule based NER algorithm by providing Regex Patterns and resolution mappings. The confidence value is computed using a heuristic approach based on how many matches it has. @@ -221,6 +226,8 @@ gender_NER_pipe.predict(sample_text) | girl | 0.13 | | girl | 0.13 | +
    + ### Context Matcher Parameters You can define the following parameters in your rules.json file to define the entities to be matched @@ -241,17 +248,20 @@ You can define the following parameters in your rules.json file to define the en | completeMatchRegex | `Optional[str]` | Wether to use complete or partial matching, either `"true"` or `"false"` | | ruleScope | `str` | currently only `sentence` supported | -# Saving a NLU pipeline to disk +
    + +## Saving a NLU pipeline to disk ```python train_path = '/content/eng.train' fitted_pipe = nlu.load('train.ner').fit(dataset_path=train_path) stored_model_path = './models/classifier_dl_trained' fitted_pipe.save(stored_model_path) - ``` -# Loading a NLU pipeline from disk +
    + +## Loading a NLU pipeline from disk ```python train_path = '/content/eng.train' @@ -261,9 +271,9 @@ fitted_pipe.save(stored_model_path) hdd_pipe = nlu.load(path=stored_model_path) ``` +
    - -# Loading a NLU pipeline as pyspark.ml.PipelineModel +## Loading a NLU pipeline as pyspark.ml.PipelineModel ```python import pyspark # load the NLU pipeline as pyspark pipeline diff --git a/docs/en/utils_for_sparknlp.md b/docs/en/utils_for_sparknlp.md index deecd808..f6158845 100644 --- a/docs/en/utils_for_sparknlp.md +++ b/docs/en/utils_for_sparknlp.md @@ -8,7 +8,7 @@ permalink: /docs/en/utils_for_spark_nlp modify_date: "2019-05-16" --- - +
    You can see all features showcased in the demo notebook [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb) @@ -43,6 +43,8 @@ first annotator that provides the correct output type for a specific viz. You can specify which columns to use for a viz by using the corresponding ner_col, pos_col, dep_untyped_col, dep_typed_col, resolution_col, relation_col, assertion_col, parameters. +
    + ## nlu.autocomplete_pipeline(pipe) Auto-Complete a pipeline or single annotator into a runnable pipeline by harnessing NLU's DAG Autocompletion algorithm and returns it as NLU pipeline. The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlu pipe @@ -88,7 +90,7 @@ returns : | 1 | 1 | numbness | gums | External_body_part_or_region | | 1 | 1 | tongue | gums | External_body_part_or_region | - +
    ## nlu.to_pretty_df(pipe,data) Annotates a Pandas Dataframe/Pandas Series/Numpy Array/Spark DataFrame/Python List strings /Python String @@ -123,6 +125,7 @@ Some columns are omitted from metadata to reduce total amount of output columns, For a given pipeline output level is automatically set to the last anntators output level by default. This can be changed by defining `to_preddty_df(pipe,text,output_level='my_level'` for levels `token`,`sentence`, `document`,`chunk` and `relation` . +
    ## nlu.to_nlu_pipe(pipe) Convert a pipeline or list of annotators into a NLU pipeline making `.predict()` and `.viz()` avaiable for every Spark NLP pipeline. @@ -162,6 +165,4 @@ and - - - +
    \ No newline at end of file diff --git a/docs/en/viz_examples.md b/docs/en/viz_examples.md index c6c36237..d1acd24c 100644 --- a/docs/en/viz_examples.md +++ b/docs/en/viz_examples.md @@ -8,15 +8,16 @@ permalink: /docs/en/viz_examples modify_date: "2019-05-16" --- -
    - -
    +
    NLU can do quite a lot of things in just one line. But imagine the things you could do in multiple lines, like visualizations! In this section we will demonstrate a few common NLU idioms for the data science lifecycle, especially for the data exploration phase. -# Visualizations using nlu.load().viz() +
    + +{:.h2-select} +## Visualizations using nlu.load().viz() You can use the build in visualization module on any pipeline or model returned by `nlu.load()`. Simply call `viz()` and NLU will try to deduct a applicable visualization. Alternatively, you can also manually specify, which visualization you want to invoke. @@ -32,6 +33,8 @@ These visualizations are provided via [Spark-NLP-Display package](https://nlp.jo See the [visualization tutorial](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/visualization/NLU_visualizations_tutorial.ipynb) notebook for more info. +
    + ## NER visualization Applicable to any of the [100+ NER models! See here for an overview](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition) ```python @@ -39,6 +42,8 @@ nlu.load('ner').viz("Donald Trump from America and Angela Merkel from Germany do ``` ![NER visualization](/assets/images/nlu/VizExamples/viz_module/NER.png) +
    + ## Dependency tree visualization Visualizes the structure of the labeled dependency tree and part of speech tags ```python @@ -53,6 +58,8 @@ nlu.load('dep.typed').viz("Donald Trump from America and Angela Merkel from Germ ``` ![Dependency Tree visualization](/assets/images/nlu/VizExamples/viz_module/DEP_big.png) +
    + ## Assertion status visualization Visualizes asserted statuses and entities. Applicable to any of the [10 + Assertion models! See here for an overview](https://nlp.johnsnowlabs.com/models?task=Assertion+Status) @@ -70,6 +77,7 @@ nlu.load('med_ner.clinical assert').viz(data) ``` ![Assert visualization](/assets/images/nlu/VizExamples/viz_module/assertion_big.png) +
    ## Relationship between entities visualization Visualizes the extracted entities between relationship. @@ -86,6 +94,7 @@ pipe = nlu.load('med_ner.jsl.wip.clinical relation.clinical').viz(data) ``` ![Entity Relation visualization](/assets/images/nlu/VizExamples/viz_module/relation_big.png) +
    ## Entity Resolution visualization for chunks Visualizes resolutions of entities @@ -103,6 +112,7 @@ nlu.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz(data) ![Chunk Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_chunk_big.png) +
    ## Entity Resolution visualization for sentences Visualizes resolutions of entities in sentences @@ -119,6 +129,8 @@ nlu.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz(data) ``` ![Sentence Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_sentence_big.png) +
    + ## Configure visualizations ### Define custom colors for labels Some entity and relation labels will be highlighted with a pre-defined color, which you [can find here](https://github.com/JohnSnowLabs/spark-nlp-display/tree/main/sparknlp_display/label_colors). @@ -133,6 +145,7 @@ nlu.load('med_ner.jsl.wip.clinical').viz(data,viz_colors =viz_colors) ``` ![define colors labels](/assets/images/nlu/VizExamples/viz_module/define_colors.png) +
    ### Filter entities that get highlighted By default every entity class will be visualized. @@ -146,9 +159,10 @@ nlu.load('med_ner.jsl.wip.clinical').viz(data,labels_to_viz=labels_to_viz) ``` ![filter labels](/assets/images/nlu/VizExamples/viz_module/filter_labels.png) +
    - -# Visualizations using Pandas +{:.h2-select} +## Visualizations using Pandas The most common two liner you will use in NLU is loading a classifier like *emotion* or *sentiment* and then plotting the occurence of each predicted label . @@ -192,5 +206,4 @@ keyword_predictions.explode('keywords').keywords.value_counts()[0:100].plot.bar( ``` ![Category counts](/assets/images/nlu/VizExamples/keyword_distribution.png) -
    - +
    \ No newline at end of file From 5781d4c8be29e4324f96e6014b1dc984389cbf3f Mon Sep 17 00:00:00 2001 From: diatrambitas Date: Wed, 5 Oct 2022 16:08:09 +0300 Subject: [PATCH 16/26] punctual fixes and fine tuning of docs --- docs/en/install.md | 127 ++++++++++++++++++++------------------------- 1 file changed, 57 insertions(+), 70 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 456b53a4..9fd72072 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -34,20 +34,16 @@ from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` -The quickest way **licensed libraries** you have access to, -like [Spark-NLP for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/licensed_install) -or [Spark-OCR for Finance,Legal, Healthcare](https://nlp.johnsnowlabs.com/docs/en/ocr) -is to run the following in python +The quickest way to get access to **licensed libraries** like [Finance NLP, Legal NLP, Healthcare NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr) is to run the following in python: ```python from johnsnowlabs import * jsl.install() ``` -It will make a **Browser Window Pop Up** or **Clickable Button with Pop Up** appear. -On that page you can give access to you John Snow Labs license which enables installation and usage of all your licensed -products -Make sure to **Restart your Notebook** when installing to a notebook. +This will display a **Browser Window Pop Up** or show a **Clickable Button with Pop Up**. Click on the **Authorize** button to allow the library to connect to your account on my.JohnSnowLabs.com and access you licenses. This will enable the installation and use of all licensed products for which you have a valid license. + +Make sure to **Restart your Notebook** after installion. Colab Button ![install_button_colab.png](/assets/images/jsl_lib/install/install_button_colab.png) @@ -91,13 +87,13 @@ Once access to your license is provided, it is cached locally `~/.johnsnowlabs/l calling `jst.start()` and `jsl.install()`, so you don't need to authorize again. Only 1 licenses can be provided and will be cached during authorization flows. If you have multiple licenses you can re-run an authorization method and use the `license_number` parameter choose -between licenses you have -access to. Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour) +between licenses you have access to. +Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour). | Auth Flow Method | Description | Python `jsl.install()` usage | |--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| | Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license | `jsl.install()` | -| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visist new page to give access to your license | `jsl.install()` | +| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visit new page to give access to your license | `jsl.install()` | | Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | | License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | | **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | @@ -107,31 +103,31 @@ access to. Licenses are locally numbered in order they have been provided, for m ### Optional Auth Flow Parameters -Use these parameters to configure **how to authorize** +Use these parameters to configure **the prefered authorization flow**. | Parameter | description | |----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True` | -| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have multiple. | -| `license_number` | Specify license number to use when using OAuth based approaches or when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use your 0th license from my.johnsnowlabs | -| `store_in_jsl_home` | By default license data and Jars/Wheels are stored in in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify it once authorized again.
    Set to `False` to disable this caching behaviour.
    | -| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False` | +| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True`. | +| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have several ones. | +| `license_number` | Specify the license number to use with OAuth based approaches or when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use your 0th license from my.johnsnowlabs.com. | +| `store_in_jsl_home` | By default license data and Jars/Wheels are stored in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify on every run.
    Set to `False` to disable this caching behaviour.
    | +| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False`. | ### Optional Installation Target Parameters -Use these parameters to configure **where** to install to +Use these parameters to configure **where** to install the library. | Parameter | description | |-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `python_exec_path` | Specify path to a python executable into whose environment the libraries will be installed. Defaults to the current executing Python process, i.e. `sys.executable` and it's pip module is used for setup. | | `venv_creation_path` | Specify path to a folder, in which a fresh venv will be created with all libraries. Using this parameter ignores the `python_exec_path` parameter, since the newly created venv's python executable is used for setup. | -| `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installsl`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | -| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for me details | +| `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installs`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | +| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for more details. | ### Optional Installation Process Parameters -Use these parameters to configure **what should** be installed to the target +Use the following parameters to configure **what should** be installed. | Parameter | description | |------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| @@ -139,10 +135,10 @@ Use these parameters to configure **what should** be installed to the target | `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | | `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | | `product` | Specify product to install. By default installs everything you have access to. | -| `only_download_jars` | By default all libraries are installed to do current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory | -| `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types | -| `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | -| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses** | +| `only_download_jars` | By default all libraries are installed to the current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory. | +| `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types. | +| `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl. | +| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses**. | ### Automatic Databricks Installation @@ -152,7 +148,7 @@ You additionally must use one of the [John Snow Labs License Authorization Flows Labs license,which will be installed to your Databricks cluster. A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has all Jars, Wheels and License Information to run all features in a Databricks cluster. -**Only Licensed Libraries and Spark NLP** will be installed to your cluster, without the +**Only Licensed Libraries (Healthcare, Visual, Finance and Legal NLP) and Spark NLP** will be installed to your cluster. The John Snow Labs Python libary will currently not be installed to your Cluster. | Databricks Auth Flow Method | Description | Python `jsl.install()` usage | |-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| @@ -164,8 +160,7 @@ Where to find your Databricks Access Token: ### License Variables Names for JSON and OS variables The following variable names are checked when using a JSON or environment variables based approach for installing -licensed features or when using -`jsl.start()` . +licensed features or when using `jsl.start()` . You can find all of your license information on [https://my.johnsnowlabs.com/subscriptions](https://my.johnsnowlabs.com/subscriptions) - `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. @@ -173,11 +168,10 @@ You can find all of your license information on [https://my.johnsnowlabs.com/sub - `HC_SECRET` : The secret for a version of the enterprise NLP engine library. Changes between releases. Can be omitted if you don't have access to enterprise nlp. - `HC_LICENSE` : Your license for the medical features. Can be omitted if you don't have a medical license. -- `OCR_SECRET` : The secret for a version of the OCR library. Changes between releases. Can be omitted if you don't have - a OCR license. -- `OCR_LICENSE` : Your license for the OCR features. Can be omitted if you don't have a OCR license. -- `JSL_LEGAL_LICENSE`: Your license for Legal OCR and Legal NLP Features -- `JSL_FINANCE_LICENSE` Your license for Finance OCR and Finance NLP Features +- `OCR_SECRET` : The secret for a version of the Visual NLP (Spark OCR) library. Changes between releases. Can be omitted if you don't have a Visual NLP (Spark OCR) license. +- `OCR_LICENSE` : Your license for the Visual NLP (Spark OCR) features. Can be omitted if you don't have a Visual NLP (Spark OCR) license. +- `JSL_LEGAL_LICENSE`: Your license for Legal NLP Features +- `JSL_FINANCE_LICENSE` Your license for Finance NLP Features NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you may have 1 generic `SPARK_NLP_LICENSE`. @@ -187,10 +181,9 @@ NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you ### Via Auto Detection & Browser Login -All [default search locations ]() are searched, if any credentials are found they will be used used. -If no credentials are auto-detected, a Browser Window will pop up, asking to Authroize yourself -with https://my.johnsnowlabs.com/ -In Google Colab, a clickable button will appear, which will make a window pop up where you can authorize yourself. +All [default search locations ]() are searched, if any credentials are found they will be used. +If no credentials are auto-detected, a Browser Window will pop up, asking to authorize access to https://my.johnsnowlabs.com/ +In Google Colab, a clickable button will appear, which will make a window pop up where you can authorize access to https://my.johnsnowlabs.com/. ```python jsl.install() @@ -236,7 +229,7 @@ jsl.install( ### Into Current Python Process -Uses sys.executable by default, i.e. the Python that is currently running the program +Uses sys.executable by default, i.e. the Python that is currently running the program. ```python jsl.install() @@ -245,7 +238,7 @@ jsl.install() ### Into Custom Python Env Using specific python executable, which is not the currently running python. -Will use the provided python's executable pip module to installl libraries +Will use the provided python's executable pip module to install libraries. ```python jsl.install(python_exec_path='my/python.exe') @@ -253,7 +246,7 @@ jsl.install(python_exec_path='my/python.exe') ### Into freshly created venv -Create a new Venv from scratch, using the currently exectuing Pythons Venv Modulle +Create a new Venv using the currently executing Pythons Venv Module. ```python jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') @@ -269,15 +262,14 @@ jsl.install(offline_zip_dir='path/to/where/my/zip/will/be') ``` **Step2:** -Transfer the zip file securely to your offline environment and unzip it. -One option is the unix `scp` comand +Transfer the zip file securely to your offline environment and unzip it. One option is the unix `scp` command. ```shell scp /to/where/my/zip/will/be/john_snow_labs.zip 123.145.231.001:443/remote/directroy ``` **Step3:** -Then from the **remote machine shell** unzip via +Then from the **remote machine shell** unzip with: ```shell # Unzip all files to ~/johnsowlabs @@ -285,7 +277,7 @@ unzip remote/directory/jsl.zip -d ~/johnsowlabs ``` **Step4 (option1):** -Install the wheels via jsl +Install the wheels via jsl: ```python # If you unzipped to ~/johnsowlabs, then just update this setting before running and jsl.install() handles the rest for you! @@ -297,7 +289,7 @@ jsl.install() ``` **Step4 (option2):** -Install the wheels via pip yourself +Install the wheels via pip: ```shell # Assuming you unzipped to ~/johnsnowlabs, you can install all wheels like this @@ -305,8 +297,7 @@ pip install ~/johnsnowlabs/py_installs/*.whl ``` **Step5:** -Test your installation -Via shell +Test your installation Via shell: ```shell python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" @@ -321,24 +312,23 @@ jsl.load('emotion').predict('Wow that easy!') ### Into Airgap/Offline Manual -Download all files yourself from the URLS printed by jsl.install(). +Download all files yourself from the URLs printed by jsl.install(). You will have to folly the Automatic Instructions starting from step (2) of the automatic installation. I.e. provide the files somehow on your offline machine. ```python -# Print all URLS to files you need to provide on your host machine +# Print all URLs to files you need to provide on your host machine jsl.install(offline=True) ``` ### Into a freshly created Databricks cluster -To install in databricks you must provide your `accessToken` and `hostUrl`. -You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` -, `browser`, `json_file`, or `manually defining secrets` -Your can get it from +To install in databricks you must provide your `accessToken` and `hostUrl`. You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token`, `browser`, `json_file`, or `manually defining secrets` + +Your can get it from: ``` python -# Create a new Cluster with Spark NLP and all licensed libraries ready to go +# Create a new Cluster with Spark NLP and all licensed libraries ready to go: jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) ``` @@ -347,13 +337,12 @@ jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . After having provided license data once, you don't need to specify it again since the cached licensed will be used. -Use the `license_number` parameter to switch between multiple licenses. -Note: Locally cached licenses are numbered in the order they have been provided, starting at 0 +Use the `license_number` parameter to switch between multiple licenses. +`Note: Locally cached licenses are numbered in the order they have been provided, starting at 0.` ## List all available licenses -This shows you all licenses for your account in https://my.johnsnowlabs.com/ -Use this to decide which license number to install when installing via browser or access token, +This shows you all licenses for your account in https://my.johnsnowlabs.com/. Use this to decide which license number to install when installing via browser or access token. ```python jsl.list_remote_licenses() @@ -370,25 +359,23 @@ jsl.list_local_licenses() ## License Search precedence -If there are multiples possible sources for licenses, the following order takes precedence +If there are multiples possible sources for licenses, the following order takes precedence: -1. Manually provided license data by defining all license parameters -2. Browser/ Access Token -3. `Os environment Variables` for any var names that match up with secret names -4. `/content/*.json` for any json file smaller than 1 MB -5. `current_working_dir/*.json` for any json smaller than 1 MB -6. `~/.johnsnowlabs/licenses` for any licenses +1. Manually provided license data by defining all license parameters. +2. Browser/ Access Token. +3. `Os environment Variables` for any var names that match up with secret names. +4. `/content/*.json` for any json file smaller than 1 MB. +5. `current_working_dir/*.json` for any json smaller than 1 MB. +6. `~/.johnsnowlabs/licenses` for any licenses. -JSON files are scanned if they have any keys that match up with names of secrets. -Name of the json file does not matter, file just needs to end with .json +JSON files are scanned if they have any keys that match up with names of secrets. Name of the json file does not matter, file just needs to end with .json. ## Upgrade Flow -The John Snow Labs Teams are working early to push out new Releases and Features each week! -Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. +The John Snow Labs Teams are working early to push out new Releases and Features each week! Simply run `pip install johnsnowlabs --upgrade` to get the latest **open source libraries** updated. For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again. -They will be used to fetch the latest licensed library and install them to your target +They will be used to fetch the latest licensed library and install them to your target. ## How to setup Java 8 From 0fc823aa16848bcf3aadff23c103edba00e7f1b0 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Thu, 6 Oct 2022 12:48:52 +0200 Subject: [PATCH 17/26] Doc Updates --- docs/_data/navigation.yml | 13 +- .../jsl_lib/databricks_utils/submit_func.png | Bin 0 -> 123468 bytes .../databricks_utils/submit_raw_str.png | Bin 0 -> 56383 bytes .../submit_raw_str_result.png | Bin 0 -> 103876 bytes .../jsl_lib/install/databricks_manual.png | Bin 0 -> 42793 bytes docs/en/databricks_utils.md | 107 +++++++++++++++ docs/en/install.md | 47 ++++++- docs/en/jsl_home.md | 2 +- docs/en/jsl_release_notes.md | 25 ++++ docs/en/testing_utils_modelshub.md | 72 ++++++++++ docs/en/testing_utils_notebook.md | 126 ++++++++++++++++++ 11 files changed, 383 insertions(+), 9 deletions(-) create mode 100644 docs/assets/images/jsl_lib/databricks_utils/submit_func.png create mode 100644 docs/assets/images/jsl_lib/databricks_utils/submit_raw_str.png create mode 100644 docs/assets/images/jsl_lib/databricks_utils/submit_raw_str_result.png create mode 100644 docs/assets/images/jsl_lib/install/databricks_manual.png create mode 100644 docs/en/databricks_utils.md create mode 100644 docs/en/jsl_release_notes.md create mode 100644 docs/en/testing_utils_modelshub.md create mode 100644 docs/en/testing_utils_notebook.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index c22b2f5a..bb5a5c2a 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -32,9 +32,16 @@ docs-en: url: /docs/en/start-a-sparksession - title: John Snow Labs Usage & Overview url: /docs/en/import-structure + - title: Utilities for Databricks + url: /docs/en/databricks-utils + - title: Utilities for Testing Notebooks + url: /docs/en/testing-utils-notebooks + - title: Utilities for Testing NLP Models & Modelhub + url: /docs/en/testing-utils-modelshub - title: Settings & Cache Folder url: /docs/en/john-snow-labs-home - + - title: John Snow Labs Release Notes + url: /docs/en/jsl-release-notes - title: NLU children: - title: NLU Usage @@ -58,7 +65,7 @@ docs-en: key: streamlit_viz - title: Spellbook url: /docs/en/spellbook - - title: Utils for Spark NLP + - title: Utilities for Spark NLP url: /docs/en/utils_for_spark_nlp @@ -72,7 +79,7 @@ docs-en: # - title: Pydocs # url: /api/ - - title: Release Notes + - title: NLU Release Notes url: /docs/en/release_notes diff --git a/docs/assets/images/jsl_lib/databricks_utils/submit_func.png b/docs/assets/images/jsl_lib/databricks_utils/submit_func.png new file mode 100644 index 0000000000000000000000000000000000000000..26c9ca15e0c3c5ab807c1d224315e880cddcf614 GIT binary patch literal 123468 zcmb@uc|4SD_&40{Zgs1>1tAHAC}J$3D3UFN##$J=k!9>g-6}2iov|cY$2yEowmJn#E_KF=R-fAry+YtHL9&tv_5kK^*{o|fv-LmY>8?b>xz z?anRTUAtI(cJ11W{c8`n!eZdoyldB!U23;(-uE(_qIljvX-8Pz7+ZJyB-`4Y^k`IO zcBy&E{o8~Ao?J#MlQ}$^^yS%kp*@EV?Av$pNcK4)iw`g3Em0?xQEp26uUhOoap1r7AsKEp!Z7{6?a@}z0~#e5iHF3TiK zY$_bzUgn>Odyu`(_aG;f?xg*NaNB$jZnb1n`HOia%|!q_=}rWxhBjJA*h(uUAonV; zFKomO?x9&L{dH+24c?MEXClGNb9Ldc?Rx%&ZMiNTYNL(T1ejLcQuE)-;wL_`CRVe* zgY@ig-8p4SlH%26^Jn3#?8DCd+q<|E@iG^szWM!4z-EmYp$+o*gP<~DYr*(j&EW*Z zqGAr}An*I37dV*!3z3??czML@2Jimd`S}Q*%?Imiib%bM0K)2wXTa8K>(&ac+mqiL zeL#V0!6|OG%5O1XiwXI;)&l2EipF2O`(-*v%oCQ(+kY{`uWlOb?B0r?o!+tKXZnNH z9J#g@@Xs1$kg#5px-nd{wIIWrsx;CkI_S+DB{Bxr1wwSI)B^ujI^?xr0*T9~*iPhP zk3+A(H>@oGSNYx@r$2Ga*<#Z0ihj >U7l?3PY&xVGRza_dy01do&Gmvqvzf5P28 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 CJ5N{u literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/databricks_utils/submit_raw_str.png b/docs/assets/images/jsl_lib/databricks_utils/submit_raw_str.png new file mode 100644 index 0000000000000000000000000000000000000000..5b76f261a57816a53fff8c6be38754054fd47650 GIT binary patch literal 56383 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π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∓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⋘FVtMaA_VXb{ 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

    ASFtO|aszs9h zLH}VUu}wal42NTaSC1L&^f0_d1OE}!!YS{wD}8Op88_vx-*ZzoYfI(q64YrQg}p>R zmZ%cykhwwYH-g3g8fH=gE0balBPFgDdv=?`yd~&HptdK*f@n^3uQqAh{J;m&&jFmY z5aBjmVe244u(z#o;5yZ>wMrpG+VE$2|MubX&y)eE2DEtpPdXX???!)e+%7HJ=}bOt z?KGZ%TYTOX?MKM2@2@}BrzUpb=SSoK8XU-ZV8Yk4-`APt_jU~x{_D4BuTW%=r{9ym zXq}%3Zo*#zDt<<3@iyUDgG68S?^i)-_4kjJe_%(tkvrJ`_Gj(;NT2n+la{Ayop;o1 zI^t`NvcEcg$8@Y9tKfp-V^(9nN(NoC`ZtdshG+DAq30B!yKqS5ss{s2MY^t1xx0+*67z(X4u(7;sl8$+ZI95X?X(+ ziB9Y6?{O^$R&M;rp0aLAs4zy!xjw)6SXOD@?`7`W#csB?PE?13R+zdj^QSvCsJXf- z?N<5V2G}Z)q%lYPm078So$K@urGBKJR?r}PJ-(D%-^_4=Zu0pHPA-l$sW@NKEVEhA z)K}-1n_D4@%TZZfx$DRN>@D}J{hX;Vlx(J*-HcFhR+-HiJ;*K`C}6hIy|c=9tq~hr47_m9_)uo|B&$YvL%vsZ_IVxRE zKA!ok&{liP(NsMhPwU=k*RiZd3G=m`K6m%=`KhO?ew1%$e(W~En`o{zq~8^brz6HP zPdY?5r+o+AoU?a6e{20S$)JO%!r~CoJJ5Yiu>U+tUeZRt4Kq`@wzgK2me##Nm^ww@ z0R9k%HO!Q4W&<_j4Ebr+^9%F z!T#vlo*7l5y`3Fue3c=x&y%i?v3Wjpr?tDoqIo$ldtTrGkXwIWZuI8(K-(x%B2L1` z6tgMk!4uu!4Qk2XgM{q5TGWg*oQK{C%E(^pkefRzx`s%;2vC8KjP%k;EeCYMfm#l!R{r-<=LyRMYMd^^uiuVbqy4zcmdN3dj3x;1Y}QM4ZV z_d%w!ndEFLBt-L=$kfXK0dIuRa+|scH!kCS`Lyb!U%1IsM)X- zDZgQ+4kN|cFM940c>^TBGgrd(I}KjobS^VgQ$(Gj4@VdK4l+2Q6I69c)(5tJOv%1} zF@+#oYeGEOH{&@y-PhMAP~hSVP@TUh{ne|tn5cv^v!;dp&tdzo-FvX{wwk24+qFvm*4fdi6+0DKCf|-l|k7M!KK+@JMZlMzKLhKPG+nm+B>g5a@$bmy(iOuN?Z>-=ltlSaF2w&B(Li1RBl2jjpO~%w|4|&@J$O-+VG+T) ScAA{H6mF~D%Ds8_@&5*t`tYIv literal 0 HcmV?d00001 diff --git a/docs/assets/images/jsl_lib/install/databricks_manual.png b/docs/assets/images/jsl_lib/install/databricks_manual.png new file mode 100644 index 0000000000000000000000000000000000000000..99bc334173d4ed5b11af3857e28767eddae1a0e4 GIT binary patch literal 42793 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 Koqg)!_5T6yHggXE literal 0 HcmV?d00001 diff --git a/docs/en/databricks_utils.md b/docs/en/databricks_utils.md new file mode 100644 index 00000000..b142eb87 --- /dev/null +++ b/docs/en/databricks_utils.md @@ -0,0 +1,107 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Utilities for Databricks +permalink: /docs/en/databricks-utils +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +

    + +## Submit a Task with jsl.run_in_databricks +Easily run Python code in a Databricks cluster, using the John Snow Labs library. +The fastest way to test this out, is to create a cluster with `jsl.install()` and then use `jsl.run_in_databricks` to start a task. +```python + +# Execute a Raw Python string as script on Databricks +from johnsnowlabs import * +script = """ +import nlu +print(nlu.load('sentiment').predict('That was easy!'))""" + +cluster_id = jsl.install(json_license_path=my_license, databricks_host=my_host,databricks_token=my_token) +jsl.run_in_databricks(script, + databricks_cluster_id=cluster_id, + databricks_host=my_host, + databricks_token=my_token, + run_name='Python Code String Example') + +``` +This will start a **Job Run** which you can view in the **Workflows tab** +![databricks_cluster_submit_raw.png](/assets/images/jsl_lib/databricks_utils/submit_raw_str.png) + +And after a while you can see the results +![databricks_cluster_submit_raw.png](/assets/images/jsl_lib/databricks_utils/submit_raw_str_result.png) + + +### Run a Python Function in Databricks + +Define a function, which will be written to a local file, copied to HDFS and executed by the Databricks cluster. + +```python +def my_function(): + import nlu + medical_text = """A 28-year-old female with a history of gestational + diabetes presented with a one-week history of polyuria , + polydipsia , poor appetite , and vomiting .""" + df = nlu.load('en.med_ner.diseases').predict(medical_text) + for c in df.columns: print(df[c]) + +# my_function will run on databricks +jsl.run_in_databricks(my_function, + databricks_cluster_id=cluster_id, + databricks_host=my_host, + databricks_token=my_token, + run_name='Function test') + +``` +This example will print all columns of the resulting dataframe which contains emdical NER predictions. +![databricks_cluster_submit_raw.png](/assets/images/jsl_lib/databricks_utils/submit_func.png) + + +### Run a Raw Python Code String in Databricks +Provide a string which must be valid Python Syntax. +It will be written to string, copied to HDFS and executed by the Databricks Cluster. + +```python +script = """ +import nlu +print(nlu.load('sentiment').predict('That was easy!'))""" + +jsl.run_in_databricks(script, + databricks_cluster_id=cluster_id, + databricks_host=my_host, + databricks_token=my_token, + run_name='Python Code String Example') + +``` + + +### Run a Python Script in Databricks +Provide the path to a script on your machine. It will be copied to the Databricks HDFS and executed as task. +```python +jsl.run_in_databricks('path/to/my/script.py', + databricks_cluster_id=cluster_id, + databricks_host=my_host, + databricks_token=my_token, + run_name='Script test ') +``` + +### Run a Python Module in Databricks + +Provide a module accessible to the john snow labs library. +It's content's will be written to a local file, copied to HDFS and executed by the databricks cluster. + +```python +import johnsnowlabs.auto_install.health_checks.nlp_test as nlp_test +jsl.run_in_databricks(nlp_test, + databricks_cluster_id=cluster_id, + databricks_host=my_host, + databricks_token=my_token, + run_name='nlp_test') +``` + + +
    \ No newline at end of file diff --git a/docs/en/install.md b/docs/en/install.md index 456b53a4..90b41235 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -144,7 +144,7 @@ Use these parameters to configure **what should** be installed to the target | `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl | | `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses** | -### Automatic Databricks Installation +### Automatic Databricks Installation Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install all open source and licensed features into a Databricks cluster. @@ -152,15 +152,47 @@ You additionally must use one of the [John Snow Labs License Authorization Flows Labs license,which will be installed to your Databricks cluster. A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has all Jars, Wheels and License Information to run all features in a Databricks cluster. -**Only Licensed Libraries and Spark NLP** will be installed to your cluster, without the -| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | -|-----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | +|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| | `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | Where to find your Databricks Access Token: ![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) + +#### Databricks Cluster Creation Parameters + +You can set the following parameters on the `jsl.install()` function to define properties of the cluster which will be created. +See [Databricks Cluster Creation](https://docs.databricks.com/dev-tools/api/latest/clusters.html#create) for a detailed description of all parameters. + +| Cluster creation Parameter | Default Value | +|----------------------------|--------------------------------------------| +| block_till_cluster_ready | `True` | +| num_workers | `1` | +| cluster_name | `John-Snow-Labs-Databricks-Auto-Cluster🚀` | +| node_type_id | `i3.xlarge` | +| driver_node_type_id | `i3.xlarge` | +| spark_env_vars | `None` | +| autotermination_minutes | `60` | +| spark_version | `10.5.x-scala2.12` | +| spark_conf | `None` | +| auto_scale | `None` | +| aws_attributes | `None` | +| ssh_public_keys | `None` | +| custom_tags | `None` | +| cluster_log_conf | `None` | +| enable_elastic_disk | `None` | +| cluster_source | `None` | +| instance_pool_id | `None` | +| headers | `None` | + + +The created cluster +![databricks_cluster.png](/assets/images/jsl_lib/install/databricks_cluster.png) + + + ### License Variables Names for JSON and OS variables The following variable names are checked when using a JSON or environment variables based approach for installing @@ -330,7 +362,7 @@ I.e. provide the files somehow on your offline machine. jsl.install(offline=True) ``` -### Into a freshly created Databricks cluster +### Into a freshly created Databricks cluster automatically To install in databricks you must provide your `accessToken` and `hostUrl`. You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` @@ -342,6 +374,11 @@ Your can get it from jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) ``` +### Into Existing Databricks cluster Manual +If you do not wish to use the recommended **automatic installation** but instead want to install manually +you must install the `johnsnowlabs_for_databricks` pypi package instead of `johnsnowlabs` via the UI or any method of your choice. +![databricks_manual.png](/assets/images/jsl_lib/install/databricks_manual.png) + # Storage of License Data and License Search behaviour diff --git a/docs/en/jsl_home.md b/docs/en/jsl_home.md index 181ea6b2..2e4d43cf 100644 --- a/docs/en/jsl_home.md +++ b/docs/en/jsl_home.md @@ -24,7 +24,7 @@ This will ignore bad secret versions. ```python from johnsnowlabs import * jsl.settings.enforce_versions=False -jsl.install(secret='1.2.3-My.Custom.Secret') +jsl.install(secret='1.2.3-My.Custom.or.Outdated.Secret') ``` diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md new file mode 100644 index 00000000..5ed9fa66 --- /dev/null +++ b/docs/en/jsl_release_notes.md @@ -0,0 +1,25 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Utilities for Databricks +permalink: /docs/en/jsl-release-notes +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
    +The John Snow Labs 4.2.0 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.0` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + +
    \ No newline at end of file diff --git a/docs/en/testing_utils_modelshub.md b/docs/en/testing_utils_modelshub.md new file mode 100644 index 00000000..5297c610 --- /dev/null +++ b/docs/en/testing_utils_modelshub.md @@ -0,0 +1,72 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Utilities for Testing Models & Modelshub Code Snippets +permalink: /docs/en/testing-utils-modelshub +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
    + +You can use the John Snow Labs library to automatically test 10000+ models and 100+ Notebooks in 1 line of code within +a small machine like a **single Google Colab Instance** and generate very handy error reports of potentially broken Models, Notebooks or Models hub Markdown Snippets. + +You can test the following things with the `test_markdown()` function : + +- A `local` Models Hub Markdown snippet via path. +- a `remote` Models Hub Markdown snippet via URL. +- a `local` folder of Models Hub Markdown files. Generates report +- a `list` of local paths or urls to .md files. Generates a report + +Test-Report Pandas Dataframe has the columns: + +| Report Column | Description | +|---------------|---------------------------------------------------------------| +| `test_script` | is the generated script for testing | +| `stderr` | Error logs of process ran. Print this to easily read | +| `stderr` | Standard Print logs of process ran. Print this to easily read | +| `success` | True if script ran successfully from top to bottom | +| `notebook` | The Source notebook for testing | + + + + + + + +### Test a Local Models Hub Markdown Snippet + +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('path/to/my/file.md') +``` + +### Test a Remote Models Hub Markdown Snippet + +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('https://nlp.johnsnowlabs.com/2022/08/31/legpipe_deid_en.html') +``` + +### Test a Folder with Models Hub Markdown Snippets +This will scan the folder for all files ending with `.md` , test them and generate a report +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('my/markdown/folder') +``` + +### Test a List of Markdown References +Can be mixed with Urls and paths, will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +md_to_test = ['legpipe_deid_en.html', + 'path/to/local/markdown_snippet.md',] +test_ipynb(md_to_test) +``` + + + + +
    \ No newline at end of file diff --git a/docs/en/testing_utils_notebook.md b/docs/en/testing_utils_notebook.md new file mode 100644 index 00000000..600f6fff --- /dev/null +++ b/docs/en/testing_utils_notebook.md @@ -0,0 +1,126 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Utilities for Testing Notebooks +permalink: /docs/en/testing-utils-notebooks +key: docs-install +modify_date: "2020-05-26" +header: true +--- + + + +
    + +You can use the John Snow Labs library to automatically test 10000+ models and 100+ Notebooks in 1 line of code within +a small machine like a **single Google Colab Instance** and generate very handy error reports of potentially broken Models, Notebooks or Models hub Markdown Snippets. + +You can test the following things with the `test_ipynb()` function : + + +- A `local` .ipynb file +- a `remote` .ipynb URL, point to RAW githubuser content URL of the file when using git. +- a `local` folder of ipynb files, generates report +- a `list` of local paths or urls to .ipynb files. Generates a Report +- The entire [John Snow Labs Workshop Certification Folder](https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings) Generates a Report +- A sub-folder of the [John Snow Labs Workshop Certification Folder](https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings) , i.e. only OCR or only Legal. Generates a Report + + + + +The generated Test-Report Pandas Dataframe has the columns: + +| Report Column | Description | +|---------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `test_script` | is the generated script for testing. If you think the notebook should not crash, check the file, there could be a generation error. | +| `stderr` | Error logs of process ran. Print this to easily read | +| `stderr` | Standard Print logs of process ran. Print this to easily read | +| `success` | True if script ran successfully from top to bottom | +| `notebook` | The Source notebook for testing | + + + + + + + +### Test a Local Notebook + +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('path/to/local/notebook.ipynb') +``` + +### Test a Remote Notebook + +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/5.Spark_OCR.ipynb',) +``` + +### Test a Folder with Notebooks +This will scan the folder for all files ending with `.ipynb` , test them and generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('my/notebook/folder') +``` + + + +### Test a List of Notebook References +Can be mixed with Urls and paths, will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +nb_to_test = [ + 'https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/5.Spark_OCR.ipynb', + 'path/to/local/notebook.ipynb',] +test_ipynb(nb_to_test) +``` + + +### Run All Certification Notebooks +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP') +``` + + + + +### Run Finance Certification Notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-FIN') +``` + +### Run Legal notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-LEG') +``` + +### Run Medical notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-MED') +``` + +### Run Open Source notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-OS') +``` + + + + + + + + +
    \ No newline at end of file From 1482b7616a83f7f5828ec91dbaceb3fd4befc4d4 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Thu, 6 Oct 2022 13:08:39 +0200 Subject: [PATCH 18/26] Doc Updates --- docs/_data/navigation.yml | 4 ++-- docs/en/install.md | 30 +++++++++++++++++++++++------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index bb5a5c2a..cd104d17 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -34,12 +34,12 @@ docs-en: url: /docs/en/import-structure - title: Utilities for Databricks url: /docs/en/databricks-utils + - title: Settings & Cache Folder + url: /docs/en/john-snow-labs-home - title: Utilities for Testing Notebooks url: /docs/en/testing-utils-notebooks - title: Utilities for Testing NLP Models & Modelhub url: /docs/en/testing-utils-modelshub - - title: Settings & Cache Folder - url: /docs/en/john-snow-labs-home - title: John Snow Labs Release Notes url: /docs/en/jsl-release-notes - title: NLU diff --git a/docs/en/install.md b/docs/en/install.md index 5f584fa4..2f31d779 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -416,10 +416,11 @@ If you do not wish to use the recommended **automatic installation** but instead you must install the `johnsnowlabs_for_databricks` pypi package instead of `johnsnowlabs` via the UI or any method of your choice. ![databricks_manual.png](/assets/images/jsl_lib/install/databricks_manual.png) -
    {:.h2-select} -# Storage of License Data and License Search behaviour +## License Management & Caching + +## Storage of License Data and License Search behaviour The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . After having provided license data once, you don't need to specify it again since the cached licensed will be used. @@ -468,11 +469,26 @@ Name of the json file does not matter, file just needs to end with .json ## Upgrade Flow -The John Snow Labs Teams are working early to push out new Releases and Features each week! +**Step 1:** Upgrade the johnsnowlabs library. +```shell +pip install johnsnowlabs --upgrade +``` +**Step 2:** Run install again, while using one [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview). +```python +jsl.install() +``` + + + +The John Snow Labs Teams are working early to push out new Releases and Features each week! Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. +Once the johnsnowlabs library is upgraded, it will detect any out-dated libraries any inform you +that you can upgrade them by running `jsl.install()` again. +You must run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again, +to gian access to the latest enterprise libraries. -For updating **licensed libraries** you must in addition also run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again. -They will be used to fetch the latest licensed library and install them to your target +{:.h2-select} +## Next Steps & Frequently Asked Questions
    -### Where to go next +## Where to go next If you want to get your hands dirty with any of the features check out the [NLU examples page](examples), or [Licensed Annotators Overview](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) From aff5e6f306fb0bf9138bd2b2ed5ea086a91575b5 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Thu, 6 Oct 2022 15:12:03 +0200 Subject: [PATCH 19/26] Doc Updates --- docs/en/install.md | 69 +++++++++++++----------------- docs/en/start_sparkseession.md | 17 ++++---- docs/en/testing_utils_modelshub.md | 4 +- docs/en/testing_utils_notebook.md | 2 +- 4 files changed, 41 insertions(+), 51 deletions(-) diff --git a/docs/en/install.md b/docs/en/install.md index 6743544d..3346b92c 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -26,18 +26,14 @@ To quickly test the installation, you can run in your Shell: ```shell python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" ``` - or in Python: - ```python from johnsnowlabs import * jsl.load('emotion').predict('Wow that easy!') ``` - The quickest way to get access to **licensed libraries** like [Finance NLP, Legal NLP, Healthcare NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr) is to run the following in python: - ```python from johnsnowlabs import * jsl.install() @@ -74,8 +70,7 @@ The following is a more detailed overview of the alternative installation method The parameters of `jsl.install()`parameters fall into 3 categories: - **Authorization Flow Choice & Auth Flow Tweaks** -- **Installation Target** such as `Airgap Offline`, `Databricks`, `new Pytho Venv` - , `Currently running Python Enviroment`, +- **Installation Targets** such as `Airgap Offline`, `Databricks`, `new Pytho Venv`, `Currently running Python Enviroment`, or `target Python Environment` - **Installation process tweaks** @@ -95,20 +90,20 @@ libraries. Once access to your license is provided, it is cached locally `~/.johnsnowlabs/licenses` and re-used when calling `jst.start()` and `jsl.install()`, so you don't need to authorize again. Only 1 licenses can be provided and will be cached during authorization flows. -If you have multiple licenses you can re-run an authorization method and use the `license_number` parameter choose +If you have multiple licenses you can re-run an authorization method and use the `local_license_number` and `remote_license_number` parameter choose between licenses you have access to. Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour). -| Auth Flow Method | Description | Python `jsl.install()` usage | -|--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license | `jsl.install()` | -| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visit new page to give access to your license | `jsl.install()` | -| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | -| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | -| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | -| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | -| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
    Use `license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | -| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | +| Auth Flow Method | Description | Python `jsl.install()` usage | +|--------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license. Use `remote_license_number` parameter to choose between licenses. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | +| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visit new page to give access to your license. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | +| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | +| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | +| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | +| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | +| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
    Use `local_license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | +| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` |
    @@ -116,13 +111,14 @@ Licenses are locally numbered in order they have been provided, for more info se Use these parameters to configure **the preferred authorization flow**. -| Parameter | description | -|----------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True`. | -| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have several ones. | -| `license_number` | Specify the license number to use with OAuth based approaches or when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use your 0th license from my.johnsnowlabs.com. | +| Parameter | description | +|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True`. | +| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have several ones. | +| `local_license_number` | Specify the license number when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use the very first license every provided to the johnsnowlabs library. | +| `remote_license_number` | Specify the license number to use with OAuth based approaches. Defaults to `0` which will use your first license from my.johnsnowlabs.com. | | `store_in_jsl_home` | By default license data and Jars/Wheels are stored in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify on every run.
    Set to `False` to disable this caching behaviour.
    | -| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False`. | +| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False`. |
    diff --git a/docs/en/start_sparkseession.md b/docs/en/start_sparkseession.md index 2561f36a..146b0519 100644 --- a/docs/en/start_sparkseession.md +++ b/docs/en/start_sparkseession.md @@ -27,14 +27,15 @@ Outputs of running `jsl.start()` tell you which jars are loaded and versions of Most of the authorization Flows and Parameters of `jsl.install()` are supported. Review detailed [docs here](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) -| Parameter | Description | Example | Default | -|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| -| `None` | Load license automatically via one of the **Auto-Detection Mechanisms** | `jsl.start()` | `False` | -| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | -| `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](http://nlu.johnsnowlabs.com/docs/en/install#via-access-token) | `jsl.start(access_token='myToken')` | `None` | -| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | -| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | -| `license_number` | Specify which license to use, if you have access to multiple locally cached or are loading one from [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` | +| Parameter | Description | Example | Default | +|-------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|---------| +| `None` | Load license automatically via one of the **Auto-Detection Mechanisms** | `jsl.start()` | `False` | +| `browser_login` | Browser based authorization, Button to click on Notebooks and Browser Pop-Up otherwise. | `jsl.start(browser_login=True)` | `False` | +| `access_token` | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](http://nlu.johnsnowlabs.com/docs/en/install#via-access-token) | `jsl.start(access_token='myToken')` | `None` | +| `secrets_file` | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.start(secrets_file='path/to/license.json')` | `None` | +| `store_in_jsl_home` | Disable caching of new licenses to `~./jsl_home` | `jsl.start(store_in_jsl_home=False)` | `True` | +| `local_license_number` | Specify which license to use, if you have access to multiple locally cached | `jsl.start(license_number=5)` | `0` | +| `remote_license_number` | Specify which license to use, if you have access to multiple via OAUTH on [my.jsl.com](https://my.johnsnowlabs.com/) | `jsl.start(license_number=5)` | `0` |
    diff --git a/docs/en/testing_utils_modelshub.md b/docs/en/testing_utils_modelshub.md index 5297c610..34108ab3 100644 --- a/docs/en/testing_utils_modelshub.md +++ b/docs/en/testing_utils_modelshub.md @@ -26,7 +26,7 @@ Test-Report Pandas Dataframe has the columns: |---------------|---------------------------------------------------------------| | `test_script` | is the generated script for testing | | `stderr` | Error logs of process ran. Print this to easily read | -| `stderr` | Standard Print logs of process ran. Print this to easily read | +| `stdout` | Standard Print logs of process ran. Print this to easily read | | `success` | True if script ran successfully from top to bottom | | `notebook` | The Source notebook for testing | @@ -54,7 +54,7 @@ test_markdown('https://nlp.johnsnowlabs.com/2022/08/31/legpipe_deid_en.html') This will scan the folder for all files ending with `.md` , test them and generate a report ```python from johnsnowlabs.utils.modelhub_markdown import test_markdown -test_markdown('my/markdown/folder') +test_ipynb('my/markdown/folder') ``` ### Test a List of Markdown References diff --git a/docs/en/testing_utils_notebook.md b/docs/en/testing_utils_notebook.md index 600f6fff..2bf7e35e 100644 --- a/docs/en/testing_utils_notebook.md +++ b/docs/en/testing_utils_notebook.md @@ -34,7 +34,7 @@ The generated Test-Report Pandas Dataframe has the columns: |---------------|-------------------------------------------------------------------------------------------------------------------------------------| | `test_script` | is the generated script for testing. If you think the notebook should not crash, check the file, there could be a generation error. | | `stderr` | Error logs of process ran. Print this to easily read | -| `stderr` | Standard Print logs of process ran. Print this to easily read | +| `stdout` | Standard Print logs of process ran. Print this to easily read | | `success` | True if script ran successfully from top to bottom | | `notebook` | The Source notebook for testing | From 8855e758583f7e8b36392e52261ef1f430d54b24 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Thu, 6 Oct 2022 15:15:00 +0200 Subject: [PATCH 20/26] Doc Updates --- docs/en/jsl_release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md index 5ed9fa66..ac55bf42 100644 --- a/docs/en/jsl_release_notes.md +++ b/docs/en/jsl_release_notes.md @@ -1,7 +1,7 @@ --- layout: docs seotitle: NLU | John Snow Labs -title: Utilities for Databricks +title: John Snow Labs Release Notes permalink: /docs/en/jsl-release-notes key: docs-install modify_date: "2020-05-26" From f7ee27e4e6dd144faaba42b1d923df2bc849885b Mon Sep 17 00:00:00 2001 From: Christian Kasim Loan Date: Thu, 6 Oct 2022 16:21:35 +0200 Subject: [PATCH 21/26] Update testing_utils_modelshub.md --- docs/en/testing_utils_modelshub.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/en/testing_utils_modelshub.md b/docs/en/testing_utils_modelshub.md index 34108ab3..4c919130 100644 --- a/docs/en/testing_utils_modelshub.md +++ b/docs/en/testing_utils_modelshub.md @@ -54,7 +54,7 @@ test_markdown('https://nlp.johnsnowlabs.com/2022/08/31/legpipe_deid_en.html') This will scan the folder for all files ending with `.md` , test them and generate a report ```python from johnsnowlabs.utils.modelhub_markdown import test_markdown -test_ipynb('my/markdown/folder') +test_markdown('my/markdown/folder') ``` ### Test a List of Markdown References @@ -63,10 +63,10 @@ Can be mixed with Urls and paths, will generate a report from johnsnowlabs.utils.notebooks import test_ipynb md_to_test = ['legpipe_deid_en.html', 'path/to/local/markdown_snippet.md',] -test_ipynb(md_to_test) +test_markdown(md_to_test) ``` -
    \ No newline at end of file +
    From fc5175e1c48ecdb6dfe2593b594e26a814a582c1 Mon Sep 17 00:00:00 2001 From: C-K-Loan Date: Mon, 14 Nov 2022 20:46:16 +0100 Subject: [PATCH 22/26] Doc Updates --- docs/_data/navigation.yml | 110 +++--- docs/en/concepts.md | 275 ++++++++++----- docs/en/examples.md | 120 +++---- docs/en/examples_healthcare.md | 2 +- docs/en/install.md | 498 +--------------------------- docs/en/install_advanced.md | 509 ++++++++++++++++++++++++++++ docs/en/install_licensed_quick.md | 43 +++ docs/en/jsl_release_notes.md | 35 ++ docs/en/license_management.md | 64 ++++ docs/en/load_api.md | 54 +-- docs/en/model_namespace.md | 16 +- docs/en/nlp_pipelines.md | 469 ++++++++++++++++++++++++++ docs/en/nlu_for_ocr.md | 18 +- docs/en/notebooks.md | 125 +++---- docs/en/predict_api.md | 103 +++--- docs/en/quick_start_finance.md | 320 ++++++++++++++++++ docs/en/quick_start_legal.md | 339 +++++++++++++++++++ docs/en/quick_start_medical.md | 308 +++++++++++++++++ docs/en/quick_start_visuale.md | 192 +++++++++++ docs/en/release_notes.md | 4 +- docs/en/streamlit_viz_examples.md | 533 +++++++++++++++++------------- docs/en/testing_utils.md | 186 +++++++++++ docs/en/testing_utils_notebook.md | 5 - docs/en/training.md | 71 ++-- docs/en/utils_for_sparknlp.md | 22 +- docs/en/viz_examples.md | 56 ++-- 26 files changed, 3340 insertions(+), 1137 deletions(-) create mode 100644 docs/en/install_advanced.md create mode 100644 docs/en/install_licensed_quick.md create mode 100644 docs/en/license_management.md create mode 100644 docs/en/nlp_pipelines.md create mode 100644 docs/en/quick_start_finance.md create mode 100644 docs/en/quick_start_legal.md create mode 100644 docs/en/quick_start_medical.md create mode 100644 docs/en/quick_start_visuale.md create mode 100644 docs/en/testing_utils.md diff --git a/docs/_data/navigation.yml b/docs/_data/navigation.yml index cd104d17..c00dce3a 100644 --- a/docs/_data/navigation.yml +++ b/docs/_data/navigation.yml @@ -17,70 +17,86 @@ header: url: /docs/en/notebooks key: tutorial_notebooks - title: Spellbook - url: /docs/en/spellbook + url: /docs/en/namespace key: tutorial_notebooks - title: '' url: https://github.com/JohnSnowLabs/nlu - title: '' url: https://join.slack.com/t/spark-nlp/shared_invite/zt-lutct9gm-kuUazcyFKhuGY3_0AMkxqA docs-en: - - title: John Snow Labs + - title: Open Source NLP children: - title: Installation url: /docs/en/install - - title: Starting a Spark Session - url: /docs/en/start-a-sparksession - - title: John Snow Labs Usage & Overview - url: /docs/en/import-structure - - title: Utilities for Databricks - url: /docs/en/databricks-utils - - title: Settings & Cache Folder - url: /docs/en/john-snow-labs-home - - title: Utilities for Testing Notebooks - url: /docs/en/testing-utils-notebooks - - title: Utilities for Testing NLP Models & Modelhub - url: /docs/en/testing-utils-modelshub - - title: John Snow Labs Release Notes - url: /docs/en/jsl-release-notes - - title: NLU - children: - - title: NLU Usage + - title: Quick Start url: /docs/en/concepts - - title: General NLU Examples - url: /docs/en/examples - - title: NLU for Healthcare - url: /docs/en/nlu_for_healthcare - - title: NLU for Healthcare Examples - url: /docs/en/examples_hc - - title: NLU for OCR - url: /docs/en/nlu_for_ocr - - title: Training Models + - title: nlp.load() + url: /docs/en/load_api + - title: predict() + url: /docs/en/predict_api + - title: fit() url: /docs/en/training - - title: Tutorial Notebooks - url: /docs/en/notebooks - - title: Visualization Examples + - title: viz() url: /docs/en/viz_examples - - title: Streamlit Visualizations + - title: dashboard() url: /docs/en/streamlit_viz_examples key: streamlit_viz - - title: Spellbook - url: /docs/en/spellbook - - title: Utilities for Spark NLP + - title: 1-liner Tutorial Notebooks + url: /docs/en/notebooks + - title: 1-liners Reference + url: /docs/en/examples + - title: NLP Pipelines + url: /docs/en/nlp_pipes + key: nlp_pipes + - title: NLP Display + url: https://nlp.johnsnowlabs.com/docs/en/display + key: nlp_display + - title: Annotation Lab + url: https://nlp.johnsnowlabs.com/docs/en/utility_helper_modules + key: nlp_display + - title: NLP Utilities url: /docs/en/utils_for_spark_nlp - - - - title: Documentation - children: - - title: NLU Load Function - url: /docs/en/load_api - - title: NLU Predict Function - url: /docs/en/predict_api - - -# - title: Pydocs -# url: /api/ + - title: Models Namespace + url: /docs/en/namespace - title: NLU Release Notes url: /docs/en/release_notes + - title: Release Notes + url: /docs/en/jsl-release-notes + - title: Licensed NLP + children: + - title: Installation + url: /docs/en/install_licensed_quick + - title: Visual NLP + url: /docs/en/quickstart_visual + - title: Medical NLP + url: /docs/en/quickstart_medical + - title: Finance NLP + url: /docs/en/quickstart_finance + - title: Legal NLP + url: /docs/en/quickstart_legal + - title: Visual NLP 1-Liners + url: /docs/en/nlu_for_ocr + - title: Medical NLP 1-Liners + url: /docs/en/examples_hc + - title: Medical NLP 1-Liners Reference + url: /docs/en/nlu_for_healthcare + + - title: Advanced Topics + children: + - title: Custom Installation + url: /docs/en/install_advanced + - title: License Management + url: /docs/en/license_management + - title: Configuring Session + url: /docs/en/start-a-sparksession + - title: Settings & Cache Folder + url: /docs/en/john-snow-labs-home + - title: Utilities for Databricks + url: /docs/en/databricks-utils + - title: Release Testing Utilities + url: /docs/en/testing-utils + - title: Module Structure + url: /docs/en/import-structure extras: diff --git a/docs/en/concepts.md b/docs/en/concepts.md index 09877c4d..44b20ebe 100644 --- a/docs/en/concepts.md +++ b/docs/en/concepts.md @@ -2,7 +2,7 @@ layout: docs header: true seotitle: NLU | John Snow Labs -title: NLU Concepts +title: Quick Start permalink: /docs/en/concepts key: docs-concepts modify_date: "2020-05-08" @@ -10,109 +10,228 @@ modify_date: "2020-05-08"
    -The NLU library provides 2 simple methods with which most NLU tasks can be solved while achieving state of the art results. -The **load** and **predict** method. +## Load & Predict 1 liner -When building a NLU programm you will usually go through the following steps : +The `johnsnowlabs` library provides 2 simple methods with which most NLP tasks can be solved while achieving state-of-the-art +results. +The **load** and **predict** method. -1. Pick a model/pipeline/component you want to create from the [NLU spellbook](/docs/en/spellbook) -2. Call the nlu.load(component) method which returns a NLU model pipeline object -3. Call model.predict() on some String input +when building a `load&predict` based model you will follow these steps: + +1. Pick a model/pipeline/component you want to create from the [Namespace](/docs/en/namespace) +2. Call the `model = nlp.load(component)` method which will return an auto-completed pipeline +3. Call `model.predict('that was easy')` on some String input + +These 3 steps can be boiled down to **just 1 line** -These 3 steps have been boiled down to **just 1 line** ```python -import nlu -nlu.load('sentiment').predict('How does this witchcraft work?') +from johnsnowlabs import nlp +nlp.load('sentiment').predict('How does this witchcraft work?') ```
    -## NLU components -NLU defines a universe of NLU components which can be viewed as stackable and interchangeable parts, inspired by methodology of category theory. -Inside of this NLU universe, arbitrary machine learning pipelines can be constructed from its elements. +`jsl.load()` defines **18 components types** usable in 1-liners, some can be prefixed with `.train` for [training models](/docs/en/training) -NLU currently defines **18 components types** in its universe. -Each component type embelishes one of many **component kinds**. -Each component kind embelished one of many **NLU algorithms**. -NLU algorithms are represented by pretrained models or pipelines. -A **pretrained model** could be a Deep Neural Network or a simple word matcher. -A **pipeline** consists of a stack of pretrained models. - -
    -### NLU component types - -Any of the actions for the component types can be passed as a string to nlu.load() and will return you the default model for that component type for the English language. +Any of the actions for the component types can be passed as a string to nlp.load() and will return you the default model +for that component type for the English language. You can further specify your model selection by placing a '.' behind your component selection. After the '.' you can specify the model you want via specifying a dataset or model version. -See [the NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) and [The load function](https://nlu.johnsnowlabs.com/docs/en/load_api) - -{:.table-model-big} -|Component type| nlu.load() action reference | -|--------------|--------------------------------| -|Named Entity Recognition(NER) | ner | -|Part of Speech (POS) | pos | -|Classifiers | classify | -|Word embeddings| embed| -|Sentence embeddings| embed_sentence| -|Chunk embeddings| embed_chunk| -|Labeled dependency parsers| dep -|Unlabeled dependency parsers| dep.untyped -|Lemmatizers| lemma| -|Matchers| match| -|Normalizers| norm| -|Sentence detectors| sentence_detector | -|Chunkers| chunk | -|Spell checkers| spell | -|Stemmers|stem | -|Stopwords cleaners| stopwords | -|Cleaner| clean | -|N-Grams| ngram | -|Tokenizers| tokenize | +See [the Models Hub](https://nlp.johnsnowlabs.com/models), [the Components Namespace](https://nlp.johnsnowlabs.com/docs/en/namespace) +and [The load function](https://nlp.johnsnowlabs.com/docs/en/load_api) for more infos.
    +{:.table-model-big} +| Component type | nlp.load() base | +|-------------------------------|-------------------------------| +| Named Entity Recognition(NER) | `nlp.load('ner')` | +| Part of Speech (POS) | `nlp.load('pos')` | +| Classifiers | `nlp.load('classify')` | +| Word embeddings | `nlp.load('embed')` | +| Sentence embeddings | `nlp.load('embed_sentence')` | +| Chunk embeddings | `nlp.load('embed_chunk')` | +| Labeled dependency parsers | `nlp.load('dep')` | +| Unlabeled dependency parsers | `nlp.load('dep.untyped')` | +| Legitimatizes | `nlp.load('lemma')` | +| Matchers | `nlp.load('match')` | +| Normalizers | `nlp.load('norm')` | +| Sentence detectors | `nlp.load('sentence_detector')` | +| Chunkers | `nlp.load('chunk')` | +| Spell checkers | `nlp.load('spell')` | +| Stemmers | `nlp.load('stem')` | +| Stopwords cleaners | `nlp.load('stopwords')` | +| Cleaner | `nlp.load('clean')` | +| N-Grams | `nlp.load('ngram')` | +| Tokenizers | `nlp.load('tokenize')` | + +## Annotator & PretrainedPipeline based pipelines +You can create [Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/concepts) using all the classes +attached to the `nlp` module. + + +`nlp.PretrainedPipeline('pipe_name')` gives access to [Pretrained Pipelines](https://nlp.johnsnowlabs.com/models?type=pipeline) -## Specify language for an action - -### Print all supported languages -Any of these are partial NLU references which can be prefixed to a request to specify a language ```python -nlu.languages() +from johnsnowlabs import nlp +from pprint import pprint + +nlp.start() +explain_document_pipeline = nlp.PretrainedPipeline("explain_document_ml") +annotations = explain_document_pipeline.annotate("We are very happy about SparkNLP") +pprint(annotations) + +OUTPUT: +{ + 'stem': ['we', 'ar', 'veri', 'happi', 'about', 'sparknlp'], + 'checked': ['We', 'are', 'very', 'happy', 'about', 'SparkNLP'], + 'lemma': ['We', 'be', 'very', 'happy', 'about', 'SparkNLP'], + 'document': ['We are very happy about SparkNLP'], + 'pos': ['PRP', 'VBP', 'RB', 'JJ', 'IN', 'NNP'], + 'token': ['We', 'are', 'very', 'happy', 'about', 'SparkNLP'], + 'sentence': ['We are very happy about SparkNLP'] +} + ``` -
    -### Print every component for one specific language -These are complete NLU references and can be passed to the nlu.load() method right away +### Custom Pipes +Alternatively you can compose [Annotators](https://nlp.johnsnowlabs.com/docs/en/annotators) into a pipeline which offers the highest degree of customization ```python -# Print every German NLU component -nlu.print_components(lang='de') +from johnsnowlabs import nlp +spark = nlp.start(nlp=False) +pipe = nlp.Pipeline(stages= +[ + nlp.DocumentAssembler().setInputCol('text').setOutputCol('doc'), + nlp.Tokenizer().setInputCols('doc').setOutputCol('tok') +]) +spark_df = spark.createDataFrame([['Hello NLP World']]).toDF("text") +pipe.fit(spark_df).transform(spark_df).show() ``` -
    -### Print every model for an action -These are complete NLU references and can be passed to the nlu.load() method right away -```python -# Print every lemmatizer for every language -nlu.print_components(action='lemma') -``` -
    +[//]: # (
    ) -### Print every model kind for an action and a language -These are complete NLU references and can be passed to the nlu.load() method right away -```python -# Print all english classifiers -nlu.print_components(lang='en', action='classify') -``` -
    -### Print the entire NLU spellbook offering -These are complete NLU references and can be passed to the nlu.load() method right away -```python -nlu.print_components() -``` +[//]: # () +[//]: # () +[//]: # (## Specify language for an action) + +[//]: # () +[//]: # () +[//]: # (### Print all supported languages) + +[//]: # () +[//]: # () +[//]: # (Any of these are partial NLU references which can be prefixed to a request to specify a language) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.languages()) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every component for one specific language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every German NLU component) + +[//]: # () +[//]: # (nlp.print_components(lang='de')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model for an action) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every lemmatizer for every language) + +[//]: # () +[//]: # (nlp.print_components(action='lemma')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model kind for an action and a language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print all english classifiers) + +[//]: # () +[//]: # (nlp.print_components(lang='en', action='classify')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print the entire NLU spellbook offering) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.print_components()) + +[//]: # () +[//]: # (```)
    \ No newline at end of file diff --git a/docs/en/examples.md b/docs/en/examples.md index 13857ed6..589b0568 100644 --- a/docs/en/examples.md +++ b/docs/en/examples.md @@ -2,7 +2,7 @@ layout: docs header: true seotitle: NLU | John Snow Labs -title: Examples +title: 1-liners reference key: docs-examples permalink: /docs/en/examples modify_date: "2019-05-16" @@ -10,12 +10,12 @@ modify_date: "2019-05-16"
    -## Usage examples of NLU.load() +## Usage examples of nlp.load() The following examples demonstrate how to use nlu's load api accompanied by the outputs generated by it. It enables loading any model or pipeline in one line You need to pass one NLU reference to the load method. You can also pass multiple whitespace separated references. -[You can find all NLU references here](https://nlu.johnsnowlabs.com/docs/en/spellbook) +[You can find all NLU references here](https://nlu.johnsnowlabs.com/docs/en/namespace)
    @@ -51,7 +51,7 @@ Predicts the following 18 NER classes from the ONTO dataset :
    ```python -nlu.load('ner').predict('Angela Merkel from Germany and the American Donald Trump dont share many opinions') +nlp.load('ner').predict('Angela Merkel from Germany and the American Donald Trump dont share many opinions') ```
    @@ -81,7 +81,7 @@ Predicts the following NER classes from the CONLL dataset : |O| Everything that is not an entity. | ```python -nlu.load('ner.conll').predict('Angela Merkel from Germany and the American Donald Trump dont share many opinions') +nlp.load('ner.conll').predict('Angela Merkel from Germany and the American Donald Trump dont share many opinions') ```
    @@ -146,7 +146,7 @@ POS Classifies each token with one of the following tags
    ```python -nlu.load('pos').predict('Part of speech assigns each token in a sentence a grammatical label') +nlp.load('pos').predict('Part of speech assigns each token in a sentence a grammatical label') ``` {:.table-model-big.mb0} @@ -173,7 +173,7 @@ Classifies text as one of 4 categories (joy, fear, surprise, sadness) ```python -nlu.load('emotion').predict('I love NLU!') +nlp.load('emotion').predict('I love NLU!') ```
    @@ -190,7 +190,7 @@ nlu.load('emotion').predict('I love NLU!') Classifies binary sentiment for every sentence, either positive or negative. ```python -nlu.load('sentiment').predict("I hate this guy Sami") +nlp.load('sentiment').predict("I hate this guy Sami") ```
    @@ -310,7 +310,7 @@ The classes are the following : ```python -nlu.load('en.classify.trec50').predict('How expensive is the Watch?') +nlp.load('en.classify.trec50').predict('How expensive is the Watch?') ```
    @@ -326,7 +326,7 @@ nlu.load('en.classify.trec50').predict('How expensive is the Watch?') [Fake News Classifier example](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/fake_news_classification.ipynb) ```python -nlu.load('en.classify.fakenews').predict('Unicorns have been sighted on Mars!') +nlp.load('en.classify.fakenews').predict('Unicorns have been sighted on Mars!') ```
    @@ -343,7 +343,7 @@ nlu.load('en.classify.fakenews').predict('Unicorns have been sighted on Mars!') Classifies sexism and racism ```python -nlu.load('en.classify.cyberbullying').predict('Women belong in the kitchen.') # sorry we really don't mean it +nlp.load('en.classify.cyberbullying').predict('Women belong in the kitchen.') # sorry we really don't mean it ```
    @@ -359,7 +359,7 @@ nlu.load('en.classify.cyberbullying').predict('Women belong in the kitchen.') # [Spam Classifier example](https://colab.research.google.com/drive/1u-8Fs3Etz07bFNx0CDV_le3Xz73VbK0z?usp=sharing) ```python -nlu.load('en.classify.spam').predict('Please sign up for this FREE membership it costs $$NO MONEY$$ just your mobile number!') +nlp.load('en.classify.spam').predict('Please sign up for this FREE membership it costs $$NO MONEY$$ just your mobile number!') ```
    @@ -375,7 +375,7 @@ nlu.load('en.classify.spam').predict('Please sign up for this FREE membership it [Sarcasm Classifier example](https://colab.research.google.com/drive/1XffsjlRp9wxZgxyYvEF9bG2CiX-pjBEw?usp=sharing) ```python -nlu.load('en.classify.sarcasm').predict('gotta love the teachers who give exams on the day after halloween') +nlp.load('en.classify.sarcasm').predict('gotta love the teachers who give exams on the day after halloween') ```
    @@ -391,7 +391,7 @@ nlu.load('en.classify.sarcasm').predict('gotta love the teachers who give exams [Movie Review Sentiment Classifier example](https://colab.research.google.com/drive/1k5x1zxnG4bBkmYAc-bc63sMA4-oQ6-dP?usp=sharing) ```python -nlu.load('en.sentiment.imdb').predict('The Matrix was a pretty good movie') +nlp.load('en.sentiment.imdb').predict('The Matrix was a pretty good movie') ```
    @@ -407,7 +407,7 @@ nlu.load('en.sentiment.imdb').predict('The Matrix was a pretty good movie') [Twitter Sentiment Classifier Example](https://colab.research.google.com/drive/1H1Gekn2qzXzOf5rrT8LmHmmuoOGsiu8m?usp=sharing) ```python -nlu.load('en.sentiment.twitter').predict('@elonmusk Tesla stock price is too high imo') +nlp.load('en.sentiment.twitter').predict('@elonmusk Tesla stock price is too high imo') ```
    @@ -425,7 +425,7 @@ Classifies the following 20 languages : Bulgarian, Czech, German, Greek, English, Spanish, Finnish, French, Croatian, Hungarian, Italy, Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, Swedish, Turkish, and Ukrainian ```python -nlu.load('lang').predict(['NLU is an open-source text processing library for advanced natural language processing for the Python.','NLU est une bibliothèque de traitement de texte open source pour le traitement avancé du langage naturel pour les langages de programmation Python.']) +nlp.load('lang').predict(['NLU is an open-source text processing library for advanced natural language processing for the Python.','NLU est une bibliothèque de traitement de texte open source pour le traitement avancé du langage naturel pour les langages de programmation Python.']) ```
    @@ -444,7 +444,7 @@ nlu.load('lang').predict(['NLU is an open-source text processing library for adv This is a multi class classifier trained on the E2E [dataset for Natural language generation](http://www.macs.hw.ac.uk/InteractionLab/E2E/#) ```python -nlu.load('e2e').predict('E2E is a dataset for training generative models') +nlp.load('e2e').predict('E2E is a dataset for training generative models') ```
    @@ -464,7 +464,7 @@ nlu.load('e2e').predict('E2E is a dataset for training generative models') ## Toxic Classifier [Toxic Text Classifier example](https://colab.research.google.com/drive/1QRG5ZtAvoJAMZ8ytFMfXj_W8ogdeRi9m?usp=sharing) ```python -nlu.load('en.classify.toxic').predict('You are to stupid') +nlp.load('en.classify.toxic').predict('You are to stupid') ```
    @@ -481,7 +481,7 @@ nlu.load('en.classify.toxic').predict('You are to stupid') [YAKE Keyword Extraction Example](https://colab.research.google.com/drive/1BdomIc1nhrGxLFOpK5r82Zc4eFgnIgaO?usp=sharing) ```python -nlu.load('yake').predict("NLU is a Python Library for beginners and experts in NLP") +nlp.load('yake').predict("NLU is a Python Library for beginners and experts in NLP") ``` @@ -494,7 +494,7 @@ nlu.load('yake').predict("NLU is a Python Library for beginners and experts in N [BERT Word Embeddings example](https://colab.research.google.com/drive/1Rg1vdSeq6sURc48RV8lpS47ja0bYwQmt?usp=sharing) ```python -nlu.load('bert').predict('NLU offers the latest embeddings in one line ') +nlp.load('bert').predict('NLU offers the latest embeddings in one line ') ```
    @@ -518,7 +518,7 @@ nlu.load('bert').predict('NLU offers the latest embeddings in one line ') Bert model pretrained on Bio dataset ```python -nlu.load('biobert').predict('Biobert was pretrained on a medical dataset') +nlp.load('biobert').predict('Biobert was pretrained on a medical dataset') ```
    @@ -542,7 +542,7 @@ nlu.load('biobert').predict('Biobert was pretrained on a medical dataset') Bert model pretrained on COVID dataset ```python -nlu.load('covidbert').predict('Albert uses a collection of many berts to generate embeddings') +nlp.load('covidbert').predict('Albert uses a collection of many berts to generate embeddings') ```
    @@ -565,7 +565,7 @@ nlu.load('covidbert').predict('Albert uses a collection of many berts to generat [ALBERT Word Embeddings examle](https://colab.research.google.com/drive/18yd9pDoPkde79boTbAC8Xd03ROKisPsn?usp=sharing) ```python -nlu.load('albert').predict('Albert uses a collection of many berts to generate embeddings') +nlp.load('albert').predict('Albert uses a collection of many berts to generate embeddings') ```
    @@ -590,7 +590,7 @@ nlu.load('albert').predict('Albert uses a collection of many berts to generate e [ELECTRA Word Embeddings example](https://colab.research.google.com/drive/1FueGEaOj2JkbqHzdmxwKrNMHzgVt4baE?usp=sharing) ```python -nlu.load('electra').predict('He was suprised by the diversity of NLU') +nlp.load('electra').predict('He was suprised by the diversity of NLU') ```
    @@ -613,7 +613,7 @@ nlu.load('electra').predict('He was suprised by the diversity of NLU') [ELMO Word Embeddings example](https://colab.research.google.com/drive/1TtNYB9z0yH8d1ZjfxkH0TVxQ2O_iOYVV?usp=sharing) ```python -nlu.load('elmo').predict('Elmo was trained on Left to right masked to learn its embeddings') +nlp.load('elmo').predict('Elmo was trained on Left to right masked to learn its embeddings') ```
    @@ -639,7 +639,7 @@ nlu.load('elmo').predict('Elmo was trained on Left to right masked to learn its ## Word Embeddings Xlnet [XLNET Word Embeddings example](https://colab.research.google.com/drive/1C9T29QA00yjLuJ1yEMTbjUQMpUv35pHb?usp=sharing) ```python -nlu.load('xlnet').predict('XLNET computes contextualized word representations using combination of Autoregressive Language Model and Permutation Language Model') +nlp.load('xlnet').predict('XLNET computes contextualized word representations using combination of Autoregressive Language Model and Permutation Language Model') ```
    @@ -669,7 +669,7 @@ nlu.load('xlnet').predict('XLNET computes contextualized word representations us [GLOVE Word Embeddings example](https://colab.research.google.com/drive/1IQxf4pJ_EnrIDyd0fAX-dv6u0YQWae2g?usp=sharing) ```python -nlu.load('glove').predict('Glove embeddings are generated by aggregating global word-word co-occurrence matrix from a corpus') +nlp.load('glove').predict('Glove embeddings are generated by aggregating global word-word co-occurrence matrix from a corpus') ```
    @@ -699,7 +699,7 @@ nlu.load('glove').predict('Glove embeddings are generated by aggregating global ```python #This takes around 10GB RAM, watch out! -nlu.load('bert albert electra elmo xlnet use glove').predict('Get all of them at once! Watch your RAM tough!') +nlp.load('bert albert electra elmo xlnet use glove').predict('Get all of them at once! Watch your RAM tough!') ```
    @@ -727,7 +727,7 @@ nlu.load('bert albert electra elmo xlnet use glove').predict('Get all of them at [ELECTRA Sentence Embeddings example](https://colab.research.google.com/drive/1VXHH0ltHF_hXdiRqRlrV_lymAO4ws5PO?usp=sharing) ```python -nlu.load('embed_sentence.electra').predict('He was suprised by the diversity of NLU') +nlp.load('embed_sentence.electra').predict('He was suprised by the diversity of NLU') ```
    @@ -743,7 +743,7 @@ nlu.load('embed_sentence.electra').predict('He was suprised by the diversity of [USE Sentence Embeddings example](https://colab.research.google.com/drive/1gZzOMiCovmrp7z8FIidzDTLS0nt8kPJT?usp=sharing) ```python -nlu.load('use').predict('USE is designed to encode whole sentences and documents into vectors that can be used for text classification, semantic similarity, clustering or oder NLP tasks') +nlp.load('use').predict('USE is designed to encode whole sentences and documents into vectors that can be used for text classification, semantic similarity, clustering or oder NLP tasks') ```
    @@ -759,7 +759,7 @@ nlu.load('use').predict('USE is designed to encode whole sentences and documents [Spell checking example](https://colab.research.google.com/drive/1bnRR8FygiiN3zJz3mRdbjPBUvFsx6IVB?usp=sharing) ```python -nlu.load('spell').predict('I liek pentut buttr ant jely') +nlp.load('spell').predict('I liek pentut buttr ant jely') ``` {:.table-model-big.mb0} @@ -779,7 +779,7 @@ nlu.load('spell').predict('I liek pentut buttr ant jely') ```python -nlu.load('dep.untyped').predict('Untyped Dependencies represent a grammatical tree structure.md') +nlp.load('dep.untyped').predict('Untyped Dependencies represent a grammatical tree structure.md') ```
    @@ -801,7 +801,7 @@ nlu.load('dep.untyped').predict('Untyped Dependencies represent a grammatical tr [Typed Dependency Parsing example](https://colab.research.google.com/drive/1KXUqcF8e-LU9cXnHE8ni8z758LuFPvY7?usp=sharing) ```python -nlu.load('dep').predict('Typed Dependencies represent a grammatical tree structure.md where every edge has a label') +nlp.load('dep').predict('Typed Dependencies represent a grammatical tree structure.md where every edge has a label') ```
    @@ -829,7 +829,7 @@ nlu.load('dep').predict('Typed Dependencies represent a grammatical tree structu [Tokenization example](https://colab.research.google.com/drive/13BC6k6gLj1w5RZ0SyHjKsT2EOwJwbYwb?usp=sharing) ```python -nlu.load('tokenize').predict('Each word and symbol in a sentence will generate token.') +nlp.load('tokenize').predict('Each word and symbol in a sentence will generate token.') ``` {:.table-model-big.mb0} @@ -851,7 +851,7 @@ nlu.load('tokenize').predict('Each word and symbol in a sentence will generate t [Stemmer example](https://colab.research.google.com/drive/1gKTJJmffR9wz13Ms3pDy64jhUI8ZHZYu?usp=sharing) ```python -nlu.load('stem').predict('NLU can get you the stem of a word') +nlp.load('stem').predict('NLU can get you the stem of a word') ``` {:.table-model-big.mb0} @@ -872,7 +872,7 @@ nlu.load('stem').predict('NLU can get you the stem of a word') ## Stopwords Removal [Stopwords Removal example](https://colab.research.google.com/drive/1nWob4u93t2EJYupcOIanuPBDfShtYjGT?usp=sharing) ```python -nlu.load('stopwords').predict('I want you to remove stopwords from this sentence please') +nlp.load('stopwords').predict('I want you to remove stopwords from this sentence please') ``` {:.table-model-big.mb0} @@ -894,7 +894,7 @@ nlu.load('stopwords').predict('I want you to remove stopwords from this sentence ## Lemmatization [Lemmatization example](https://colab.research.google.com/drive/1cBtx9cVCjavt-Oq5TG1lO-9JfUfqznnK?usp=sharing) ```python -nlu.load('lemma').predict('Lemmatizing generates a less noisy version of the inputted tokens') +nlp.load('lemma').predict('Lemmatizing generates a less noisy version of the inputted tokens') ``` {:.table-model-big.mb0} @@ -916,7 +916,7 @@ nlu.load('lemma').predict('Lemmatizing generates a less noisy version of the inp ## Normalizers [Normalizing example](https://colab.research.google.com/drive/1kfnnwkiQPQa465Jic6va9QXTRssU4mlX?usp=sharing) ```python -nlu.load('norm').predict('@CKL_IT says that #normalizers are pretty useful to clean #structured_strings in #NLU like tweets') +nlp.load('norm').predict('@CKL_IT says that #normalizers are pretty useful to clean #structured_strings in #NLU like tweets') ```
    @@ -946,7 +946,7 @@ nlu.load('norm').predict('@CKL_IT says that #normalizers are pretty useful to cl ```python -nlu.load('ngram').predict('Wht a wondful day!') +nlp.load('ngram').predict('Wht a wondful day!') ```
    @@ -961,7 +961,7 @@ nlu.load('ngram').predict('Wht a wondful day!') ## Date Matching [Date Matching example](https://colab.research.google.com/drive/1JrlfuV2jNGTdOXvaWIoHTSf6BscDMkN7?usp=sharing) ```python -nlu.load('match.datetime').predict('In the years 2000/01/01 to 2010/01/01 a lot of things happened') +nlp.load('match.datetime').predict('In the years 2000/01/01 to 2010/01/01 a lot of things happened') ```
    @@ -974,14 +974,14 @@ nlu.load('match.datetime').predict('In the years 2000/01/01 to 2010/01/01 a lot
    ## Entity Chunking -Checkout [see here](https://nlu.johnsnowlabs.com/docs/en/examples#part-of-speech--pos) for all possible POS labels or +Checkout [see here](https://nlp.johnsnowlabs.com/docs/en/examples#part-of-speech--pos) for all possible POS labels or Splits text into rows based on matched grammatical entities. [Entity Chunking Example](https://colab.research.google.com/drive/1svpqtC3cY6JnRGeJngIPl2raqxdowpyi?usp=sharing) ```python # First we load the pipeline -pipe = nlu.load('match.chunks') +pipe = nlp.load('match.chunks') # Now we print the info to see at which index which com,ponent is and what parameters we can configure on them pipe.generate_class_metadata_table() # Lets set our Chunker to only match NN @@ -1029,7 +1029,7 @@ component_list['default_chunker'].setRegexParsers(['
    ?*+']) | Info: [Sentence Detection example](https://colab.research.google.com/drive/1CAXEdRk_q3U5qbMXsxoVyZRwvonKthhF?usp=sharing) ```python -nlu.load('sentence_detector').predict('NLU can detect things. Like beginning and endings of sentences. It can also do much more!', output_level ='sentence') +nlp.load('sentence_detector').predict('NLU can detect things. Like beginning and endings of sentences. It can also do much more!', output_level ='sentence') ```
    @@ -1050,7 +1050,7 @@ nlu.load('sentence_detector').predict('NLU can detect things. Like beginning and The DocumentNormalizer extracts content from HTML or XML documents, applying either data cleansing using an arbitrary number of custom regular expressions either data extraction following the different parameters ```python -pipe = nlu.load('norm_document') +pipe = nlp.load('norm_document') data = ' Example

    This is an example of a simple HTML page with one paragraph.

    ' df = pipe.predict(data,output_level='document') df @@ -1068,7 +1068,7 @@ df [Word Segmenter Example](https://github.com/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/japanese_ner_pos_and_tokenization.ipynb) The WordSegmenter segments languages without any rule-based tokenization such as Chinese, Japanese, or Korean ```python -pipe = nlu.load('ja.segment_words') +pipe = nlp.load('ja.segment_words') # japanese for 'Donald Trump and Angela Merkel dont share many opinions' ja_data = ['ドナルド・トランプとアンゲラ・メルケルは多くの意見を共有していません'] df = pipe.predict(ja_data, output_level='token') @@ -1106,20 +1106,20 @@ You can translate between more than 192 Languages pairs with the [Marian Models] You need to specify the language your data is in as `start_language` and the language you want to translate to as `target_language`. The language references must be [ISO language codes](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) -`nlu.load('xx..translate_to.')` +`nlp.load('xx..translate_to.')` **Translate Turkish to English:** -`nlu.load('xx.tr.translate_to.fr')` +`nlp.load('xx.tr.translate_to.fr')` **Translate English to French:** -`nlu.load('xx.en.translate_to.fr')` +`nlp.load('xx.en.translate_to.fr')` **Translate French to Hebrew:** -`nlu.load('xx.en.translate_to.fr')` +`nlp.load('xx.en.translate_to.fr')` ```python -translate_pipe = nlu.load('xx.en.translate_to.de') +translate_pipe = nlp.load('xx.en.translate_to.de') df = translate_pipe.predict('Billy likes to go to the mall every sunday') df ``` @@ -1184,7 +1184,7 @@ df ```python # Set the task on T5 -pipe = nlu.load('summarize') +pipe = nlp.load('summarize') # define Data, add additional tags between sentences data = [ @@ -1213,7 +1213,7 @@ Classify whether one sentence is a re-phrasing or similar to another sentence This is a sub-task of [GLUE](https://arxiv.org/pdf/1804.07461.pdf) and based on [MRPC - Binary Paraphrasing/ sentence similarity classification ](https://www.aclweb.org/anthology/I05-5002.pdf) ``` -t5 = nlu.load('en.t5.base') +t5 = nlp.load('en.t5.base') # Set the task on T5 t5['t5'].setTask('mrpc ') @@ -1261,7 +1261,7 @@ Measures how similar two sentences are on a scale from 0 to 5 with 21 classes re This is a sub-task of [GLUE](https://arxiv.org/pdf/1804.07461.pdf) and based on[STSB - Regressive semantic sentence similarity](https://www.aclweb.org/anthology/S17-2001/) . ```python -t5 = nlu.load('en.t5.base') +t5 = nlp.load('en.t5.base') # Set the task on T5 t5['t5'].setTask('stsb ') @@ -1321,7 +1321,7 @@ Judges if a sentence is grammatically acceptable. Based on [CoLA - Binary Grammatical Sentence acceptability classification](https://nyu-mll.github.io/CoLA/) ```python -pipe = nlu.load('grammar_correctness') +pipe = nlp.load('grammar_correctness') # Set the task on T5 pipe['t5'].setTask('cola sentence: ') # define Data @@ -1353,7 +1353,7 @@ All it takes is : ```python -nlu.load('answer_question').predict(""" +nlp.load('answer_question').predict(""" Where did Jebe die? context: Ghenkis Khan recalled Subtai back to Mongolia soon afterwards, and Jebe died on the road back to Samarkand""") @@ -1371,7 +1371,7 @@ Carbon monoxide poisoning, gas gangrene, and decompression sickness (the ’bend #Predict on text data with T5 -nlu.load('answer_question').predict(question) +nlp.load('answer_question').predict(question) >>> Output: carbon monoxide ``` @@ -1399,7 +1399,7 @@ questions = [ question4+ news_article_snippet, question5+ news_article_snippet, question6+ news_article_snippet,] -nlu.load('answer_question').predict(questions) +nlp.load('answer_question').predict(questions) ``` This will output a Pandas Dataframe similar to this : @@ -1432,19 +1432,19 @@ All it takes is : ```python -nlu.load('en.t5').predict('Who is president of Nigeria?') +nlp.load('en.t5').predict('Who is president of Nigeria?') >>> Muhammadu Buhari ``` ```python -nlu.load('en.t5').predict('What is the most spoken language in India?') +nlp.load('en.t5').predict('What is the most spoken language in India?') >>> Hindi ``` ```python -nlu.load('en.t5').predict('What is the capital of Germany?') +nlp.load('en.t5').predict('What is the capital of Germany?') >>> Berlin ``` diff --git a/docs/en/examples_healthcare.md b/docs/en/examples_healthcare.md index cb1f419e..1fd5aaec 100644 --- a/docs/en/examples_healthcare.md +++ b/docs/en/examples_healthcare.md @@ -14,7 +14,7 @@ The following examples demonstrate how to use nlu's load api accompanied by the It enables loading any model or pipeline in one line You need to pass one NLU reference to the load method. You can also pass multiple whitespace separated references. -[You can find all NLU references here](https://nlu.johnsnowlabs.com/docs/en/spellbook) +[You can find all NLU references here](https://nlu.johnsnowlabs.com/docs/en/namespace)
    diff --git a/docs/en/install.md b/docs/en/install.md index 3346b92c..61e43f4c 100644 --- a/docs/en/install.md +++ b/docs/en/install.md @@ -10,500 +10,34 @@ header: true
    -To install the johnsnowlabs Python library and all of John Snow Labs open **source libraries**, just run +To install the **johnsnowlabs Python library** and all of John Snow Labs open **source libraries**, just run ```shell pip install johnsnowlabs ``` -This installs [Spark-NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart), [NLU](https://nlu.johnsnowlabs.com/) -, [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) -, [Pyspark](https://spark.apache.org/docs/latest/api/python/) and other open -source [sub-dependencies](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/setup.py). - -To quickly test the installation, you can run in your Shell: +To quickly test the installation, you can run in your **Shell**: ```shell -python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" -``` -or in Python: -```python -from johnsnowlabs import * -jsl.load('emotion').predict('Wow that easy!') +python -c "from johnsnowlabs import nlp;print(nlp.load('emotion').predict('Wow that easy!'))" ``` -The quickest way to get access to **licensed libraries** like -[Finance NLP, Legal NLP, Healthcare NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or -[Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr) is to run the following in python: +or in **Python**: ```python -from johnsnowlabs import * -jsl.install() +from johnsnowlabs import nlp +nlp.load('emotion').predict('Wow that easy!') ``` -This will display a **Browser Window Pop Up** or show a **Clickable Button with Pop Up**. -Click on the **Authorize** button to allow the library to connect to your account on my.JohnSnowLabs.com and access you licenses. -This will enable the installation and use of all licensed products for which you have a valid license. - -Make sure to **Restart your Notebook** after installation. - -Colab Button -![install_button_colab.png](/assets/images/jsl_lib/install/install_button_colab.png) - -Where the Pop-Up leads you to: -![install_pop_up.png](/assets/images/jsl_lib/install/install_pop_up.png) - -After clicking **Authorize**: -![install_logs_colab.png](/assets/images/jsl_lib/install/install_logs_colab.png) - -**Additional Requirements** - -- Make sure you have `Java 8` installed, for setup instructions - see [How to install Java 8 for Windows/Linux/Mac?](https://nlu.johnsnowlabs.com/docs/en/install#get-prerequisites-java-8) -- Windows Users must additionally follow every step precisely defined - in [How to correctly install Spark NLP for Windows?](https://nlp.johnsnowlabs.com/docs/en/install#windows-support) - -
    - -{:.h2-select} -## Install Licensed Libraries - -The following is a more detailed overview of the alternative installation methods and parameters you can use. -The parameters of `jsl.install()`parameters fall into 3 categories: - -- **Authorization Flow Choice & Auth Flow Tweaks** -- **Installation Targets** such as `Airgap Offline`, `Databricks`, `new Pytho Venv`, `Currently running Python Enviroment`, - or `target Python Environment` -- **Installation process tweaks** - -
    - -### List all of your accessible Licenses - -You can use `jsl.list_remote_licenses()` to list all available licenses in your [my.johnsnowlabs.com/](https://my.johnsnowlabs.com/) account -and `jsl.list_local_licenses()` to list all locally cached licenses. - -
    - -### Authorization Flows overview - -The `johnsnowlabs` library gives you multiple methods to authorize and provide your license when installing licensed -libraries. -Once access to your license is provided, it is cached locally `~/.johnsnowlabs/licenses` and re-used when -calling `jst.start()` and `jsl.install()`, so you don't need to authorize again. -Only 1 licenses can be provided and will be cached during authorization flows. -If you have multiple licenses you can re-run an authorization method and use the `local_license_number` and `remote_license_number` parameter choose -between licenses you have access to. -Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour). - -| Auth Flow Method | Description | Python `jsl.install()` usage | -|--------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license. Use `remote_license_number` parameter to choose between licenses. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | -| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visit new page to give access to your license. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | -| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | -| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | -| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | -| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | -| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
    Use `local_license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | -| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | - -
    - -### Optional Auth Flow Parameters - -Use these parameters to configure **the preferred authorization flow**. - -| Parameter | description | -|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True`. | -| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have several ones. | -| `local_license_number` | Specify the license number when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use the very first license every provided to the johnsnowlabs library. | -| `remote_license_number` | Specify the license number to use with OAuth based approaches. Defaults to `0` which will use your first license from my.johnsnowlabs.com. | -| `store_in_jsl_home` | By default license data and Jars/Wheels are stored in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify on every run.
    Set to `False` to disable this caching behaviour.
    | -| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False`. | - -
    - -### Optional Installation Target Parameters - -Use these parameters to configure **where** to install the libraries. - -| Parameter | description | -|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `python_exec_path` | Specify path to a python executable into whose environment the libraries will be installed. Defaults to the current executing Python process, i.e. `sys.executable` and it's pip module is used for setup. | -| `venv_creation_path` | Specify path to a folder, in which a fresh venv will be created with all libraries. Using this parameter ignores the `python_exec_path` parameter, since the newly created venv's python executable is used for setup. | -| `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installs`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | -| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for more details. | - -
    - -### Optional Installation Process Parameters - -Use the following parameters to configure **what should** be installed. - -| Parameter | description | -|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `install_optional` | By default install all open source libraries if missing. Set the `False` to disable. | -| `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | -| `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | -| `product` | Specify product to install. By default installs everything you have access to. | -| `only_download_jars` | By default all libraries are installed to the current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory. | -| `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types. | -| `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl. | -| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses**. | - -
    - -### Automatic Databricks Installation - -Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install -all open source and licensed features into a Databricks cluster. -You additionally must use one of the [John Snow Labs License Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) to give access to your John Snow -Labs license,which will be installed to your Databricks cluster. -A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has -all Jars, Wheels and License Information to run all features in a Databricks cluster. - -| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | -|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| -| `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | - -Where to find your Databricks Access Token: -![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) - -
    -#### Databricks Cluster Creation Parameters - -You can set the following parameters on the `jsl.install()` function to define properties of the cluster which will be created. -See [Databricks Cluster Creation](https://docs.databricks.com/dev-tools/api/latest/clusters.html#create) for a detailed description of all parameters. - -| Cluster creation Parameter | Default Value | -|----------------------------|--------------------------------------------| -| block_till_cluster_ready | `True` | -| num_workers | `1` | -| cluster_name | `John-Snow-Labs-Databricks-Auto-Cluster🚀` | -| node_type_id | `i3.xlarge` | -| driver_node_type_id | `i3.xlarge` | -| spark_env_vars | `None` | -| autotermination_minutes | `60` | -| spark_version | `10.5.x-scala2.12` | -| spark_conf | `None` | -| auto_scale | `None` | -| aws_attributes | `None` | -| ssh_public_keys | `None` | -| custom_tags | `None` | -| cluster_log_conf | `None` | -| enable_elastic_disk | `None` | -| cluster_source | `None` | -| instance_pool_id | `None` | -| headers | `None` | - - -The created cluster -![databricks_cluster.png](/assets/images/jsl_lib/install/databricks_cluster.png) - - -
    - -### License Variables Names for JSON and OS variables - -The following variable names are checked when using a JSON or environment variables based approach for installing -licensed features or when using `jsl.start()` . -You can find all of your license information on [https://my.johnsnowlabs.com/subscriptions](https://my.johnsnowlabs.com/subscriptions) - -- `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. -- `AWS_SECRET_ACCESS_KEY` : Assigned to you by John Snow Labs. Must be defined. -- `HC_SECRET` : The secret for a version of the enterprise NLP engine library. Changes between releases. Can be omitted if you don't - have access to enterprise nlp. -- `HC_LICENSE` : Your license for the medical features. Can be omitted if you don't have a medical license. -- `OCR_SECRET` : The secret for a version of the Visual NLP (Spark OCR) library. Changes between releases. Can be omitted if you don't have a Visual NLP (Spark OCR) license. -- `OCR_LICENSE` : Your license for the Visual NLP (Spark OCR) features. Can be omitted if you don't have a Visual NLP (Spark OCR) license. -- `JSL_LEGAL_LICENSE`: Your license for Legal NLP Features -- `JSL_FINANCE_LICENSE` Your license for Finance NLP Features - -NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you may have 1 generic `SPARK_NLP_LICENSE`. - -{:.h2-select} -## Installation Examples - -
    -### Via Auto Detection & Browser Login - -All [default search locations ]() are searched, if any credentials are found they will be used. -If no credentials are auto-detected, a Browser Window will pop up, asking to authorize access to https://my.johnsnowlabs.com/ -In Google Colab, a clickable button will appear, which will make a window pop up where you can authorize access to https://my.johnsnowlabs.com/. - +when using **Annotator based pipelines**, use `nlp.start()` to start up your session ```python -jsl.install() -``` - -
    -### Via Access Token - -Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) - -```python -jsl.install(access_token='secret') +from johnsnowlabs import nlp +nlp.start() +pipe = nlp.Pipeline(stages= +[ + nlp.DocumentAssembler().setInputCol('text').setOutputCol('doc'), + nlp.Tokenizer().setInputCols('doc').setOutputCol('tok') +]) +nlp.to_nlu_pipe(pipe).predict('That was easy') ``` -Where you find the license -![access_token1.png](/assets/images/jsl_lib/install/access_token1.png) - -
    -### Via Json Secrets file - -Path to a JSON containing secrets, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. - -```python -jsl.install(json_file_path='my/secret.json') -``` - -
    -### Via Manually defining Secrets - -Manually specify all secrets. Some of these can be omitted, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. - -```python -jsl.install( - hc_license='Your HC License', - fin_license='Your FIN License', - leg_license='Your LEG License', - enterprise_nlp_secret='Your NLP Secret', - ocr_secret='Your OCR Secret', - ocr_license='Your OCR License', - aws_access_key='Your Access Key', - aws_key_id='Your Key ID', -) -``` - -
    - -### Into Current Python Process - -Uses sys.executable by default, i.e. the Python that is currently running the program. - -```python -jsl.install() -``` - -
    - -### Into Custom Python Env - -Using specific python executable, which is not the currently running python. -Will use the provided python's executable pip module to install libraries. - -```python -jsl.install(python_exec_path='my/python.exe') -``` - -
    - - -### Into freshly created venv - -Create a new Venv using the currently executing Pythons Venv Module. - -```python -jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') -``` - -
    - -### Into Airgap/Offline Installation (Automatic) - -Create a Zip with all Jars/Wheels/Licenses you need to run all libraries in an offline environment. -**Step1:** - -```python -jsl.install(offline_zip_dir='path/to/where/my/zip/will/be') -``` - -**Step2:** -Transfer the zip file securely to your offline environment and unzip it. One option is the unix `scp` command. - -```shell -scp /to/where/my/zip/will/be/john_snow_labs.zip 123.145.231.001:443/remote/directroy -``` - -**Step3:** -Then from the **remote machine shell** unzip with: - -```shell -# Unzip all files to ~/johnsowlabs -unzip remote/directory/jsl.zip -d ~/johnsowlabs -``` - -**Step4 (option1):** -Install the wheels via jsl: - -```python -# If you unzipped to ~/johnsowlabs, then just update this setting before running and jsl.install() handles the rest for you! -from johnsnowlabs import * -jsl.settings.jsl_root = '~/johnsowlabs' -# Make sure you have Java 8 installed! -jsl.install() - -``` - -**Step4 (option2):** -Install the wheels via pip: - -```shell -# Assuming you unzipped to ~/johnsnowlabs, you can install all wheels like this -pip install ~/johnsnowlabs/py_installs/*.whl -``` - -**Step5:** -Test your installation Via shell: - -```shell -python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" -``` - -or in Python: - -```python -from johnsnowlabs import * -jsl.load('emotion').predict('Wow that easy!') -``` - -
    - -### Into Airgap/Offline Manual - -Download all files yourself from the URLs printed by jsl.install(). -You will have to folly the Automatic Instructions starting from step (2) of the automatic installation. -I.e. provide the files somehow on your offline machine. - -```python -# Print all URLs to files you need to provide on your host machine -jsl.install(offline=True) -``` -
    -### Into a freshly created Databricks cluster automatically - -To install in databricks you must provide your `accessToken` and `hostUrl`. -You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` -, `browser`, `json_file`, or `manually defining secrets` -Your can get it from: - -``` python -# Create a new Cluster with Spark NLP and all licensed libraries ready to go: -jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) -``` -
    - -### Into Existing Databricks cluster Manual -If you do not wish to use the recommended **automatic installation** but instead want to install manually -you must install the `johnsnowlabs_for_databricks` pypi package instead of `johnsnowlabs` via the UI or any method of your choice. -![databricks_manual.png](/assets/images/jsl_lib/install/databricks_manual.png) - - -{:.h2-select} -## License Management & Caching - -## Storage of License Data and License Search behaviour - -The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . -After having provided license data once, you don't need to specify it again since the cached licensed will be used. -Use the `local_license_number` and `remote_license_number` parameters to switch between multiple licenses. -**Note:** Locally cached licenses are numbered in the order they have been provided, starting at 0. -`remote_license_number=0` might not be the same as `local_license_number=0`. -Use the following functions to see all your avaiable licenses. - - -
    - -## List all available licenses - -This shows you all licenses for your account in https://my.johnsnowlabs.com/. -Use this to decide which license number to install when installing via browser or access token. - -```python -jsl.list_remote_licenses() -``` - -
    - -## List all locally cached licenses - -Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license -you want to load. - -```python -jsl.list_local_licenses() -``` - -
    - -## License Search precedence - -If there are multiples possible sources for licenses, the following order takes precedence: - -1. Manually provided license data by defining all license parameters. -2. Browser/ Access Token. -3. `Os environment Variables` for any var names that match up with secret names. -4. `/content/*.json` for any json file smaller than 1 MB. -5. `current_working_dir/*.json` for any json smaller than 1 MB. -6. `~/.johnsnowlabs/licenses` for any licenses. - -JSON files are scanned if they have any keys that match up with names of secrets. -Name of the json file does not matter, file just needs to end with .json. - -
    - -## Upgrade Flow - -**Step 1:** Upgrade the johnsnowlabs library. -```shell -pip install johnsnowlabs --upgrade -``` -**Step 2:** Run install again, while using one [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview). -```python -jsl.install() -``` - - - -The John Snow Labs Teams are working early to push out new Releases and Features each week! -Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. -Once the johnsnowlabs library is upgraded, it will detect any out-dated libraries any inform you -that you can upgrade them by running `jsl.install()` again. -You must run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again, -to gian access to the latest enterprise libraries. - -{:.h2-select} -## Next Steps & Frequently Asked Questions - -
    - -## How to setup Java 8 - -- [Setup Java 8 on Windows](https://access.redhat.com/documentation/en-us/openjdk/8/html/openjdk_8_for_windows_getting_started_guide/getting_started_with_openjdk_for_windows) -- [Setup Java 8 on Linux](https://openjdk.java.net/install/) -- [Setup Java 8 on Mac](https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html) - -
    - -## Join our Slack channel - -Join our channel, to ask for help and share your feedback. Developers and users can help each other get started here. - -[NLU Slack](https://spark-nlp.slack.com/archives/C0196BQCDPY){:.button.button--info.button--rounded.button--md} - -
    - -## Where to go next - -If you want to get your hands dirty with any of the features check out the [NLU examples page](examples), -or [Licensed Annotators Overview](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) -Detailed information about Johnsnowlabs Libraries APIs, concepts, components and more can be found on the following pages : - -{:.list4} - -- [Starting a Spark Session](start-a-sparksession) -- [John Snow Labs Library usage and import Overview](import-structure) -- [The NLU load function](load_api) -- [The NLU predict function](predict_api) -- [The NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) -- [NLU Notebooks](notebooks) -
    \ No newline at end of file +for alternative installation options see [Custom Installation](/docs/en/install_advanced) \ No newline at end of file diff --git a/docs/en/install_advanced.md b/docs/en/install_advanced.md new file mode 100644 index 00000000..a04627ae --- /dev/null +++ b/docs/en/install_advanced.md @@ -0,0 +1,509 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Installation +permalink: /docs/en/install_advanced +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
    + +To install the johnsnowlabs Python library and all of John Snow Labs open **source libraries**, just run + +```shell +pip install johnsnowlabs +``` + +This installs [Spark-NLP](https://nlp.johnsnowlabs.com/docs/en/quickstart), [NLU](https://nlu.johnsnowlabs.com/) +, [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) +, [Pyspark](https://spark.apache.org/docs/latest/api/python/) and other open +source [sub-dependencies](https://github.com/JohnSnowLabs/johnsnowlabs/blob/main/setup.py). + +To quickly test the installation, you can run in your Shell: + +```shell +python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" +``` +or in Python: +```python +from johnsnowlabs import * +jsl.load('emotion').predict('Wow that easy!') +``` +The quickest way to get access to **licensed libraries** like +[Finance NLP, Legal NLP, Healthcare NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_install) or +[Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr) is to run the following in python: +```python +from johnsnowlabs import * +jsl.install() +``` + +This will display a **Browser Window Pop Up** or show a **Clickable Button with Pop Up**. +Click on the **Authorize** button to allow the library to connect to your account on my.JohnSnowLabs.com and access you licenses. +This will enable the installation and use of all licensed products for which you have a valid license. + +Make sure to **Restart your Notebook** after installation. + +Colab Button +![install_button_colab.png](/assets/images/jsl_lib/install/install_button_colab.png) + +Where the Pop-Up leads you to: +![install_pop_up.png](/assets/images/jsl_lib/install/install_pop_up.png) + +After clicking **Authorize**: +![install_logs_colab.png](/assets/images/jsl_lib/install/install_logs_colab.png) + +**Additional Requirements** + +- Make sure you have `Java 8` installed, for setup instructions + see [How to install Java 8 for Windows/Linux/Mac?](https://nlu.johnsnowlabs.com/docs/en/install#get-prerequisites-java-8) +- Windows Users must additionally follow every step precisely defined + in [How to correctly install Spark NLP for Windows?](https://nlp.johnsnowlabs.com/docs/en/install#windows-support) + +
    + +{:.h2-select} +## Install Licensed Libraries + +The following is a more detailed overview of the alternative installation methods and parameters you can use. +The parameters of `jsl.install()`parameters fall into 3 categories: + +- **Authorization Flow Choice & Auth Flow Tweaks** +- **Installation Targets** such as `Airgap Offline`, `Databricks`, `new Pytho Venv`, `Currently running Python Enviroment`, + or `target Python Environment` +- **Installation process tweaks** + +
    + +### List all of your accessible Licenses + +You can use `jsl.list_remote_licenses()` to list all available licenses in your [my.johnsnowlabs.com/](https://my.johnsnowlabs.com/) account +and `jsl.list_local_licenses()` to list all locally cached licenses. + +
    + +### Authorization Flows overview + +The `johnsnowlabs` library gives you multiple methods to authorize and provide your license when installing licensed +libraries. +Once access to your license is provided, it is cached locally `~/.johnsnowlabs/licenses` and re-used when +calling `jst.start()` and `jsl.install()`, so you don't need to authorize again. +Only 1 licenses can be provided and will be cached during authorization flows. +If you have multiple licenses you can re-run an authorization method and use the `local_license_number` and `remote_license_number` parameter choose +between licenses you have access to. +Licenses are locally numbered in order they have been provided, for more info see [License Caching](https://nlu.johnsnowlabs.com/docs/en/install#storage-of-license-data-and-license-search-behaviour). + +| Auth Flow Method | Description | Python `jsl.install()` usage | +|--------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Browser Based Login (OAuth) Localhost | Browser window will pop up, where you can give access to your license. Use `remote_license_number` parameter to choose between licenses. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | +| Browser Based Login (OAuth) on Google Colab | A button is displayed in your notebook, click it and visit new page to give access to your license. Use `remote_license_number` parameter to choose between licenses | `jsl.install()` | +| Access Token | Vist [my.johnsnowlabs.com](https://my.johnsnowlabs.com/) to extract a token which you can provide to enable license access. See [Access Token Example](https://nlu.johnsnowlabs.com/docs/en/install#via-access-token) for more details | `jsl.install(access_token=my_token)` | +| License JSON file path | Define JSON license file with keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) and provide file path | `jsl.install(json_license_path=path)` | +| **Auto-Detect** License JSON file from `os.getcwd()` | `os.getcwd()` directory is scanned for a `.json` file containing license keys defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | +| **Auto-Detect** OS Environment Variables | Environment Variables are scanned for license variables defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install()` | +| **Auto-Detect** Cached License in `~/.johnsnowlabs/licenses` | If you already have provided a license previously, it is cached in `~/.johnsnowlabs/licenses` and automatically loaded.
    Use `local_license_number` parameter to choose between licenses if you have multiple | `jsl.install()` | +| Manually specify license data | Set each license value as python parameter, defined by [License Variable Overview](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) | `jsl.install(hc_license=hc_license enterprise_nlp_secret=enterprise_nlp_secret ocr_secret=ocr_secret ocr_license=ocr_license aws_access_key=aws_access_key aws_key_id=aws_key_id)` | + +
    + +### Optional Auth Flow Parameters + +Use these parameters to configure **the preferred authorization flow**. + +| Parameter | description | +|----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `browser_login` | Enable or disable browser based login and pop up if no license is provided or automatically detected. Defaults to `True`. | +| `force_browser_login` | If a cached license if found, no browser pop up occurs. Set `True` to force the browser pop up, so that you can download different license, if you have several ones. | +| `local_license_number` | Specify the license number when loading a cached license from jsl home and multiple licenses have been cached. Defaults to `0` which will use the very first license every provided to the johnsnowlabs library. | +| `remote_license_number` | Specify the license number to use with OAuth based approaches. Defaults to `0` which will use your first license from my.johnsnowlabs.com. | +| `store_in_jsl_home` | By default license data and Jars/Wheels are stored in JSL home directory.
    This enables `jsl.start()` and `jsl.install()` to re-use your information and you don't have to specify on every run.
    Set to `False` to disable this caching behaviour.
    | +| `only_refresh_credentials` | Set to `True` if you don't want to install anything and just need to refresh or index a new license. Defaults to `False`. | + +
    + +### Optional Installation Target Parameters + +Use these parameters to configure **where** to install the libraries. + +| Parameter | description | +|-------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `python_exec_path` | Specify path to a python executable into whose environment the libraries will be installed. Defaults to the current executing Python process, i.e. `sys.executable` and it's pip module is used for setup. | +| `venv_creation_path` | Specify path to a folder, in which a fresh venv will be created with all libraries. Using this parameter ignores the `python_exec_path` parameter, since the newly created venv's python executable is used for setup. | +| `offline_zip_dir` | Specify path to a folder in which 3 sub-folders are created, `py_installs`, `java_installs` with corrosponding Wheels/Jars/Tars and `licenses`. It will additionallly be zipped. | +| `Install to Databricks` with access Token | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for more details. | + +
    + +### Optional Installation Process Parameters + +Use the following parameters to configure **what should** be installed. + +| Parameter | description | +|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `install_optional` | By default install all open source libraries if missing. Set the `False` to disable. | +| `install_licensed` | By default installs all licensed libraries you have access to if they are missing. Set to `False` to disable. | +| `include_dependencies` | Defaults to `True` which installs all depeendencies. If set to `False` pip will be executed with the `--no-deps` argument under the hood. | +| `product` | Specify product to install. By default installs everything you have access to. | +| `only_download_jars` | By default all libraries are installed to the current environment via pip. Set to False to disable installing Python dependencies and **only download jars** to the John Snow Labs home directory. | +| `jvm_install_type` | Specify hardware install type, either `cpu`, `gpu`, `m1`, or `aarch` . Defaults to `cpu`. If you have a GPU and want to leverage CUDA, set `gpu`. If you are an Apple M1 or Arch user choose the corresponding types. | +| `py_install_type` | Specify Python installation type to use, either `tar.gz` or `whl`, defaults to whl. | +| `refresh_install` | Delete any cached files before installing by removing John Snow Labs home folder. **This will delete your locally cached licenses**. | + +
    + +### Automatic Databricks Installation + +Use any of the databricks auth flows to enable the `johnsnowlabs` library to automatically install +all open source and licensed features into a Databricks cluster. +You additionally must use one of the [John Snow Labs License Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) to give access to your John Snow +Labs license,which will be installed to your Databricks cluster. +A John Snow Labs Home directory is constructed in the distributed Databricks File System`/dbfs/johnsnowlabs` which has +all Jars, Wheels and License Information to run all features in a Databricks cluster. + +| Databricks Auth Flow Method | Description | Python `jsl.install()` usage | +|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `Access Token` | See [Databricks Documentation](https://docs.databricks.com/dev-tools/api/latest/authentication.html) for extracting a token which you can provide to databricks access, see [Databricks Install Section](https://nlu.johnsnowlabs.com/docs/en/install#automatic-databricks-installation) for details | `jsl.install(databricks_cluster_id=my_cluster_id, databricks_host=my_databricks_host, databricks_token=my_access_databricks_token)` | + +Where to find your Databricks Access Token: +![databricks_access_token.png](/assets/images/jsl_lib/install/databricks_access_token.png) + +
    +#### Databricks Cluster Creation Parameters + +You can set the following parameters on the `jsl.install()` function to define properties of the cluster which will be created. +See [Databricks Cluster Creation](https://docs.databricks.com/dev-tools/api/latest/clusters.html#create) for a detailed description of all parameters. + +| Cluster creation Parameter | Default Value | +|----------------------------|--------------------------------------------| +| block_till_cluster_ready | `True` | +| num_workers | `1` | +| cluster_name | `John-Snow-Labs-Databricks-Auto-Cluster🚀` | +| node_type_id | `i3.xlarge` | +| driver_node_type_id | `i3.xlarge` | +| spark_env_vars | `None` | +| autotermination_minutes | `60` | +| spark_version | `10.5.x-scala2.12` | +| spark_conf | `None` | +| auto_scale | `None` | +| aws_attributes | `None` | +| ssh_public_keys | `None` | +| custom_tags | `None` | +| cluster_log_conf | `None` | +| enable_elastic_disk | `None` | +| cluster_source | `None` | +| instance_pool_id | `None` | +| headers | `None` | + + +The created cluster +![databricks_cluster.png](/assets/images/jsl_lib/install/databricks_cluster.png) + + +
    + +### License Variables Names for JSON and OS variables + +The following variable names are checked when using a JSON or environment variables based approach for installing +licensed features or when using `jsl.start()` . +You can find all of your license information on [https://my.johnsnowlabs.com/subscriptions](https://my.johnsnowlabs.com/subscriptions) + +- `AWS_ACCESS_KEY_ID` : Assigned to you by John Snow Labs. Must be defined. +- `AWS_SECRET_ACCESS_KEY` : Assigned to you by John Snow Labs. Must be defined. +- `HC_SECRET` : The secret for a version of the enterprise NLP engine library. Changes between releases. Can be omitted if you don't + have access to enterprise nlp. +- `HC_LICENSE` : Your license for the medical features. Can be omitted if you don't have a medical license. +- `OCR_SECRET` : The secret for a version of the Visual NLP (Spark OCR) library. Changes between releases. Can be omitted if you don't have a Visual NLP (Spark OCR) license. +- `OCR_LICENSE` : Your license for the Visual NLP (Spark OCR) features. Can be omitted if you don't have a Visual NLP (Spark OCR) license. +- `JSL_LEGAL_LICENSE`: Your license for Legal NLP Features +- `JSL_FINANCE_LICENSE` Your license for Finance NLP Features + +NOTE: Instead of `JSL_LEGAL_LICENSE`, `HC_LICENSE` and `JSL_FINANCE_LICENSE` you may have 1 generic `SPARK_NLP_LICENSE`. + +{:.h2-select} +## Installation Examples + +
    +### Via Auto Detection & Browser Login + +All [default search locations ]() are searched, if any credentials are found they will be used. +If no credentials are auto-detected, a Browser Window will pop up, asking to authorize access to https://my.johnsnowlabs.com/ +In Google Colab, a clickable button will appear, which will make a window pop up where you can authorize access to https://my.johnsnowlabs.com/. + +```python +jsl.install() +``` + +
    +### Via Access Token + +Get your License Token from [My John Snow Labs](https://my.johnsnowlabs.com/) + +```python +jsl.install(access_token='secret') +``` + +Where you find the license +![access_token1.png](/assets/images/jsl_lib/install/access_token1.png) + +
    +### Via Json Secrets file + +Path to a JSON containing secrets, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. + +```python +jsl.install(json_file_path='my/secret.json') +``` + +
    +### Via Manually defining Secrets + +Manually specify all secrets. Some of these can be omitted, see [License Variable Names](https://nlu.johnsnowlabs.com/docs/en/install#license-variables-names-for-json-and-os-variables) for more details. + +```python +jsl.install( + hc_license='Your HC License', + fin_license='Your FIN License', + leg_license='Your LEG License', + enterprise_nlp_secret='Your NLP Secret', + ocr_secret='Your OCR Secret', + ocr_license='Your OCR License', + aws_access_key='Your Access Key', + aws_key_id='Your Key ID', +) +``` + +
    + +### Into Current Python Process + +Uses sys.executable by default, i.e. the Python that is currently running the program. + +```python +jsl.install() +``` + +
    + +### Into Custom Python Env + +Using specific python executable, which is not the currently running python. +Will use the provided python's executable pip module to install libraries. + +```python +jsl.install(python_exec_path='my/python.exe') +``` + +
    + + +### Into freshly created venv + +Create a new Venv using the currently executing Pythons Venv Module. + +```python +jsl.install(venv_creation_path='path/to/where/my/new/venv/will/be') +``` + +
    + +### Into Airgap/Offline Installation (Automatic) + +Create a Zip with all Jars/Wheels/Licenses you need to run all libraries in an offline environment. +**Step1:** + +```python +jsl.install(offline_zip_dir='path/to/where/my/zip/will/be') +``` + +**Step2:** +Transfer the zip file securely to your offline environment and unzip it. One option is the unix `scp` command. + +```shell +scp /to/where/my/zip/will/be/john_snow_labs.zip 123.145.231.001:443/remote/directroy +``` + +**Step3:** +Then from the **remote machine shell** unzip with: + +```shell +# Unzip all files to ~/johnsowlabs +unzip remote/directory/jsl.zip -d ~/johnsowlabs +``` + +**Step4 (option1):** +Install the wheels via jsl: + +```python +# If you unzipped to ~/johnsowlabs, then just update this setting before running and jsl.install() handles the rest for you! +from johnsnowlabs import * +jsl.settings.jsl_root = '~/johnsowlabs' +# Make sure you have Java 8 installed! +jsl.install() + +``` + +**Step4 (option2):** +Install the wheels via pip: + +```shell +# Assuming you unzipped to ~/johnsnowlabs, you can install all wheels like this +pip install ~/johnsnowlabs/py_installs/*.whl +``` + +**Step5:** +Test your installation Via shell: + +```shell +python -c "from johnsnowlabs import *;print(nlu.load('emotion').predict('Wow that easy!'))" +``` + +or in Python: + +```python +from johnsnowlabs import * +jsl.load('emotion').predict('Wow that easy!') +``` + +
    + +### Into Airgap/Offline Manual + +Download all files yourself from the URLs printed by jsl.install(). +You will have to folly the Automatic Instructions starting from step (2) of the automatic installation. +I.e. provide the files somehow on your offline machine. + +```python +# Print all URLs to files you need to provide on your host machine +jsl.install(offline=True) +``` +
    +### Into a freshly created Databricks cluster automatically + +To install in databricks you must provide your `accessToken` and `hostUrl`. +You can provide the secrets to the install function with any of the methods listed above, i.e. using `access_token` +, `browser`, `json_file`, or `manually defining secrets` +Your can get it from: + +``` python +# Create a new Cluster with Spark NLP and all licensed libraries ready to go: +jsl.install(databricks_host='https://your_host.cloud.databricks.com', databricks_token = 'dbapi_token123',) +``` +
    + +### Into Existing Databricks cluster Manual +If you do not wish to use the recommended **automatic installation** but instead want to install manually +you must install the `johnsnowlabs_for_databricks` pypi package instead of `johnsnowlabs` via the UI or any method of your choice. +![databricks_manual.png](/assets/images/jsl_lib/install/databricks_manual.png) + + +{:.h2-select} +## License Management & Caching + +## Storage of License Data and License Search behaviour + +The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . +After having provided license data once, you don't need to specify it again since the cached licensed will be used. +Use the `local_license_number` and `remote_license_number` parameters to switch between multiple licenses. +**Note:** Locally cached licenses are numbered in the order they have been provided, starting at 0. +`remote_license_number=0` might not be the same as `local_license_number=0`. +Use the following functions to see all your avaiable licenses. + + +
    + +## List all available licenses + +This shows you all licenses for your account in https://my.johnsnowlabs.com/. +Use this to decide which license number to install when installing via browser or access token. + +```python +jsl.list_remote_licenses() +``` + +
    + +## List all locally cached licenses + +Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license +you want to load. + +```python +jsl.list_local_licenses() +``` + +
    + +## License Search precedence + +If there are multiples possible sources for licenses, the following order takes precedence: + +1. Manually provided license data by defining all license parameters. +2. Browser/ Access Token. +3. `Os environment Variables` for any var names that match up with secret names. +4. `/content/*.json` for any json file smaller than 1 MB. +5. `current_working_dir/*.json` for any json smaller than 1 MB. +6. `~/.johnsnowlabs/licenses` for any licenses. + +JSON files are scanned if they have any keys that match up with names of secrets. +Name of the json file does not matter, file just needs to end with .json. + +
    + +## Upgrade Flow + +**Step 1:** Upgrade the johnsnowlabs library. +```shell +pip install johnsnowlabs --upgrade +``` +**Step 2:** Run install again, while using one [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview). +```python +jsl.install() +``` + + + +The John Snow Labs Teams are working early to push out new Releases and Features each week! +Simply run `pip install johnsnowlabs --upgrade` to get the latest open **source libraries** updated. +Once the johnsnowlabs library is upgraded, it will detect any out-dated libraries any inform you +that you can upgrade them by running `jsl.install()` again. +You must run one of the [Authorization Flows](https://nlu.johnsnowlabs.com/docs/en/install#authorization-flows-overview) again, +to gian access to the latest enterprise libraries. + +{:.h2-select} +## Next Steps & Frequently Asked Questions + +
    + +## How to setup Java 8 + +- [Setup Java 8 on Windows](https://access.redhat.com/documentation/en-us/openjdk/8/html/openjdk_8_for_windows_getting_started_guide/getting_started_with_openjdk_for_windows) +- [Setup Java 8 on Linux](https://openjdk.java.net/install/) +- [Setup Java 8 on Mac](https://docs.oracle.com/javase/8/docs/technotes/guides/install/mac_jdk.html) + +
    + +## Join our Slack channel + +Join our channel, to ask for help and share your feedback. Developers and users can help each other get started here. + +[NLU Slack](https://spark-nlp.slack.com/archives/C0196BQCDPY){:.button.button--info.button--rounded.button--md} + +
    + +## Where to go next + +If you want to get your hands dirty with any of the features check out the [NLU examples page](examples), +or [Licensed Annotators Overview](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) +Detailed information about Johnsnowlabs Libraries APIs, concepts, components and more can be found on the following pages : + +{:.list4} + +- [Starting a Spark Session](start-a-sparksession) +- [John Snow Labs Library usage and import Overview](import-structure) +- [The NLU load function](load_api) +- [The NLU predict function](predict_api) +- [The NLU components spellbook](https://nlu.johnsnowlabs.com/docs/en/namespace) +- [NLU Notebooks](notebooks) + +
    \ No newline at end of file diff --git a/docs/en/install_licensed_quick.md b/docs/en/install_licensed_quick.md new file mode 100644 index 00000000..4f5d55f1 --- /dev/null +++ b/docs/en/install_licensed_quick.md @@ -0,0 +1,43 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Installation +permalink: /docs/en/install_licensed_quick +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +
    + +To install the **johnsnowlabs Python library** and all of John Snow Labs **licensed libraries**, just run + +1. run in your `shell` +```shell +pip install johnsnowlabs +``` +2. run in a `Python Shell` +```python +from johnsnowlabs import * +jsl.install() +``` +This will display a **Browser Window Pop Up** or show a **Clickable Button with Pop Up**. +Click on the **Authorize** button to allow the library to connect to your account on my.JohnSnowLabs.com and access you licenses. +This will enable the installation and use of all licensed products for which you have a valid license. + +Colab Button: +![install_button_colab.png](/assets/images/jsl_lib/install/install_button_colab.png) + +Where the Pop-Up leads you to: +![install_pop_up.png](/assets/images/jsl_lib/install/install_pop_up.png) + +After clicking **Authorize**: +![install_logs_colab.png](/assets/images/jsl_lib/install/install_logs_colab.png) + +To quickly test your installation, run in a `Python shell` +```python + +``` + + +for alternative installation options see [Custom Installation](/docs/en/install_advanced) \ No newline at end of file diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md index ac55bf42..64c50d21 100644 --- a/docs/en/jsl_release_notes.md +++ b/docs/en/jsl_release_notes.md @@ -9,10 +9,45 @@ header: true ---
    +See [Github Releases](https://github.com/JohnSnowLabs/johnsnowlabs/releases) for detailed information on Release History and Features. + +## 4.2.2 +The John Snow Labs 4.2.2 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.0` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.2` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.2` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + +## 4.2.1 +The John Snow Labs 4.2.1 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.1.0` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.1` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + + +## 4.2.0 The John Snow Labs 4.2.0 Library released with the following pre-installed and recommended dependencies | Library | Version | |-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.0.0` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.0` | | [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | | [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | diff --git a/docs/en/license_management.md b/docs/en/license_management.md new file mode 100644 index 00000000..ea035a75 --- /dev/null +++ b/docs/en/license_management.md @@ -0,0 +1,64 @@ +--- +layout: docs +header: true +seotitle: NLU | John Snow Labs +title: License Management & Caching +permalink: /docs/en/license_management +key: docs-concepts +modify_date: "2020-05-08" +--- + +
    + + +### Storage of License Data and License Search behaviour + +The John Snow Labs library caches license data in `~/.johnsnowlabs/licenses` whenever a new one is provided . +After having provided license data once, you don't need to specify it again since the cached licensed will be used. +Use the `local_license_number` and `remote_license_number` parameters to switch between multiple licenses. +**Note:** Locally cached licenses are numbered in the order they have been provided, starting at 0. +`remote_license_number=0` might not be the same as `local_license_number=0`. +Use the following functions to see all your avaiable licenses. + + +
    + +### List all available licenses + +This shows you all licenses for your account in https://my.johnsnowlabs.com/. +Use this to decide which license number to install when installing via browser or access token. + +```python +jsl.list_remote_licenses() +``` + +
    + +### List all locally cached licenses + +Use this to decide which license number to use when using jsl.start() or jsl.install() to specify which local license +you want to load. + +```python +jsl.list_local_licenses() +``` + +
    + +### License Search precedence + +If there are multiples possible sources for licenses, the following order takes precedence: + +1. Manually provided license data by defining all license parameters. +2. Browser/ Access Token. +3. `Os environment Variables` for any var names that match up with secret names. +4. `/content/*.json` for any json file smaller than 1 MB. +5. `current_working_dir/*.json` for any json smaller than 1 MB. +6. `~/.johnsnowlabs/licenses` for any licenses. + +JSON files are scanned if they have any keys that match up with names of secrets. +Name of the json file does not matter, file just needs to end with .json. + +
    + +
    \ No newline at end of file diff --git a/docs/en/load_api.md b/docs/en/load_api.md index 9c708a7a..e7de301d 100644 --- a/docs/en/load_api.md +++ b/docs/en/load_api.md @@ -1,8 +1,8 @@ --- layout: docs header: true -seotitle: NLU | John Snow Labs -title: The NLU Load function +seotitle: NLP | John Snow Labs +title: The nlp.load() function permalink: /docs/en/load_api key: docs-developers modify_date: "2020-05-08" @@ -10,51 +10,62 @@ modify_date: "2020-05-08"
    -The nlu.load() method takes in one or multiple NLU pipeline, model or component references separated by whitespaces. -See [the NLU spellbook]( /docs/en/spellbook) for an overview of all possible NLU references. +The nlp.load() method takes in one or multiple nlp pipeline, model or component references separated by whitespaces. +See [the Model Namespace]( /docs/en/namespace) for an overview of all possible nlp references. -NLU will induce the following reference format for any query to the load method: +NLP will induce the following reference format for any query to the load method: **language.component_type.dataset.embeddings** i.e.: en.sentiment.twitter.use -It is possible to omit many parts of the query and NLU will provide the best possible defaults, like embeddings for choosing a dataset. +It is possible to omit many parts of the query and the nlp module will provide the best possible defaults, like embeddings for choosing a dataset. -The NLU spellbook also provides a few aliases which make referencing a model even easier! +The NLP Namespace also provides a few aliases which make referencing a model even easier! This makes it possible to get predictions by only referencing the component name -Examples for aliases are nlu.load('bert') or nlu.load('sentiment') +Examples for aliases are nlp.load('bert') or nlp.load('sentiment') It is possible to omit the language prefix and start the query with : -**component_type.dataset.embeddings** NLU will automatically set the language to english in this case. +**component_type.dataset.embeddings** the nlp module will automatically set the language to english in this case. -**The nlu.load() method returns a NLU pipeline object which provides predictions** : +**The nlp.load() method returns a NLU pipeline object which provides predictions** : ```python -import nlu -pipeline = nlu.load('sentiment') +from johnsnowlabs import nlp + +pipeline = nlp.load('sentiment') pipeline.predict("I love this Documentation! It's so good!") ``` **This is equal to:** ```python -import nlu -nlu.load(sentiment).predict("I love this Documentation! It's so good!") +from johnsnowlabs import nlp +nlp.load('sentiment').predict("I love this Documentation! It's so good!") ```
    -## Load Parameter +## Load Parameters The load method provides for now just one parameter **verbose**. -Setting nlu.load(nlu_reference, verbose=True) will generate log outputs that can be helpful for troubleshooting. +Setting nlp.load(nlp_reference, verbose=True) will generate log outputs that can be helpful for troubleshooting. If you encounter any errors, please run Verbose mode and post your output on our Github Issues page. +| Description | Parameter name | +|------------------------------------------------------------------------------------------|---------------------------------| +| NLP reference of the model | request | +| Path to a locally stored Spark NLP Model or Pipeline | path | +| Whether to load GPU jars or not. Set to `True` to enable. | gpu | +| Whether to load M1 jars or not. Set to `True` to enable. | m1_chip | +| Whether to use caching for the nlp.display() functions or not. Set to `True` to enable | streamlit_caching | + +
    ## Configuring loaded models -To configure your model or pipeline, first load a NLU component and use the print_components() function. -The print outputs tell you at which index of the pipe_components attribute which NLU component is located. +To configure your model or pipeline, first load a NLP component and use the print_components() function. +The print outputs tell you at which index of the pipe_components attribute which NLP component is located. Via setters which are named according to the parameter values a model can be configured + ```python # example for configuring the first element in the component_list -pipe = nlu.load('en.sentiment.twitter') +pipe = nlp.load('en.sentiment.twitter') pipe.generate_class_metadata_table() document_assembler_model = pipe.components[0].model document_assembler_model.setCleanupMode('inplace') @@ -75,10 +86,9 @@ Param Name [ classes ] : Param Info : get the tags used to trained this NerDLMo
    -## Component spellbook -The NLU name space describes the collection of all models, pipelines and components available in NLU and supported by the nlu.load() method. +## Namespace +The NLP name space describes the collection of all models, pipelines and components available in NLP and supported by the nlp.load() method. You can view it on the [Name Space page](https://nlu.johnsnowlabs.com/docs/en/load_api) -NLU also provides a few handy functions to gain insight into the NLU spellbook.
    \ No newline at end of file diff --git a/docs/en/model_namespace.md b/docs/en/model_namespace.md index 39f9649f..ee938f26 100644 --- a/docs/en/model_namespace.md +++ b/docs/en/model_namespace.md @@ -3,7 +3,7 @@ layout: docs header: true seotitle: NLU | John Snow Labs title: Spellbook -permalink: /docs/en/spellbook +permalink: /docs/en/namespace key: docs-spellbook modify_date: "2020-05-08" --- @@ -15,15 +15,15 @@ modify_date: "2020-05-08" See and also [the John Snow Labs Modelhub](https://nlp.johnsnowlabs.com/models) and also [the John Snow Labs Model Repository](https://github.com/JohnSnowLabs/spark-nlp-models#english---models\) - for fruther information about the models and pipelines. + for further information about the models and pipelines. -Each String in the NLU reference column can be passed to nlu.load() to get the corresponding model -wrapped inside of a NLU Pipeline. +Each String in the NLP reference column can be passed to nlp.load() to get the corresponding model +wrapped inside a NLP Pipeline.
    {:.table-model-big.mb0} -| Language | NLU Reference | Spark NLP Reference | Component Type | +| Language | nlp.load() Reference | Spark NLP Reference | Component Type | |:------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------|:-------------------------------------------------------------------------|:----------------------------------------------------------| |[English](https://iso639-3.sil.org/code/eng)| yake | yake | pipe | |[English](https://iso639-3.sil.org/code/eng)| xlnet | xlnet_base_cased | pipe | @@ -155,7 +155,7 @@ wrapped inside of a NLU Pipeline.
    {:.table-model-big.mb0} -| Language Name(s) | NLU Reference | Spark NLP Reference | +| Language Name(s) | nlp.load() Reference | Spark NLP Reference | |:----------------------------------------------------------------------------------------------------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | [Aequian](https://iso639-3.sil.org/code/xae) | [vn.answer_question.xlm_roberta.base](https://nlp.johnsnowlabs.com/2022/06/23/xlm_roberta_qa_xlm_roberta_base_vietnamese_vn_3_0.html) | [xlm_roberta_qa_xlm_roberta_base_vietnamese](https://nlp.johnsnowlabs.com/2022/06/23/xlm_roberta_qa_xlm_roberta_base_vietnamese_vn_3_0.html) | | [Aequian](https://iso639-3.sil.org/code/xae) | [roberta](https://nlp.johnsnowlabs.com) | [distilroberta_base](https://nlp.johnsnowlabs.com) | @@ -260,7 +260,7 @@ wrapped inside of a NLU Pipeline.
    {:.table-model-big.mb0} -| Language Name(s) | NLU Reference | Spark NLP Reference | +| Language Name(s) | nlp.load() Reference | Spark NLP Reference | |:--------------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------| | [Aequian](https://iso639-3.sil.org/code/xae) | [lang](https://nlp.johnsnowlabs.com) | [detect_language_375](https://nlp.johnsnowlabs.com) | | [Aequian](https://iso639-3.sil.org/code/xae) | [lang.bigru](https://nlp.johnsnowlabs.com) | [detect_language_bigru_21](https://nlp.johnsnowlabs.com) | @@ -2056,7 +2056,7 @@ wrapped inside of a NLU Pipeline. ## Healthcare Pipeline references {:.table-model-big.mb0} -| Language Name(s) | NLU Reference | Spark NLP Reference | +| Language Name(s) | nlp.load() Reference | Spark NLP Reference | |:-------------------------------------------------------------------|:----------------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------| | [English](https://iso639-3.sil.org/code/eng) | [en.snomed.umls.mapping](https://nlp.johnsnowlabs.com/2022/06/27/snomed_umls_mapping_en_3_0.html) | [snomed_umls_mapping](https://nlp.johnsnowlabs.com/2022/06/27/snomed_umls_mapping_en_3_0.html) | | [English](https://iso639-3.sil.org/code/eng) | [en.rxnorm.umls.mapping](https://nlp.johnsnowlabs.com/2022/06/27/rxnorm_umls_mapping_en_3_0.html) | [rxnorm_umls_mapping](https://nlp.johnsnowlabs.com/2022/06/27/rxnorm_umls_mapping_en_3_0.html) | diff --git a/docs/en/nlp_pipelines.md b/docs/en/nlp_pipelines.md new file mode 100644 index 00000000..5dd01fb2 --- /dev/null +++ b/docs/en/nlp_pipelines.md @@ -0,0 +1,469 @@ +--- +layout: docs +header: true +seotitle: NLU | John Snow Labs +title: NLP Pipelines +key: docs-examples +permalink: /docs/en/nlp_pipes +modify_date: "2019-05-16" +--- + + +## Concepts + +Spark ML provides a set of Machine Learning applications that can be build using two main components: **Estimators** and **Transformers**. The **Estimators** have a method called fit() which secures and trains a piece of data to such application. +The **Transformer** is generally the result of a fitting process and applies changes to the the target dataset. +These components have been embedded to be applicable to Spark NLP. + +**Pipelines** are a mechanism for combining multiple estimators and transformers in a single workflow. They allow multiple chained transformations along a Machine Learning task. For more information please refer to [Spark ML](https://spark.apache.org/docs/latest/ml-guide.html) library. + +## Annotation + +The basic result of a NLP operation is an **annotation**. It's structure includes: + +- **annotatorType:** the type of annotator that generated the current annotation +- **begin:** the begin of the matched content relative to raw-text +- **end:** the end of the matched content relative to raw-text +- **result:** the main output of the annotation +- **metadata:** content of matched result and additional information +- **embeddings:** (new in 2.0) contains vector mappings if required + +This object is **automatically generated** by annotators after a transform process. No manual work is required. However, it is important to clearly understand the structure of an annotation to be able too efficiently use it. + +## Annotators + +
    + +Annotators are the spearhead of NLP functions in Spark NLP. There are two forms of annotators: + +- **Annotator Approaches:** are those who represent a Spark ML Estimator and require a training stage. They have a function called fit(data) which trains a model based on some data. They produce the second type of annotator which is an annotator model or transformer. +- **Annotator Models:** are spark models or transformers, meaning they have a **transform(data)** function. This function takes as input a dataframe to which it adds a new column containing the result of the current annotation. All transformers are additive, meaning they append to current data, never replace or delete previous information. + +Both forms of annotators can be included in a Pipeline. All annotators included in a Pipeline will be automatically executed in the defined order and will transform the data accordingly. A Pipeline is turned into a PipelineModel after the fit() stage. The Pipeline can be saved to disk and re-loaded at any time. + +
    + +### Common Functions + +- **setInputCols**(column_names): Takes a list of column names of annotations required by this annotator. Those are generated by the annotators which precede the current annotator in the pipeline. +- **setOutputCol(**column_name): Defines the name of the column containing the result of the current annotator. Use this name as an input for other annotators down the pipeline requiring the outputs generated by the current annotator. + +
    + +## Quickly annotate some text + +You can run these examples using Python or Scala. + +The easiest way to run the python examples is by starting a pyspark jupyter notebook including the spark-nlp package: + +```sh +$ java -version +# should be Java 8 (Oracle or OpenJDK) +$ conda create -n sparknlp python=3.7 -y +$ conda activate sparknlp +# spark-nlp by default is based on pyspark 3.x +$ pip install spark-nlp==4.2.2 pyspark==3.2.1 jupyter +$ jupyter notebook +``` + +
    + +### Explain Document ML + +Spark NLP offers a variety of pretrained pipelines that will help you get started, and get a sense of how the library works. We are constantly +working on improving the available content. +You can checkout a demo application of the Explain Document ML pipeline here: + +{:.btn-block} +[View Demo](https://demo.johnsnowlabs.com/public/GRAMMAR_EN/){:.button.button--primary.button--rounded.button--md} + +
    + +### Downloading and using a pretrained pipeline + +Explain Document ML (**explain_document_ml**) is a pretrained pipeline that does a little bit of everything NLP related. Let's try it +out in scala. Note that the first time you run the below code it might take longer since it downloads the pretrained pipeline from our servers! + + +```python +from johnsnowlabs import nlp +spark = nlp.start() + +explain_document_pipeline = nlp.PretrainedPipeline("explain_document_ml") +annotations = explain_document_pipeline.annotate("We are very happy about SparkNLP") +print(annotations) + +OUTPUT: +{ + 'stem': ['we', 'ar', 'veri', 'happi', 'about', 'sparknlp'], + 'checked': ['We', 'are', 'very', 'happy', 'about', 'SparkNLP'], + 'lemma': ['We', 'be', 'very', 'happy', 'about', 'SparkNLP'], + 'document': ['We are very happy about SparkNLP'], + 'pos': ['PRP', 'VBP', 'RB', 'JJ', 'IN', 'NNP'], + 'token': ['We', 'are', 'very', 'happy', 'about', 'SparkNLP'], + 'sentence': ['We are very happy about SparkNLP'] +} +``` + + +
    + +As you can see the explain_document_ml is able to annotate any "document" providing as output a list of stems, check-spelling, lemmas, +part of speech tags, tokens and sentence boundary detection and all this "out-of-the-box"!. + + +### Using a pretrained pipeline with spark dataframes + +You can also use the pipeline with a spark dataframe. You just need to create first a spark dataframe with a column named "text" that will +work as the input for the pipeline and then use the *.transform()* method to run the pipeline over that dataframe and store the outputs of the +different components in a spark dataframe. + +Remember than when starting jupyter notebook from pyspark or when running the spark-shell for scala, a Spark Session is started in the background +by default within the namespace 'scala'. + +
    + + +```python +from johnsnowlabs import nlp +spark = nlp.start() + +sentences = [ + ['Hello, this is an example sentence'], + ['And this is a second sentence.'] +] + +# spark is the Spark Session automatically started by pyspark. +data = spark.createDataFrame(sentences).toDF("text") + +# Download the pretrained pipeline from Johnsnowlab's servers +explain_document_pipeline = nlp.PretrainedPipeline("explain_document_ml") + +OUTPUT: +explain_document_ml download started this may take some time. +Approx size to download 9.4 MB +[OK!] +``` +```python +# Transform 'data' and store output in a new 'annotations_df' dataframe +annotations_df = explain_document_pipeline.transform(data) + +# Show the results +annotations_df.show() + +OUTPUT: ++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+ +| text| document| sentence| token| checked| lemma| stem| pos| ++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+ +|Hello, this is an...|[[document, 0, 33...|[[document, 0, 33...|[[token, 0, 4, He...|[[token, 0, 4, He...|[[token, 0, 4, He...|[[token, 0, 4, he...|[[pos, 0, 4, UH, ...| +|And this is a sec...|[[document, 0, 29...|[[document, 0, 29...|[[token, 0, 2, An...|[[token, 0, 2, An...|[[token, 0, 2, An...|[[token, 0, 2, an...|[[pos, 0, 2, CC, ...| ++--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+--------------------+ +``` + + +### Manipulating pipelines + +The output of the previous DataFrame was in terms of Annotation objects. This output is not really comfortable to deal with, as you can see by +running the code: + + + +```python +annotations_df.select("token").show(truncate=False) + +OUTPUT: ++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +|token | ++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +|[[token, 0, 4, Hello, [sentence -> 0], [], []], [token, 5, 5, ,, [sentence -> 0], [], []], [token, 7, 10, this, [sentence -> 0], [], []], [token, 12, 13, is, [sentence -> 0], [], []], [token, 15, 16, an, [sentence -> 0], [], []], [token, 18, 24, example, [sentence -> 0], [], []], [token, 26, 33, sentence, [sentence -> 0], [], []]]| +|[[token, 0, 2, And, [sentence -> 0], [], []], [token, 4, 7, this, [sentence -> 0], [], []], [token, 9, 10, is, [sentence -> 0], [], []], [token, 12, 12, a, [sentence -> 0], [], []], [token, 14, 19, second, [sentence -> 0], [], []], [token, 21, 28, sentence, [sentence -> 0], [], []], [token, 29, 29, ., [sentence -> 0], [], []]] | ++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ +``` + + +What if we want to deal with just the resulting annotations? We can use the **Finisher** annotator, retrieve the Explain Document ML pipeline, and add them together in a Spark ML Pipeline. Remember that pretrained pipelines expect the input column to be named "text". + + +```python +from johnsnowlabs import nlp + +spark = nlp.start() +finisher = nlp.Finisher().setInputCols(["token", "lemmas", "pos"]) +explain_pipeline_model = nlp.PretrainedPipeline("explain_document_ml").model + +pipeline = nlp.Pipeline() \ + .setStages([ + explain_pipeline_model, + finisher + ]) + + +sentences = [ + ['Hello, this is an example sentence'], + ['And this is a second sentence.'] +] +data = spark.createDataFrame(sentences).toDF("text") + +model = pipeline.fit(data) +annotations_finished_df = model.transform(data) + +annotations_finished_df.select('finished_token').show(truncate=False) + +OUTPUT: ++-------------------------------------------+ +|finished_token | ++-------------------------------------------+ +|[Hello, ,, this, is, an, example, sentence]| +|[And, this, is, a, second, sentence, .] | ++-------------------------------------------+ +``` + + +## Setup your own pipeline + +
    + +### Annotator types + +Every annotator has a type. Those annotators that share a type, can be used interchangeably, meaning you could use any of them when needed. + +For example, when a token type annotator is required by another annotator, such as a sentiment analysis annotator, you can either provide a normalized +token or a lemma, as both are of type token. + +
    + +### DocumentAssembler: Getting data in + +In order to get through the NLP process, we need to get raw data +annotated. There is a special **transformer** that does this for us: +the **DocumentAssembler**, it creates the first annotation of type +**Document** which may be used by annotators down the road. + +
    + + +```python +documentAssembler = nlp.DocumentAssembler() \ + .setInputCol("text") \ + .setOutputCol("document") +``` + + +### Sentence detection and tokenization + +In this quick example, we now proceed to identify the sentences in the input document. SentenceDetector requires a Document annotation, +which is provided by the DocumentAssembler output, and it's itself a Document type token. The Tokenizer requires a Document annotation type. That means it works both with DocumentAssembler or SentenceDetector output. In the following example we use the sentence output. + + +```python +sentenceDetector = nlp.SentenceDetector() \ + .setInputCols(["document"]) \ + .setOutputCol("Sentence") + +regexTokenizer = nlp.Tokenizer() \ + .setInputCols(["sentence"]) \ + .setOutputCol("token") +``` + + +Spark NLP also includes another special transformer, called **Finisher** to show tokens in a human language. + + +```python +finisher = nlp.Finisher() \ + .setInputCols(["token"]) \ + .setCleanAnnotations(False) +``` + + +### Finisher: Getting data out + +At the end of each pipeline or any stage that was done by Spark NLP, you may want to get results out whether onto another pipeline or simply write them on disk. The `Finisher` annotator helps you to clean the metadata (if it's set to true) and output the results into an array: + + +```python +finisher = nlp.Finisher() \ + .setInputCols(["token"]) \ + .setIncludeMetadata(True) +``` + +If you need to have a flattened DataFrame (each sub-array in a new column) from any annotations other than struct type columns, you can use `explode` function from Spark SQL. You can also use Apache Spark functions (SQL) to manipulate the output DataFrame in any way you need. Here we combine the tokens and NER results together: + +```python +from johnsnowlabs import nlp +df.withColumn("tmp", nlp.F.explode("chunk")).select("tmp.*") +``` + +## Using Spark ML Pipeline + +Now we want to put all this together and retrieve the results, we use a Pipeline for this. We use the same data in fit() that we will use in +transform since none of the pipeline stages have a training stage. + + +```python +from johnsnowlabs import nlp +pipeline = nlp.Pipeline() \ + .setStages([ + documentAssembler, + sentenceDetector, + regexTokenizer, + finisher + ]) + +OUTPUT: ++-------------------------------------------+ +|finished_token | ++-------------------------------------------+ +|[hello, ,, this, is, an, example, sentence]| ++-------------------------------------------+ +``` + + +
    + +## Using Spark NLP's LightPipeline + +LightPipeline is a Spark NLP specific Pipeline class equivalent to Spark ML Pipeline. The difference is that it's execution does not hold to +Spark principles, instead it computes everything locally (but in parallel) in order to achieve fast results when dealing with small +amounts of data. This means, we do not input a Spark Dataframe, but a string or an Array of strings instead, to be annotated. To create Light +Pipelines, you need to input an already trained (fit) Spark ML Pipeline. +It's transform() stage is converted into annotate() instead. + + +```python +from johnsnowlabs import nlp +explain_document_pipeline = nlp.PretrainedPipeline("explain_document_ml") +lightPipeline = nlp.LightPipeline(explain_document_pipeline.model) + +OUTPUT: +explain_document_ml download started this may take some time. +Approx size to download 9.4 MB +[OK!] +``` +```python + +lightPipeline.annotate("Hello world, please annotate my text") + +OUTPUT: +{'stem': ['hello', 'world', ',', 'pleas', 'annot', 'my', 'text'], + 'checked': ['Hello', 'world', ',', 'please', 'annotate', 'my', 'text'], + 'lemma': ['Hello', 'world', ',', 'please', 'annotate', 'i', 'text'], + 'document': ['Hello world, please annotate my text'], + 'pos': ['UH', 'NN', ',', 'VB', 'NN', 'PRP$', 'NN'], + 'token': ['Hello', 'world', ',', 'please', 'annotate', 'my', 'text'], + 'sentence': ['Hello world, please annotate my text']} +``` + + +
    + +## Training annotators + +
    + +### Training methodology + +Training your own annotators is a key concept when dealing with +real life scenarios. Any of the annotators provided above, such as +pretrained pipelines and models, can be applied out-of-the-box to a specific +use case, but better results are obtained when they are fine-tuned to your specific use-case. +Dealing with real life problems ofter requires training your own +models. In Spark NLP, we support three ways of training a custom annotator: + +1. Train from **a dataset**. Most annotators are capable of training from a dataset passed to + **fit()** method just as Spark ML does. Annotators that use the suffix + **Approach** are such trainable annotators. Training from fit() is the + standard behavior in Spark ML. Annotators have different schema + requirements for training. Check the reference to see what are the + requirements of each annotators. + +2. Training from an **external source**: Some of our annotators train + from an external file or folder passed to the annotator as a param. + You will see such ones as **setCorpus()** or **setDictionary()** param + setter methods, allowing you to configure the input to use. You can set + Spark NLP to read them as Spark datasets or LINE_BY_LINE which is + usually faster for small files. + +3. Last but not least, some of our annotators are **Deep Learning** + based. These models may be trained with the standard AnnotatorApproach + API just like any other annotator. For more advanced users, we also + allow importing your own graphs or even training from Python and + converting them into an AnnotatorModel. + + +### Spark ML Pipelines + +SparkML Pipelines are a uniform structure that helps creating and tuning +practical machine learning pipelines. Spark NLP integrates with them +seamlessly so it is important to have this concept handy. Once a +**Pipeline** is trained with **fit()**, it becomes a **PipelineModel** + +**Example:** + +```python +from johnsnowlabs import nlp +pipeline = nlp.Pipeline().setStages([...]) +``` + + +
    + +### LightPipeline + +LightPipelines are Spark ML pipelines converted into a single machine +but multithreaded task, becoming more than 10x times faster for smaller +amounts of data (small is relative, but 50k sentences is roughly a good +maximum). To use them, simply plug in a trained (fitted) pipeline. + +**Example:** + + +```python +from johnsnowlabs import nlp +nlp.LightPipeline(someTrainedPipeline).annotate(someStringOrArray) +``` + + + +
    + + +**Functions:** +- annotate(string or string\[\]): returns dictionary list of annotation results +- fullAnnotate(string or string\[\]): returns dictionary list of entire annotations content + For more details please refer to Using Spark NLP's LightPipelines. + + +### RecursivePipeline + +Recursive pipelines are SparkNLP specific pipelines that allow a Spark +ML Pipeline to know about itself on every Pipeline Stage task, allowing +annotators to utilize this same pipeline against external resources to +process them in the same way the user decides. Only some of our +annotators take advantage of this. RecursivePipeline behaves exactly +the same as normal Spark ML pipelines, so they can be used with the +same intention. + +**Example:** + +```python +from johnsnowlabs import nlp +recursivePipeline = nlp.RecursivePipeline(stages=[ + documentAssembler, + sentenceDetector, + tokenizer, + lemmatizer, + finisher +]) +``` + +### Params and Features + +#### Annotator parameters + +SparkML uses ML Params to store pipeline parameter maps. In SparkNLP, +we also use Features, which are a way to store parameter maps that are +larger than just a string or a boolean. These features are serialized +as either Parquet or RDD objects, allowing much faster and scalable +annotator information. Features are also broadcasted among executors for +better performance. \ No newline at end of file diff --git a/docs/en/nlu_for_ocr.md b/docs/en/nlu_for_ocr.md index c335fa83..a36a962b 100644 --- a/docs/en/nlu_for_ocr.md +++ b/docs/en/nlu_for_ocr.md @@ -26,22 +26,22 @@ Additionally you can refer to the OCR tutorial Notebooks **Overview of OCR Text Extractors** These models grab the text directly from your input file and returns it as a Pandas DataFrame -| NLU Spell | Transformer Class | +| NLU Spell | Transformer Class | |----------------------|-----------------------------------------------------------------------------------------| -| nlu.load(`img2text`) | [ImageToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#imagetotext) | -| nlu.load(`pdf2text`) | [PdfToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotext) | -| nlu.load(`doc2text`) | [DocToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotext) | +| nlp.load(`img2text`) | [ImageToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#imagetotext) | +| nlp.load(`pdf2text`) | [PdfToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotext) | +| nlp.load(`doc2text`) | [DocToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotext) | **Overview of OCR Table Extractors** These models grab all Table data from the files detected and return a `list of Pandas DataFrames`, containing Pandas DataFrame for every table detected -| NLU Spell | Transformer Class | -|----------------------|-----------------------------------------------------------------------------------------| -| nlu.load(`pdf2table`) | [PdfToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotexttable) | -| nlu.load(`ppt2table`) | [PptToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#ppttotexttable) | -| nlu.load(`doc2table`) | [DocToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotexttable) | +| NLU Spell | Transformer Class | +|-----------------------|-----------------------------------------------------------------------------------------------| +| nlp.load(`pdf2table`) | [PdfToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotexttable) | +| nlp.load(`ppt2table`) | [PptToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#ppttotexttable) | +| nlp.load(`doc2table`) | [DocToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotexttable) |
    diff --git a/docs/en/notebooks.md b/docs/en/notebooks.md index 216c7c0e..46944ff1 100644 --- a/docs/en/notebooks.md +++ b/docs/en/notebooks.md @@ -2,7 +2,7 @@ layout: docs header: true seotitle: NLU | John Snow Labs -title: NLU Notebook Examples +title: 1-liner Tutorial Notebooks key: notebooks permalink: /docs/en/notebooks modify_date: "2019-05-16" @@ -11,24 +11,25 @@ modify_date: "2019-05-16"
    {:.h2-select} -## Tutorials Overview -The following tables give an overview on the different tutorials with NLU. The tables are splitted by category. By using the correct model, NLU can do anything for you, ranging from simple translations (even from scriptures, based on non-Latin letters) to textprocessing tasks (sentiment prediction, named entity recognition and on on). There are also colab notebooks for you to read. +The following tables give an overview on the different tutorials with the 1-liners. +The tables are grouped +by category.
    ## Embeddings Tutorials Overview {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Albert Word Embeddings with NLU | `albert`, `sentiment pos albert emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ALBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Albert-Paper](https://arxiv.org/pdf/1909.11942.pdf), [Albert on Github](https://github.com/google-research/ALBERT), [Albert on TensorFlow](https://tfhub.dev/s?q=albert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Albert](https://medium.com/spark-nlp/1-line-to-albert-word-embeddings-with-nlu-in-python-1691bc048ed1), [Albert_Embedding](https://nlp.johnsnowlabs.com/2021/06/23/albert_base_uncased_en.html) | -| Bert Word Embeddings with NLU | `bert`, `pos sentiment emotion bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_BERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Bert](https://medium.com/spark-nlp/1-line-to-bert-word-embeddings-with-nlu-f50d2b08cddc), [Bert_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | -| BIOBERT Word Embeddings with NLU | `biobert` , `sentiment pos biobert emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_BIOBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [BioBert-Paper](https://arxiv.org/abs/1901.08746), [Bert Github](https://github.com/google-research/bert) , [BERT: Deep Bidirectional Transformers](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Biobert](https://medium.com/spark-nlp/1-line-to-biobert-word-embeddings-with-nlu-in-python-7224ab52e131), [Biobert_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/biobert_pubmed_base_cased.html) | -| COVIDBERT Word Embeddings with NLU | `covidbert`, `sentiment covidbert pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_COVIDBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [CovidBert-Paper](https://journals.flvc.org/FLAIRS/article/view/128488), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-CovidBert](https://medium.com/spark-nlp/1-line-to-covidbert-word-embeddings-with-nlu-in-python-e67396da2f78), [Covidbert_Embedding](https://nlp.johnsnowlabs.com/2020/08/27/covidbert_large_uncased.html) | -| ELECTRA Word Embeddings with NLU | `electra`, `sentiment pos en.embed.electra emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ELECTRA_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Electra-Paper](https://arxiv.org/abs/2003.10555), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Electra](https://medium.com/spark-nlp/1-line-to-electra-word-embeddings-with-nlu-in-python-25f749bf3e92), [Electra_Embedding](https://nlp.johnsnowlabs.com/2020/08/27/electra_small_uncased.html) | -| ELMO Word Embeddings with NLU | `elmo`, `sentiment pos elmo emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ELMo_word_embeddings_and_t-SNE_visualization_example.ipynb) | [ELMO-Paper](https://arxiv.org/abs/1802.05365), [Elmo-TensorFlow](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Elmo](https://medium.com/spark-nlp/1-python-line-for-elmo-word-embeddings-with-john-snow-labs-nlu-628e9b924a3), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html) | -| GLOVE Word Embeddings with NLU | `glove`, `sentiment pos glove emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_GLOVE_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Glove-Paper](https://nlp.stanford.edu/pubs/glove.pdf), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Glove](https://medium.com/spark-nlp/1-line-to-glove-word-embeddings-with-nlu-in-python-baed152fff4d) , [Glove_Embedding](https://nlp.johnsnowlabs.com/2020/01/22/glove_100d.html) | -| XLNET Word Embeddings with NLU | `xlnet`, `sentiment pos xlnet emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_XLNET_word_embeddings_and_t-SNE_visualization_example.ipynb) | [XLNet-Paper](https://arxiv.org/abs/1906.08237), [Bert Github](https://github.com/zihangdai/xlnet), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-XLNet](https://medium.com/spark-nlp/1-line-to-xlnet-word-embeddings-with-nlu-in-python-5efc57d7ac79), [Xlnet_Embedding](https://nlp.johnsnowlabs.com/2021/07/07/xlnet_base_cased_en.html) | +| Albert Word Embeddings | `albert`, `sentiment pos albert emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ALBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Albert-Paper](https://arxiv.org/pdf/1909.11942.pdf), [Albert on Github](https://github.com/google-research/ALBERT), [Albert on TensorFlow](https://tfhub.dev/s?q=albert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Albert](https://medium.com/spark-nlp/1-line-to-albert-word-embeddings-with-nlu-in-python-1691bc048ed1), [Albert_Embedding](https://nlp.johnsnowlabs.com/2021/06/23/albert_base_uncased_en.html) | +| Bert Word Embeddings | `bert`, `pos sentiment emotion bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_BERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Bert](https://medium.com/spark-nlp/1-line-to-bert-word-embeddings-with-nlu-f50d2b08cddc), [Bert_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | +| BIOBERT Word Embeddings | `biobert` , `sentiment pos biobert emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_BIOBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [BioBert-Paper](https://arxiv.org/abs/1901.08746), [Bert Github](https://github.com/google-research/bert) , [BERT: Deep Bidirectional Transformers](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Biobert](https://medium.com/spark-nlp/1-line-to-biobert-word-embeddings-with-nlu-in-python-7224ab52e131), [Biobert_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/biobert_pubmed_base_cased.html) | +| COVIDBERT Word Embeddings | `covidbert`, `sentiment covidbert pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_COVIDBERT_word_embeddings_and_t-SNE_visualization_example.ipynb) | [CovidBert-Paper](https://journals.flvc.org/FLAIRS/article/view/128488), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-CovidBert](https://medium.com/spark-nlp/1-line-to-covidbert-word-embeddings-with-nlu-in-python-e67396da2f78), [Covidbert_Embedding](https://nlp.johnsnowlabs.com/2020/08/27/covidbert_large_uncased.html) | +| ELECTRA Word Embeddings | `electra`, `sentiment pos en.embed.electra emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ELECTRA_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Electra-Paper](https://arxiv.org/abs/2003.10555), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Electra](https://medium.com/spark-nlp/1-line-to-electra-word-embeddings-with-nlu-in-python-25f749bf3e92), [Electra_Embedding](https://nlp.johnsnowlabs.com/2020/08/27/electra_small_uncased.html) | +| ELMO Word Embeddings | `elmo`, `sentiment pos elmo emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_ELMo_word_embeddings_and_t-SNE_visualization_example.ipynb) | [ELMO-Paper](https://arxiv.org/abs/1802.05365), [Elmo-TensorFlow](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Elmo](https://medium.com/spark-nlp/1-python-line-for-elmo-word-embeddings-with-john-snow-labs-nlu-628e9b924a3), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html) | +| GLOVE Word Embeddings | `glove`, `sentiment pos glove emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_GLOVE_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Glove-Paper](https://nlp.stanford.edu/pubs/glove.pdf), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Glove](https://medium.com/spark-nlp/1-line-to-glove-word-embeddings-with-nlu-in-python-baed152fff4d) , [Glove_Embedding](https://nlp.johnsnowlabs.com/2020/01/22/glove_100d.html) | +| XLNET Word Embeddings | `xlnet`, `sentiment pos xlnet emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_XLNET_word_embeddings_and_t-SNE_visualization_example.ipynb) | [XLNet-Paper](https://arxiv.org/abs/1906.08237), [Bert Github](https://github.com/zihangdai/xlnet), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-XLNet](https://medium.com/spark-nlp/1-line-to-xlnet-word-embeddings-with-nlu-in-python-5efc57d7ac79), [Xlnet_Embedding](https://nlp.johnsnowlabs.com/2021/07/07/xlnet_base_cased_en.html) | | Multiple Word-Embeddings and Part of Speech in 1 Line of code | `bert electra elmo glove xlnet albert pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/word_embeddings/NLU_multiple_word_embeddings_and_t-SNE_visualization_example.ipynb) | [Bert-Paper](https://arxiv.org/pdf/1810.04805.pdf), [Albert-Paper](https://openreview.net/forum?id=H1eA7AEtvS), [ELMO-Paper](https://arxiv.org/abs/1802.05365), [Electra-Paper](https://arxiv.org/abs/2003.10555), [XLNet-Paper](https://arxiv.org/pdf/1906.08237.pdf), [Glove-Paper](https://nlp.stanford.edu/pubs/glove.pdf) |
    @@ -36,14 +37,14 @@ The following tables give an overview on the different tutorials with NLU. The t ## Text Preprocessing and Cleaning {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Normalzing with NLU | `norm` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_normalizer_example.ipynb) | - | -| Detect sentences with NLU | `sentence_detector.deep`, `sentence_detector.pragmatic`, `xx.sentence_detector` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_sentence_detection_example.ipynb) | [Sentence Detector](https://nlp.johnsnowlabs.com/2020/09/13/sentence_detector_dl_en.html) | -| Spellchecking with NLU | n.a. | n.a. | - | -| Stemming with NLU | `en.stem`, `de.stem` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_stemmer_example.ipynb) | - | -| Stopwords removal with NLU | `stopwords` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_stopwords_removal_example.ipynb) | [Stopwords](https://nlp.johnsnowlabs.com/2020/07/14/stopwords_en.html) | -| Tokenization with NLU | `tokenize` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_tokenization_example.ipynb) | - | +| Normalzing | `norm` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_normalizer_example.ipynb) | - | +| Detect sentences | `sentence_detector.deep`, `sentence_detector.pragmatic`, `xx.sentence_detector` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_sentence_detection_example.ipynb) | [Sentence Detector](https://nlp.johnsnowlabs.com/2020/09/13/sentence_detector_dl_en.html) | +| Spellchecking | n.a. | n.a. | - | +| Stemming | `en.stem`, `de.stem` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_stemmer_example.ipynb) | - | +| Stopwords removal | `stopwords` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_stopwords_removal_example.ipynb) | [Stopwords](https://nlp.johnsnowlabs.com/2020/07/14/stopwords_en.html) | +| Tokenization | `tokenize` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/NLU_tokenization_example.ipynb) | - | | Normalization of Documents | `norm_document` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/text_pre_processing_and_cleaning/document_normalizer_demo.ipynb) | - |
    @@ -51,7 +52,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Sequence to Sequence {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Open and Closed book question answering with Google's T5 | `en.t5` , `answer_question` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_question_answering.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf), [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | | Overview of every task available with T5 | `en.t5.base` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sequence2sequence/T5_tasks_summarize_question_answering_and_more.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf), [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html) | @@ -62,28 +63,28 @@ The following tables give an overview on the different tutorials with NLU. The t ## Sentence Embeddings {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| BERT Sentence Embeddings with NLU | `embed_sentence.bert`, `pos sentiment embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_BERT_sentence_embeddings_and_t-SNE_visualization_Example.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | -| ELECTRA Sentence Embeddings with NLU | `embed_sentence.electra`, `pos sentiment embed_sentence.electra` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_ELECTRA_sentence_embeddings_and_t-SNE_visualization_example.ipynb) | [Electra Paper](https://arxiv.org/abs/2003.10555), [Sentence-Electra-Embedding](https://nlp.johnsnowlabs.com/2020/08/27/sent_electra_small_uncased.html) | -| USE Sentence Embeddings with NLU | `use`, `pos sentiment use emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_USE_sentence_embeddings_and_t-SNE_visualization_example.ipynb) | [Universal Sentence Encoder](https://arxiv.org/abs/1803.11175), [USE-TensorFlow](https://tfhub.dev/google/universal-sentence-encoder/2), [Sentence-USE-Embedding](https://nlp.johnsnowlabs.com/2020/04/17/tfhub_use_lg.html) | -| Sentence similarity with NLU using BERT embeddings | `embed_sentence.bert`, `use en.embed_sentence.electra embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/sentence_similarirty_stack_overflow_questions.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | +| BERT Sentence Embeddings | `embed_sentence.bert`, `pos sentiment embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_BERT_sentence_embeddings_and_t-SNE_visualization_Example.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | +| ELECTRA Sentence Embeddings | `embed_sentence.electra`, `pos sentiment embed_sentence.electra` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_ELECTRA_sentence_embeddings_and_t-SNE_visualization_example.ipynb) | [Electra Paper](https://arxiv.org/abs/2003.10555), [Sentence-Electra-Embedding](https://nlp.johnsnowlabs.com/2020/08/27/sent_electra_small_uncased.html) | +| USE Sentence Embeddings | `use`, `pos sentiment use emotion` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/NLU_USE_sentence_embeddings_and_t-SNE_visualization_example.ipynb) | [Universal Sentence Encoder](https://arxiv.org/abs/1803.11175), [USE-TensorFlow](https://tfhub.dev/google/universal-sentence-encoder/2), [Sentence-USE-Embedding](https://nlp.johnsnowlabs.com/2020/04/17/tfhub_use_lg.html) | +| Sentence similarity using BERT embeddings | `embed_sentence.bert`, `use en.embed_sentence.electra embed_sentence.bert` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/sentence_embeddings/sentence_similarirty_stack_overflow_questions.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) |
    ## Part of Speech {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Part of Speech tagging with NLU | `pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/part_of_speechPOS/NLU_part_of_speech_ANC_example.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html) | +| Part of Speech tagging | `pos` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/part_of_speechPOS/NLU_part_of_speech_ANC_example.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html) |
    ## Named Entity Recognition (NER) {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NER Aspect Airline ATIS | `en.ner.aspect.airline` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/named_entity_recognition_NER/NER_aspect_airline_ATIS.ipynb) | [NER Airline Model](https://nlp.johnsnowlabs.com/2021/01/25/nerdl_atis_840b_300d_en.html), [Atis intent Dataset](https://www.kaggle.com/hassanamin/atis-airlinetravelinformationsystem) | | NLU-NER_CONLL_2003_5class_example | `ner` |[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/tutorial_docs/examples/colab/component_examples/named_entity_recognition_NER/NLU_ner_CONLL_2003_5class_example.ipynb) | [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html) | @@ -95,7 +96,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Multilingual Tasks {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Detect Named Entities (NER), Part of Speech Tags (POS) and Tokenize in Chinese | `zh.segment_words`, `zh.pos`, `zh.ner`, `zh.translate_to.en` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/chinese_ner_pos_and_tokenization.ipynb) | [Translation-Pipeline (Zh to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_zh_en_xx.html) | | Detect Named Entities (NER), Part of Speech Tags (POS) and Tokenize in Japanese | `ja.segment_words`, `ja.pos`, `ja.ner`, `ja.translate_to.en` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/multilingual/japanese_ner_pos_and_tokenization.ipynb) | [Translation-Pipeline (Ja to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_ja_en_xx.html) | @@ -106,7 +107,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Matchers {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Date Matching | `match.datetime` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/matchers/NLU_date_matching.ipynb) | - | @@ -115,31 +116,31 @@ The following tables give an overview on the different tutorials with NLU. The t ## Dependency Parsing {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Typed Dependency Parsing with NLU | `dep` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_typed_dependency_parsing_example.ipynb) | [Dependency Parsing ](https://nlp.johnsnowlabs.com/2021/03/27/Typed_Dependency_Parsing_en.html) | -| Untyped Dependency Parsing with NLU | `dep.untyped` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_untyped_dependency_parsing_example.ipynb) | - | +| Typed Dependency Parsing | `dep` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_typed_dependency_parsing_example.ipynb) | [Dependency Parsing ](https://nlp.johnsnowlabs.com/2021/03/27/Typed_Dependency_Parsing_en.html) | +| Untyped Dependency Parsing | `dep.untyped` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/dependency_parsing/NLU_untyped_dependency_parsing_example.ipynb) | - |
    ## Classifiers {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| E2E Classification with NLU | `e2e` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/E2E_classification.ipynb) | [e2e-Model](https://nlp.johnsnowlabs.com/2021/01/21/multiclassifierdl_use_e2e_en.html) | -| Language Classification with NLU | `lang` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/NLU_language_classification.ipynb) | - | -| Cyberbullying Classification with NLU | `classify.cyberbullying` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/cyberbullying_cassification_for_racism_and_sexism.ipynb) | [Cyberbullying-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_cyberbullying_en.html) | -| Sentiment Classification with NLU for Twitter | `emotion` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/emotion_classification.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | -| Fake News Classification with NLU | `en.classify.fakenews` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/fake_news_classification.ipynb) | [Fakenews-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_fakenews_en.html) | -| Intent Classification with NLU | `en.classify.intent.airline` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/intent_classification_airlines_ATIS.ipynb) | [Airline-Intention classifier](https://nlp.johnsnowlabs.com/2021/01/25/classifierdl_use_atis_en.html), [Atis-Dataset](https://www.kaggle.com/hassanamin/atis-airlinetravelinformationsystem?select=atis_intents.csv) | +| E2E Classification | `e2e` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/E2E_classification.ipynb) | [e2e-Model](https://nlp.johnsnowlabs.com/2021/01/21/multiclassifierdl_use_e2e_en.html) | +| Language Classification | `lang` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/NLU_language_classification.ipynb) | - | +| Cyberbullying Classification | `classify.cyberbullying` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/cyberbullying_cassification_for_racism_and_sexism.ipynb) | [Cyberbullying-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_cyberbullying_en.html) | +| Sentiment Classification for Twitter | `emotion` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/emotion_classification.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | +| Fake News Classification | `en.classify.fakenews` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/fake_news_classification.ipynb) | [Fakenews-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_fakenews_en.html) | +| Intent Classification | `en.classify.intent.airline` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/intent_classification_airlines_ATIS.ipynb) | [Airline-Intention classifier](https://nlp.johnsnowlabs.com/2021/01/25/classifierdl_use_atis_en.html), [Atis-Dataset](https://www.kaggle.com/hassanamin/atis-airlinetravelinformationsystem?select=atis_intents.csv) | | Question classification based on the TREC dataset | `en.classify.questions` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/question_classification.ipynb) | [Question-Classifier](https://nlp.johnsnowlabs.com/2021/01/08/classifierdl_use_trec50_en.html) | -| Sarcasm Classification with NLU | `en.classify.sarcasm` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sarcasm_classification.ipynb) | [Sarcasm-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_sarcasm_en.html) | -| Sentiment Classification with NLU for Twitter | `en.sentiment.twitter` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sentiment_classification.ipynb) | [Sentiment_Twitter-Classifier](https://nlp.johnsnowlabs.com/2021/01/18/sentimentdl_use_twitter_en.html) | -| Sentiment Classification with NLU for Movies | `en.sentiment.imdb` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sentiment_classification_movies.ipynb) | [Sentiment_imdb-Classifier](https://nlp.johnsnowlabs.com/2021/01/15/analyze_sentimentdl_use_imdb_en.html) | -| Spam Classification with NLU | `en.classify.spam` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/spam_classification.ipynb) | [Spam-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_spam_en.html) | -| Toxic text classification with NLU | `en.classify.toxic` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/toxic_classification.ipynb) | [Toxic-Classifier](https://nlp.johnsnowlabs.com/2021/01/21/multiclassifierdl_use_toxic_en.html) | -| Unsupervised keyword extraction with NLU using the YAKE algorithm | `yake` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/unsupervised_keyword_extraction_with_YAKE.ipynb) | - | +| Sarcasm Classification | `en.classify.sarcasm` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sarcasm_classification.ipynb) | [Sarcasm-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_sarcasm_en.html) | +| Sentiment Classification for Twitter | `en.sentiment.twitter` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sentiment_classification.ipynb) | [Sentiment_Twitter-Classifier](https://nlp.johnsnowlabs.com/2021/01/18/sentimentdl_use_twitter_en.html) | +| Sentiment Classification for Movies | `en.sentiment.imdb` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/sentiment_classification_movies.ipynb) | [Sentiment_imdb-Classifier](https://nlp.johnsnowlabs.com/2021/01/15/analyze_sentimentdl_use_imdb_en.html) | +| Spam Classification | `en.classify.spam` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/spam_classification.ipynb) | [Spam-Classifier](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_spam_en.html) | +| Toxic text classification | `en.classify.toxic` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/toxic_classification.ipynb) | [Toxic-Classifier](https://nlp.johnsnowlabs.com/2021/01/21/multiclassifierdl_use_toxic_en.html) | +| Unsupervised keyword extraction using the YAKE algorithm | `yake` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/unsupervised_keyword_extraction_with_YAKE.ipynb) | - | |Notebook for Classification of Banking Queries| `en.classify.distilbert_sequence.banking77`|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/Banking_Queries_Classification.ipynb)| [DistilBERT Sequence Classification - Banking77](https://nlp.johnsnowlabs.com/2021/11/21/distilbert_sequence_classifier_banking77_en.html) | |Notebook for Classification of Intent in Texts| `en.ner.snips`|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/Identify_intent_in_general_text.ipynb)| [Identify intent in general text - SNIPS dataset](https://nlp.johnsnowlabs.com/2021/02/15/classifierdl_use_snips_en.html) | |Notebook for classification of Similar Questions|`en.classify.questionpair`|[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/classifiers/Question_Pair_Classification.ipynb)| [Question Pair Classifier](https://nlp.johnsnowlabs.com/2021/08/13/classifierdl_electra_questionpair_en.html) | @@ -151,17 +152,17 @@ The following tables give an overview on the different tutorials with NLU. The t ## Chunkers {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Grammatical Chunk Matching with NLU | `match.chunks` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_chunking_example.ipynb) | - | -| Getting n-Grams with NLU | `ngram` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_n-gram.ipynb) | - | +| Grammatical Chunk Matching | `match.chunks` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_chunking_example.ipynb) | - | +| Getting n-Grams | `ngram` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/component_examples/chunkers/NLU_n-gram.ipynb) | - |
    ## Healthcare {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Assertion | `en.med_ner.clinical en.assert`, `en.med_ner.clinical.biobert en.assert.biobert`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/assertion/assertion_overview.ipynb) | [Healthcare-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_clinical_en.html), [NER_Clinical-Classifier]( https://nlp.johnsnowlabs.com/2021/11/03/ner_profiling_biobert_en.html), [Toxic-Classifier](https://nlp.johnsnowlabs.com/2021/01/26/assertion_dl_biobert_en.html) | | De-Identification Model overview | `med_ner.jsl.wip.clinical en.de_identify`, `med_ner.jsl.wip.clinical en.de_identify.clinical`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/healthcare/de_identification/DeIdentification_model_overview.ipynb) | [NER-Clinical](https://nlp.johnsnowlabs.com/2021/11/03/ner_profiling_clinical_en.html) | @@ -175,7 +176,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Visualization {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Visualization of NLP-Models with Spark-NLP and NLU | `ner`, `dep.typed`, `med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in`, `med_ner.jsl.wip.clinical resolve.icd10cm` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/visualization/NLU_visualizations_tutorial.ipynb) | [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Dependency Parsing](https://nlp.johnsnowlabs.com/2021/03/27/Typed_Dependency_Parsing_en.html), [NER-Clinical](https://nlp.johnsnowlabs.com/2021/11/03/ner_profiling_clinical_en.html), [Entity-Resolver (Chunks) clinical](https://nlp.johnsnowlabs.com/2021/04/16/chunkresolve_rxnorm_in_clinical_en.html) | @@ -184,7 +185,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Example Notebooks on Kaggle, Examination on real life Problems. {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NLU Covid-19 Emotion Showcase | `emotion` | [![Open In GitHub]()](https://github.com/JohnSnowLabs/nlu/blob/master/examples/kaggle/nlu_covid_emotion_showcase.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | | NLU Covid-19 Sentiment Showcase | `sentiment` | [![Open In GitHub]()](https://github.com/JohnSnowLabs/nlu/blob/master/examples/kaggle/nlu_covid_sentiment_showcase.ipynb) | [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | @@ -196,7 +197,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Release Notebooks {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Bengali NER Hindi Embeddings for 30 Models | `bn.ner`, `bn.lemma`, `ja.lemma`, `am.lemma`, `bh.lemma`,` en.ner.onto.bert.small_l2_128`,.. | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/Murat-Karadag/nlu/blob/master/examples/release_notebooks/NLU1.1.2_Bengali_ner_Hindi_Embeddings_30_new_models.ipynb) | [Bengali-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_jifs_glove_840B_300d_bn.html), [Bengali-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_bn.html), [Japanese-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/15/lemma_ja.html), [Amharic-Lemmatizer](https://nlp.johnsnowlabs.com/2021/01/20/lemma_am.html) | | Entity Resolution | `med_ner.jsl.wip.clinical en.resolve.umls`, `med_ner.jsl.wip.clinical en.resolve.loinc`, `med_ner.jsl.wip.clinical en.resolve.loinc.biobert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/release_notebooks/NLU_3_0_2_release_notebook.ipynb) | - | @@ -206,7 +207,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Crash-Course {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | NLU 20 Minutes Crashcourse - the fast Data Science route | `spell`, `sentiment`, `pos`, `ner`, `yake`, `en.t5`, `emotion`, `answer_question`, `en.t5.base` ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/AI4_2021/NLU_crash_course_AI4.ipynb) | [T5-Model](https://nlp.johnsnowlabs.com/2021/01/08/t5_base_en.html), [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) , [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | @@ -215,7 +216,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Natural Language Processing (NLP) {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Chapter 0: Intro: 1-liners | `sentiment`, `pos`, `ner`, `bert`, `elmo`, `embed_sentence.bert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/NYC_DC_NLP_MEETUP/0_liners_intro.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html), [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | | Chapter 1: NLU base-features with some classifiers on testdata | `emotion`, `yake`, `stem` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/NYC_DC_NLP_MEETUP/1_NLU_base_features_on_dataset_with_YAKE_Lemma_Stemm_classifiers_NER_.ipynb) | [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | @@ -228,7 +229,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## NLU-Crashcourse Graph AI {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Graph NLU 20 Minutes Crashcourse - State of the Art Text Mining for Graphs | `spell`, `sentiment`, `pos`, `ner`, `yake`, `emotion`, `med_ner.jsl.wip.clinical`, ... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/graph_ai_summit/Healthcare_Graph_NLU_COVID_Tigergraph.ipynb) | [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html), [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html) | @@ -237,22 +238,22 @@ The following tables give an overview on the different tutorials with NLU. The t ## Healthcare-Training {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Healthcare with NLU | `med_ner.human_phenotype.gene_biobert`, `med_ner.ade_biobert`, `med_ner.anatomy`, `med_ner.bacterial_species`,... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/healthcare_webinar/NLU_healthcare_webinar.ipynb) | - | +| Healthcare | `med_ner.human_phenotype.gene_biobert`, `med_ner.ade_biobert`, `med_ner.anatomy`, `med_ner.bacterial_species`,... | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/healthcare_webinar/NLU_healthcare_webinar.ipynb) | - |
    ## Multilingual-Training {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Part 0: Intro: 1-liners | `spell`, `sentiment`, `pos`, `ner`, `bert`, `elmo`, `embed_sentence.bert` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/0_liners_intro.ipynb) | [Bert-Paper](https://arxiv.org/abs/1810.04805), [Bert Github](https://github.com/google-research/bert), [T-SNE](https://www.jmlr.org/papers/volume9/vandermaaten08a/vandermaaten08a.pdf?fbclid=IwA), [T-SNE-Bert](https://medium.com/spark-nlp/1-line-to-bert-word-embeddings-with-nlu-f50d2b08cddc) , [Part of Speech](https://nlp.johnsnowlabs.com/2021/03/05/pos_anc.html), [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Spellchecker](https://nlp.johnsnowlabs.com/2021/03/28/spellcheck_dl_en.html), [Sentiment classification](https://nlp.johnsnowlabs.com/2021/03/24/analyze_sentiment_en.html), [Elmo-Embedding](https://nlp.johnsnowlabs.com/2020/01/31/elmo.html) , [Bert-Sentence_Embedding](https://nlp.johnsnowlabs.com/2020/08/25/sent_small_bert_L2_128.html) | -| Part 1: NLU base-features with some classifiers on Testdata | `yake`, `stem`, `ner`, `emotion` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/1_NLU_base_features_on_dataset_with_YAKE_Lemma_Stemm_classifiers_NER_.ipynb) | [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | +| Part 1: Quick Start, base-features with some classifiers on Testdata | `yake`, `stem`, `ner`, `emotion` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/1_NLU_base_features_on_dataset_with_YAKE_Lemma_Stemm_classifiers_NER_.ipynb) | [NER-Piple](https://nlp.johnsnowlabs.com/2021/03/22/onto_recognize_entities_sm_en.html), [Emotion detection](https://nlp.johnsnowlabs.com/2021/01/09/classifierdl_use_emotion_en.html) | | Part 2: Translate between 200+ Languages in 1 line of code with Marian-Models | `en.translate_to.de`, `en.translate_to.fr`, `en.translate_to.he` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/2_multilingual_translation_with_marian_intro.ipynb) | [Translation-Pipeline (En to Fr)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_fr_xx.html), [Translation-Pipeline (En to Ger)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_de_xx.html), [Translation (En to He)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_he_xx.html) | | Part 3: More Multilingual NLP-translations for Asian Languages with Marian | `en.translate_to.hi`, `en.translate_to.ru`, `en.translate_to.zh` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/3_more_multi_lingual_NLP_translation_Asian_languages_with_Marian.ipynb) | [Translation (En to Hi)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_hil_xx.html), [Translation (En to Ru)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_run_xx.html), [Translation (En to Zh)](https://nlp.johnsnowlabs.com/2021/06/04/translate_en_zh_xx.html) | -| Part 4: Unsupervise Chinese Keyword Extraction, NER and Translation from chinese news | `zh.translate_to.en`, `zh.segment_words`, `yake`, `zh.lemma`, `zh.ner` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/4_Unsupervise_Chinese_Keyword_Extraction_NER_and_Translation_from_Chinese_News.ipynb) | [Translation-Pipeline (Zh to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_zh_en_xx.html), [Zh-Lemmatizer](https://nlp.johnsnowlabs.com/2020/03/19/explain_document_dl.html) | +| Part 4: Unsupervised Chinese Keyword Extraction, NER and Translation from chinese news | `zh.translate_to.en`, `zh.segment_words`, `yake`, `zh.lemma`, `zh.ner` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/4_Unsupervise_Chinese_Keyword_Extraction_NER_and_Translation_from_Chinese_News.ipynb) | [Translation-Pipeline (Zh to En)](https://nlp.johnsnowlabs.com/2021/06/04/translate_zh_en_xx.html), [Zh-Lemmatizer](https://nlp.johnsnowlabs.com/2020/03/19/explain_document_dl.html) | | Part 5: Multilingual sentiment classifier training for 100+ languages | `train.sentiment`, `xx.embed_sentence.labse train.sentiment` | n.a. | [Sentence_Embedding.Labse](https://nlp.johnsnowlabs.com/2020/09/23/labse.html) | | Part 6: Question-answering and Text-summarization with T5-Modell | `answer_question`, `en.t5`, `en.t5.base` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/6_T5_question_answering_and_Text_summarization.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf) | | Part 7: Overview of all tasks available with T5 | `en.t5.base` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/multi_lingual_webinar/7_T5_SQUAD_GLUE_SUPER_GLUE_TASKS.ipynb) | [T5-Paper](https://arxiv.org/pdf/1910.10683.pdf) | @@ -263,7 +264,7 @@ The following tables give an overview on the different tutorials with NLU. The t ## Multilinigual-Examples {:.table2} -| Tutorial Description | NLU Spells Used |Open In Colab | Dataset and Paper References | +| Tutorial Description | 1-liners used |Open In Colab | Dataset and Paper References | |-----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Overview of some Multilingual modes avaiable with State Of the Art accuracy (1-liner) | `bn.ner.cc_300d`, `ja.ner`, `zh.ner`, `th.ner.lst20.glove_840B_300D`, `ar.ner` | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/python_web_conf/Multi_Linigual_examples.ipynb) | [Bengali-NER](https://nlp.johnsnowlabs.com/2021/01/27/ner_jifs_glove_840B_300d_bn.html) | | NLU 20 Minutes Crashcourse - the fast Data Science route | | [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/webinars_conferences_etc/python_web_conf/NLU_crashcourse_py_web.ipynb) | | diff --git a/docs/en/predict_api.md b/docs/en/predict_api.md index 799c1869..34fe5673 100644 --- a/docs/en/predict_api.md +++ b/docs/en/predict_api.md @@ -1,48 +1,44 @@ --- layout: docs header: true -seotitle: NLU | John Snow Labs -title: The NLU predict function +seotitle: predict | John Snow Labs +title: The predict() function key: predict-api permalink: /docs/en/predict_api modify_date: "2019-05-16" --- -
    - -## The predict function -NLU expects either a column named 'text' in the dataframe passed to it or alternatively it will assume the first column of the dataframe passed to it as the column it should predict for. +`predict()` expects either a column named 'text' in the dataframe passed to it, +or alternatively it will assume the first column of the dataframe passed to it as the column it should predict for.
    - ## Predict method Parameters ### Output metadata -The NLU predict method has a boolean metadata parameter. -When it is set to True, NLU will output the confidence and additional metadata for each prediction. +The NLP predict method has a boolean metadata parameter. +When it is set to `True`, it output the confidence and additional metadata for each prediction. Its default value is False. - ```python -nlu.load('lang').predict('What a wonderful day!') +nlp.load('lang').predict('What a wonderful day!') ```
    ### Output Level parameter -NLU defines 4 output levels for the generated predictions. -The output levels define how granular the predictions and outputs of NLU will be. -Depending on what downstream tasks NLU will be used for the output level should be adjusted. - +`predict()` defines 4 output levels for the generated predictions. +The output levels define how granular the predictions and outputs will be. +Depending on your goal, may need to be output level should be adjusted. 1. Token level: Outputs one row for every token in the input. **One to many mapping.** 2. Chunk level: Outputs one row for every chunk in the input. **One to many mapping.** 3. Sentence level: Outputs one row for every sentence the input. **One to many mapping.** -4. Document level output: Outputs one row for every document in the input. **One to one mapping.** +4. Relation level output: Outputs one row for every relation predicted, i.e. . **One to many.** +5. Document level output: Outputs one row for every document in the input. **One to one mapping.** -NLU will try to infer the most useful output level automatically if an output level is not specified. +`predict()` will try to infer the most useful output level automatically if an output level is not specified. The inferred output level will usually define the last element of the pipeline. -Take a look at the [NLU different output levels Demo](https://colab.research.google.com/drive/1C4N3wpC17YzZf9fXHDNAJ5JvSmfbq7zT?usp=sharing) which goes over all the output levels. +Take a look at the [different output levels Demo](https://colab.research.google.com/drive/1C4N3wpC17YzZf9fXHDNAJ5JvSmfbq7zT?usp=sharing) which goes over all the output levels.
    @@ -50,8 +46,8 @@ Take a look at the [NLU different output levels Demo](https://colab.research.goo Every row in the input data frame will be mapped to **one row** in the output dataframe. ```python -# NLU outputs 1 row for 1 input document -nlu.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='document') +# outputs 1 row for 1 input document +nlp.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='document') ```
    @@ -69,9 +65,8 @@ nlu.load('sentiment').predict(['I love data science! It is so much fun! It can a Every sentence in each row becomes a new row in the output dataframe. ```python -import nlu -# NLU will detect the 2 sentences and output 2 rows, one for each of the sentences. -nlu.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='sentence') +# will detect the 2 sentences and output 2 rows, one for each of the sentences. +nlp.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='sentence') ```
    @@ -94,8 +89,8 @@ By setting output level to chunk, you will ensure ever Named Entity becomes one Named Entities are chunks. ```python -# 'New York' is a Chunk. A chunk is an object that consists of multiple tokens but it's not a sentence. -nlu.load('ner').predict(['Angela Merkel and Donald Trump dont share many oppinions', "Ashley wants to visit the Brandenburger Tor in Berlin"], output_level='chunk',) +# 'New York' is a Chunk. A chunk is an object that consists of multiple tokens, but it's not a sentence. +nlp.load('ner').predict(['Angela Merkel and Donald Trump dont share many opinions', "Ashley wants to visit the Brandenburger Tor in Berlin"], output_level='chunk',) ```
    @@ -117,7 +112,7 @@ Every token in each input row becomes a new row in the output dataframe. ```python # Every token in our sentence will become a row -nlu.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='token') +nlp.load('sentiment').predict(['I love data science! It is so much fun! It can also be quite helpful to people.', 'I love the city New-York'], output_level='token') ```
    @@ -154,18 +149,18 @@ nlu.load('sentiment').predict(['I love data science! It is so much fun! It can a
    ## Output positions parameter -By setting *output_positions=True*, the Dataframe generated by NLU will contain additional columns which describe the beginning and end of each feature inside of the original document. +By setting *output_positions=True*, the Dataframe generated will contain additional columns which describe the beginning and end of each feature inside of the original document. These additional *_begining* and *_end* columns let you infer the piece of the original input string that has been used to generate the output. -- If the NLU output level is set to a **different output level** than some features output level, the resulting features will be inside of lists -- If the NLU output level is set to the **same output level** as some feature, the generated positional features will be single integers +- If output level is set to a **different output level** than some features output level, the resulting features will be inside of lists +- If output level is set to the **same output level** as some feature, the generated positional features will be single integers - positional : -- For token based components the positional features refer to the beginning and the end of the token inside of the original document the text originates from. +- For token based components the positional features refer to the beginning and the end of the token inside the original document the text originates from. - For sentence based components like sentence embeddings and different sentence classifiers the output of positional will describe the beginning and the end of the sentence that was used to generate the output. ```python -nlu.load('sentiment').predict('I love data science!', output_level='token', output_positions=True) +nlp.load('sentiment').predict('I love data science!', output_level='token', output_positions=True) ```
    @@ -182,28 +177,28 @@ nlu.load('sentiment').predict('I love data science!', output_level='token', outp
    ## Row origin inference for one to many mappings -NLU will recycle the Pandas index from the input Dataframe. +`predict()` will recycle the Pandas index from the input Dataframe. The index is useful if one row is mapped to many rows during prediction. The new rows which are generated from the input row will all have the same index as the original source row. -I.e. if one sentence row gets split into many token rows, each token row will have the same index as the sentence row. +I.e. if one sentence row gets split into many token rows, each token row will have the same index as the sentence row.
    -## NLU NaN Handling -- NLU will convert every NaN value to a Python None variable which is reflected in the final dataframe -- If a column contains **only** NaN or None, NLU will drop these columns for the output df. +## NaN Handling +- Every NaN value is converted to a Python None variable which is reflected in the final dataframe +- If a column contains **only** NaN or None, it will be dropped
    ## Memory optimization recommendations -Instead of passing your entire Pandas Dataframe to NLU you can pass only the columns which you need for later tasks. +Instead of passing your entire Pandas Dataframe to `predict()` you can pass only the columns which you need for later tasks. This saves memory and computation time and can be achieved like in the following example, which assumes latitude and longitude are irrelevant for later tasks. ```python -import nlu +from johnsnowlabs import nlp import pandas as pd data = { - 'tweet': ['@CKL-IT NLU ROCKS!', '@MaziyarPanahi NLU is pretty cool', '@JohnSnowLabs Try out NLU!'], + 'tweet': ['@CKL-IT the john snow labs library is awesome!', '@MaziyarPanahi johnsnowlabs library is pretty cool', '@JohnSnowLabs Try out the johnsnowlabs library!'], 'tweet_location': ['Berlin', 'Paris', 'United States'], 'tweet_lattitude' : ['52.55035', '48.858093', '40.689247'], 'tweet_longtitude' : ['13.39139', '2.294694','-74.044502'] @@ -211,13 +206,13 @@ data = { text_df = pd.DataFrame(data) -nlu.load('sentiment').predict(text_df[['tweet','tweet_location']]) +nlp.load('sentiment').predict(text_df[['tweet','tweet_location']]) ```
    ## Supported data types -NLU supports all of the common Python data types and formats +`predict()` supports all of the common Python data types and formats - Pandas Dataframes - Spark Dataframes - Modin with Dask backend @@ -231,16 +226,16 @@ NLU supports all of the common Python data types and formats ### Single strings ```python -import nlu -nlu.load('sentiment').predict('This is just one string') +from johnsnowlabs import nlp +nlp.load('sentiment').predict('This is just one string') ```
    ### Lists of strings ```python -import nlu -nlu.load('sentiment').predict(['This is an array', ' Of strings!']) +from johnsnowlabs import nlp +nlp.load('sentiment').predict(['This is an array', ' Of strings!']) ```
    @@ -253,11 +248,11 @@ It is recommended to only pass the columns required for further downstream task ```python -import nlu +from johnsnowlabs import nlp import pandas as pd data = {"text": ['This day sucks', 'I love this day', 'I dont like Sami']} text_df = pd.DataFrame(data) -nlu.load('sentiment').predict(text_df) +nlp.load('sentiment').predict(text_df) ```
    @@ -268,11 +263,11 @@ One column must be named text and of object/string type **note** : This way is the most memory efficient way ```python -import nlu +from johnsnowlabs import nlp import pandas as pd data = {"text": ['This day sucks', 'I love this day', 'I dont like Sami']} text_df = pd.DataFrame(data) -nlu.load('sentiment').predict(text_df['text']) +nlp.load('sentiment').predict(text_df['text']) ```
    @@ -282,12 +277,12 @@ nlu.load('sentiment').predict(text_df['text']) One column must be named text and of string type or the first column will be used instead if no column named 'text' exists ```python -import nlu +from johnsnowlabs import nlp import pandas as pd data = {"text": ['This day sucks', 'I love this day', 'I dont like Sami']} text_pdf = pd.DataFrame(data) -text_sdf = nlu.spark.createDataFrame(text_pdf) -nlu.load('sentiment').predict(text_sdf) +text_sdf = nlp.spark.createDataFrame(text_pdf) +nlp.load('sentiment').predict(text_sdf) ```
    @@ -297,11 +292,11 @@ Supports Ray Dask backends One column must be named text and of string type or the first column will be used instead if no column named 'text' exists ```python -import nlu +from johnsnowlabs import nlp import modin.pandas as pd data = {"text": ['This day sucks', 'I love this day', 'I don't like Sami']} text_pdf = pd.DataFrame(data) -nlu.load('sentiment').predict(text_pdf) +nlp.load('sentiment').predict(text_pdf) ```
    \ No newline at end of file diff --git a/docs/en/quick_start_finance.md b/docs/en/quick_start_finance.md new file mode 100644 index 00000000..96196605 --- /dev/null +++ b/docs/en/quick_start_finance.md @@ -0,0 +1,320 @@ +--- +layout: docs +header: true +seotitle: Finance NLP | John Snow Labs +title: Quick Start +permalink: /docs/en/quickstart_finance +key: docs-concepts +modify_date: "2020-05-08" +--- + +
    +Installing + +## Annotator & PretrainedPipeline based pipelines +You can create [Finance Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/concepts) using all the classes +attached to the `finance` & `nlp` module after [installing the licensed libraries](/docs/en/install_licensed_quick). + + +`nlp.PretrainedPipeline('pipe_name')` gives access to [Pretrained Pipelines](https://nlp.johnsnowlabs.com/models?type=pipeline) + +```python +from johnsnowlabs import nlp +from sparknlp.pretrained import PretrainedPipeline +nlp.start() + +deid_pipeline = nlp.PretrainedPipeline("finpipe_deid", "en", "finance/models") + +sample = """CARGILL, INCORPORATED + +By: Pirkko Suominen + + + +Name: Pirkko Suominen Title: Director, Bio Technology Development, Date: 10/19/2011 + +BIOAMBER, SAS + +By: Jean-François Huc + + + +Name: Jean-François Huc Title: President Date: October 15, 2011 + +email : jeanfran@gmail.com +phone : 1808733909 + +""" + +result = deid_pipeline.annotate(sample) +print("\nMasked with entity labels") +print("-"*30) +print("\n".join(result['deidentified'])) +print("\nMasked with chars") +print("-"*30) +print("\n".join(result['masked_with_chars'])) +print("\nMasked with fixed length chars") +print("-"*30) +print("\n".join(result['masked_fixed_length_chars'])) +print("\nObfuscated") +print("-"*30) +print("\n".join(result['obfuscated'])) +``` +Output: + +```shell +Masked with entity labels +------------------------------ +, +By: +Name: : , Date: +, +By: +Name: : Date: + +email : +phone : + +Masked with chars +------------------------------ +[*****], [**********] +By: [*************] +Name: [*******************]: [**********************************] Center, Date: [********] +[******], [*] +By: [***************] +Name: [**********************]: [*******]Date: [**************] + +email : [****************] +phone : [********] + +Masked with fixed length chars +------------------------------ +****, **** +By: **** +Name: ****: ****, Date: **** +****, **** +By: **** +Name: ****: ****Date: **** + +email : **** +phone : **** + +Obfuscated +------------------------------ +MGT Trust Company, LLC., Clarus llc. +By: Benjamin Dean +Name: John Snow Labs Inc: Sales Manager, Date: 03/08/2025 +Clarus llc., SESA CO. +By: JAMES TURNER +Name: MGT Trust Company, LLC.: Business ManagerDate: 11/7/2016 + +email : Tyrus@google.com +phone : 78 834 854 +``` + + + +### Custom Pipes +Alternatively you can compose [Legal Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) & [Open Source Annotators](https://nlp.johnsnowlabs.com/docs/en/annotators) into a pipeline which offers the highest degree of customization. + +```python +from johnsnowlabs import nlp,finance +spark = nlp.start() + +documentAssembler = nlp.DocumentAssembler()\ + .setInputCol("text")\ + .setOutputCol("document") + +sparktokenizer = nlp.Tokenizer()\ + .setInputCols("document")\ + .setOutputCol("token") + +zero_shot_ner = finance.ZeroShotNerModel.pretrained("finner_roberta_zeroshot", "en", "finance/models")\ + .setInputCols(["document", "token"])\ + .setOutputCol("zero_shot_ner")\ + .setEntityDefinitions( + { + "DATE": ['When was the company acquisition?', 'When was the company purchase agreement?'], + "ORG": ["Which company was acquired?"], + "PRODUCT": ["Which product?"], + "PROFIT_INCREASE": ["How much has the gross profit increased?"], + "REVENUES_DECLINED": ["How much has the revenues declined?"], + "OPERATING_LOSS_2020": ["Which was the operating loss in 2020"], + "OPERATING_LOSS_2019": ["Which was the operating loss in 2019"] + }) + +nerconverter = nlp.NerConverter()\ + .setInputCols(["document", "token", "zero_shot_ner"])\ + .setOutputCol("ner_chunk") + +pipeline = nlp.Pipeline(stages=[ + documentAssembler, + sparktokenizer, + zero_shot_ner, + nerconverter, +] +) + +sample_text = ["In March 2012, as part of a longer-term strategy, the Company acquired Vertro, Inc., which owned and operated the ALOT product portfolio.", + "In February 2017, the Company entered into an asset purchase agreement with NetSeer, Inc.", + "While our gross profit margin increased to 81.4% in 2020 from 63.1% in 2019, our revenues declined approximately 27% in 2020 as compared to 2019." + "We reported an operating loss of approximately $8,048,581 million in 2020 as compared to an operating loss of approximately $7,738,193 million in 2019."] + +p_model = pipeline.fit(spark.createDataFrame([[""]]).toDF("text")) + +res = p_model.transform(spark.createDataFrame(sample_text, nlp.StringType()).toDF("text")) + +res.select(nlp.F.explode(nlp.F.arrays_zip(res.ner_chunk.result, res.ner_chunk.begin, res.ner_chunk.end, res.ner_chunk.metadata)).alias("cols"))\ + .select(nlp.F.expr("cols['0']").alias("chunk"),\ + nlp.F.expr("cols['3']['entity']").alias("ner_label"))\ + .filter("ner_label!='O'")\ + .show(truncate=False) + +``` +Output: + +```shell ++---------------------------------------+-----------------+ +|chunk |ner_label | ++---------------------------------------+-----------------+ +|March 2012 |DATE | +|Vertro, Inc |ORG | +|February 2017 |DATE | +|asset purchase agreement |AGREEMENT | +|NetSeer |ORG | +|INTELLECTUAL PROPERTY AGREEMENT |AGREEMENT | +|December 31, 2018 |DATE | +|Armstrong Flooring |ORG | +|Delaware |STATE | +|AFI Licensing LLC |ORG | +|Delaware |ORG | +|Seller |LICENSE_RECIPIENT| +|perpetual, non- exclusive, royalty-free|LICENSE | ++---------------------------------------+-----------------+ +``` + + +[//]: # (
    ) + + + +[//]: # () +[//]: # () +[//]: # (## Specify language for an action) + +[//]: # () +[//]: # () +[//]: # (### Print all supported languages) + +[//]: # () +[//]: # () +[//]: # (Any of these are partial NLU references which can be prefixed to a request to specify a language) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.languages()) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every component for one specific language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every German NLU component) + +[//]: # () +[//]: # (nlp.print_components(lang='de')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model for an action) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every lemmatizer for every language) + +[//]: # () +[//]: # (nlp.print_components(action='lemma')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model kind for an action and a language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print all english classifiers) + +[//]: # () +[//]: # (nlp.print_components(lang='en', action='classify')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print the entire NLU spellbook offering) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.print_components()) + +[//]: # () +[//]: # (```) + +
    \ No newline at end of file diff --git a/docs/en/quick_start_legal.md b/docs/en/quick_start_legal.md new file mode 100644 index 00000000..346bfcd2 --- /dev/null +++ b/docs/en/quick_start_legal.md @@ -0,0 +1,339 @@ +--- +layout: docs +header: true +seotitle: Legal NLP | John Snow Labs +title: Quick Start +permalink: /docs/en/quickstart_legal +key: docs-concepts +modify_date: "2020-05-08" +--- + +
    +Installing + +## Annotator & PretrainedPipeline based pipelines +You can create [Legal Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/concepts) using all the classes +attached to the `legal` & `nlp` module after [installing the licensed libraries](/docs/en/install_licensed_quick). + + +`nlp.PretrainedPipeline('pipe_name')` gives access to [Pretrained Pipelines](https://nlp.johnsnowlabs.com/models?type=pipeline) + +```python +from johnsnowlabs import nlp +nlp.start() +deid_pipeline = nlp.PretrainedPipeline("legpipe_deid", "en", "legal/models") + +sample_2 = """Pizza Fusion Holdings, Inc. Franchise Agreement This Franchise Agreement (the "Agreement") is entered into as of the Agreement Date shown on the cover page between Pizza Fusion Holding, Inc., a Florida corporation, and the individual or legal entity identified on the cover page. + +Source: PF HOSPITALITY GROUP INC., 9/23/2015 + + +1. RIGHTS GRANTED 1.1. Grant of Franchise. 1.1.1 We grant you the right, and you accept the obligation, to use the Proprietary Marks and the System to operate one Restaurant (the "Franchised Business") at the Premises, in accordance with the terms of this Agreement. + +Source: PF HOSPITALITY GROUP INC., 9/23/2015 + + +1.3. Our Limitations and Our Reserved Rights. The rights granted to you under this Agreement are not exclusive.sed Business. + +Source: PF HOSPITALITY GROUP INC., 9/23/2015 + +""" + +result = deid_pipeline.annotate(sample_2) +print("\nMasked with entity labels") +print("-"*30) +print("\n".join(result['deidentified'])) +print("\nMasked with chars") +print("-"*30) +print("\n".join(result['masked_with_chars'])) +print("\nMasked with fixed length chars") +print("-"*30) +print("\n".join(result['masked_fixed_length_chars'])) +print("\nObfuscated") +print("-"*30) +print("\n".join(result['obfuscated'])) + +``` +Output: + +```shell +Masked with entity labels +------------------------------ +. This (the ) is entered into as of the Agreement Date shown on the cover page between a Florida corporation, and the individual or legal entity identified on the cover page. +Source: ., + + +1. + 1.1. +. +1.1.1 We grant you the right, and you accept the obligation, to use the and the System to operate one Restaurant (the ) at the Premises, in accordance with the terms of this Agreement. +Source: ., + + +1.3. +Our and . +The rights granted to you under this Agreement are not exclusive.sed Business. +Source: ., + +Masked with chars +------------------------------ +[************************]. [*****************] This [*****************] (the [*********]) is entered into as of the Agreement Date shown on the cover page between [*************************] a Florida corporation, and the individual or legal entity identified on the cover page. +Source: [**********************]., [*******] + + +1. +[************] 1.1. +[****************]. +1.1.1 We grant you the right, and you accept the obligation, to use the [***************] and the System to operate one Restaurant (the [*******************]) at the Premises, in accordance with the terms of this Agreement. +Source: [**********************]., [*******] + + +1.3. +Our [*********] and [*****************]. +The rights granted to you under this Agreement are not exclusive.sed Business. +Source: [**********************]., [*******] + +Masked with fixed length chars +------------------------------ +****. **** This **** (the ****) is entered into as of the Agreement Date shown on the cover page between **** a Florida corporation, and the individual or legal entity identified on the cover page. +Source: ****., **** + + +1. +**** 1.1. +****. +1.1.1 We grant you the right, and you accept the obligation, to use the **** and the System to operate one Restaurant (the ****) at the Premises, in accordance with the terms of this Agreement. +Source: ****., **** + + +1.3. +Our **** and ****. +The rights granted to you under this Agreement are not exclusive.sed Business. +Source: ****., **** + +Obfuscated +------------------------------ +SESA CO.. Estate Document This Estate Document (the (the "Contract")) is entered into as of the Agreement Date shown on the cover page between Clarus llc. a Florida corporation, and the individual or legal entity identified on the cover page. +Source: SESA CO.., 11/7/2016 + + +1. +SESA CO. 1.1. +Clarus llc.. +1.1.1 We grant you the right, and you accept the obligation, to use the John Snow Labs Inc and the System to operate one Restaurant (the (the" Agreement")) at the Premises, in accordance with the terms of this Agreement. +Source: SESA CO.., 11/7/2016 + + +1.3. +Our MGT Trust Company, LLC. and John Snow Labs Inc. +The rights granted to you under this Agreement are not exclusive.sed Business. +Source: SESA CO.., 11/7/2016 +``` + + + +### Custom Pipes +Alternatively you can compose [Legal Annotators](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) & [Open Source Annotators](https://nlp.johnsnowlabs.com/docs/en/annotators) into a pipeline which offers the highest degree of customization. + +```python +from johnsnowlabs import nlp,legal +spark = nlp.start() + +documentAssembler = nlp.DocumentAssembler()\ + .setInputCol("text")\ + .setOutputCol("document") + +sparktokenizer = nlp.Tokenizer()\ + .setInputCols("document")\ + .setOutputCol("token") + +zero_shot_ner = legal.ZeroShotNerModel.pretrained("legner_roberta_zeroshot", "en", "legal/models")\ + .setInputCols(["document", "token"])\ + .setOutputCol("zero_shot_ner")\ + .setEntityDefinitions( + { + "DATE": ['When was the company acquisition?', 'When was the company purchase agreement?', "When was the agreement?"], + "ORG": ["Which company?"], + "STATE": ["Which state?"], + "AGREEMENT": ["What kind of agreement?"], + "LICENSE": ["What kind of license?"], + "LICENSE_RECIPIENT": ["To whom the license is granted?"] + }) + +nerconverter = nlp.NerConverter()\ + .setInputCols(["document", "token", "zero_shot_ner"])\ + .setOutputCol("ner_chunk") + +pipeline = nlp.Pipeline(stages=[ + documentAssembler, + sparktokenizer, + zero_shot_ner, + nerconverter, +] +) + +sample_text = ["In March 2012, as part of a longer-term strategy, the Company acquired Vertro, Inc., which owned and operated the ALOT product portfolio.", + "In February 2017, the Company entered into an asset purchase agreement with NetSeer, Inc.", + "This INTELLECTUAL PROPERTY AGREEMENT, dated as of December 31, 2018 (the 'Effective Date') is entered into by and between Armstrong Flooring, Inc., a Delaware corporation ('Seller') and AFI Licensing LLC, a Delaware company('Licensing')" + "The Company hereby grants to Seller a perpetual, non- exclusive, royalty-free license"] + +p_model = pipeline.fit(spark.createDataFrame([[""]]).toDF("text")) + +res = p_model.transform(spark.createDataFrame(sample_text, StringType()).toDF("text")) + +res.select(nlp.F.explode(nlp.F.arrays_zip(res.ner_chunk.result, res.ner_chunk.begin, res.ner_chunk.end, res.ner_chunk.metadata)).alias("cols"))\ + .select(nlp.F.expr("cols['0']").alias("chunk"), + nlp.F.expr("cols['3']['entity']").alias("ner_label"))\ + .filter("ner_label!='O'")\ + .show(truncate=False)\ + + + +``` +Output: + +```shell ++---------------------------------------+-----------------+ +|chunk |ner_label | ++---------------------------------------+-----------------+ +|March 2012 |DATE | +|Vertro, Inc |ORG | +|February 2017 |DATE | +|asset purchase agreement |AGREEMENT | +|NetSeer |ORG | +|INTELLECTUAL PROPERTY AGREEMENT |AGREEMENT | +|December 31, 2018 |DATE | +|Armstrong Flooring |ORG | +|Delaware |STATE | +|AFI Licensing LLC |ORG | +|Delaware |ORG | +|Seller |LICENSE_RECIPIENT| +|perpetual, non- exclusive, royalty-free|LICENSE | ++---------------------------------------+-----------------+ +``` + + +[//]: # (
    ) + + + +[//]: # () +[//]: # () +[//]: # (## Specify language for an action) + +[//]: # () +[//]: # () +[//]: # (### Print all supported languages) + +[//]: # () +[//]: # () +[//]: # (Any of these are partial NLU references which can be prefixed to a request to specify a language) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.languages()) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every component for one specific language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every German NLU component) + +[//]: # () +[//]: # (nlp.print_components(lang='de')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model for an action) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every lemmatizer for every language) + +[//]: # () +[//]: # (nlp.print_components(action='lemma')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model kind for an action and a language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print all english classifiers) + +[//]: # () +[//]: # (nlp.print_components(lang='en', action='classify')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print the entire NLU spellbook offering) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.print_components()) + +[//]: # () +[//]: # (```) + +
    \ No newline at end of file diff --git a/docs/en/quick_start_medical.md b/docs/en/quick_start_medical.md new file mode 100644 index 00000000..7dd598a0 --- /dev/null +++ b/docs/en/quick_start_medical.md @@ -0,0 +1,308 @@ +--- +layout: docs +header: true +seotitle: Medical NLP | John Snow Labs +title: Quick Start +permalink: /docs/en/quickstart_medical +key: docs-concepts +modify_date: "2020-05-08" +--- + +
    +You can create [Medical Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/concepts) using all the classes +attached to the `Medical` & `nlp` module after [installing the licensed libraries](/docs/en/install_licensed_quick). + +## Load & Predict 1 liner + +The `johnsnowlabs` library provides 2 simple methods with which most NLP tasks can be solved while achieving state-of-the-art +results. +The **load** and **predict** method. + +when building a `load&predict` based model you will follow these steps: + +1. Pick a model/pipeline/component you want to create from the [Namespace](/docs/en/namespace) +2. Call the `model = nlp.load(component)` method which will return an auto-completed pipeline +3. Call `model.predict('that was easy')` on some String input + +These 3 steps can be boiled down to **just 1 line** + +```python +from johnsnowlabs import nlp +nlp.start() +medical_text = ''' The patient is a 5-month-old infant who presented initially on Monday with +a cold, cough, and runny nose for 2 days''' +nlp.load('med_ner.jsl.wip.clinical').predict(medical_text) + +``` + +| entity | entity_class | entity_confidence | +|:------------|:-------------|------------------:| +| 5-month-old | Age | 0.9982 | +| infant | Age | 0.9999 | +| Monday | RelativeDate | 0.9983 | +| cold | Symptom | 0.7517 | +| cough | Symptom | 0.9969 | +| runny nose | Symptom | 0.7796 | +| for 2 days | Duration | 0.5479 | + + + +
    + + +`nlp.load()` defines **additional components types** usable in 1-liners which are only avaiable if a medical license is provided. + +
    + +Licensed Component Types : + +{:.table-model-big} +| Component type | nlp.load() base | +|--------------------------------------------------------------------|----------------------------------------------------| +| Medical Named Entity Recognition(NER) | `nlp.load('med.ner')` | +| Entity Resolution | `nlp.load('resolve')` | +| Entity Assertion | `nlp.load('assert')` | +| Entity Relation Classification | `nlp.load('relation')` | +| Entity De-Identification | `nlp.load('de_identify')` | +| Map Entities into Terminologies | `nlp.load('map_entity')` | +| Translate Entities from One Terminologies into Another Terminology | `nlp.load('_to_')` | +| Drug Normalizers | `nlp.load('norm_drugs')` | +| Rule based NER with Context Matcher | `nlp.load('match.context')` | + + +## Annotator & PretrainedPipeline based pipelines +You can create [Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/concepts) using all the classes +attached to the `nlp` module. + + +`nlp.PretrainedPipeline('pipe_name')` gives access to [Pretrained Pipelines](https://nlp.johnsnowlabs.com/models?type=pipeline) + +```python +from johnsnowlabs import nlp +nlp.start() + +deid_pipeline = nlp.PretrainedPipeline("clinical_deidentification", "en", "clinical/models") +sample = """Name : Hendrickson, Ora, Record date: 2093-01-13, # 719435. +Dr. John Green, ID: 1231511863, IP 203.120.223.13. +He is a 60-year-old male was admitted to the Day Hospital for cystectomy on 01/13/93. +Patient's VIN : 1HGBH41JXMN109286, SSN #333-44-6666, Driver's license no:A334455B. +Phone (302) 786-5227, 0295 Keats Street, San Francisco, E-MAIL: smith@gmail.com.""" + +result = deid_pipeline.annotate(sample) +print("\n".join(result['masked'])) +print("\n".join(result['masked_with_chars'])) +print("\n".join(result['masked_fixed_length_chars'])) +print("\n".join(result['obfuscated'])) + +``` +OUTPUT: +```shell +Masked with entity labels +------------------------------ +Name : , Record date: , # . +Dr. , ID, IP . +He is a male was admitted to the for cystectomy on . +Patient's VIN : , SSN , Driver's license . +Phone , , , E-MAIL: . + + +Masked with chars +------------------------------ +Name : [**************], Record date: [********], # [****]. +Dr. [********], ID[**********], IP [************]. +He is a [*********] male was admitted to the [**********] for cystectomy on [******]. +Patient's VIN : [***************], SSN [**********], Driver's license [*********]. +Phone [************], [***************], [***********], E-MAIL: [*************]. + + +Masked with fixed length chars +------------------------------ +Name : ****, Record date: ****, # ****. +Dr. ****, ID****, IP ****. +He is a **** male was admitted to the **** for cystectomy on ****. +Patient's VIN : ****, SSN ****, Driver's license ****. +Phone ****, ****, ****, E-MAIL: ****. + + +Obfuscated +------------------------------ +Name : Berneta Phenes, Record date: 2093-03-14, # Y5003067. +Dr. Dr Gaston Margo, IDOX:8976967, IP 001.001.001.001. +He is a 91 male was admitted to the MADONNA REHABILITATION HOSPITAL for cystectomy on 07-22-1994. +Patient's VIN : 5eeee44ffff555666, SSN 999-84-3686, Driver's license S99956482. +Phone 74 617 042, 1407 west stassney lane, Edmonton, E-MAIL: Carliss@hotmail.com. + +``` + + + +### Custom Pipes +Alternatively you can compose [Annotators](https://nlp.johnsnowlabs.com/docs/en/annotators) into a pipeline which offers the highest degree of customization +```python +from johnsnowlabs import nlp,medical +spark = nlp.start() +documentAssembler = nlp.DocumentAssembler()\ + .setInputCol("text")\ + .setOutputCol("document") + +sentenceDetector = nlp.SentenceDetector()\ + .setInputCols(["document"])\ + .setOutputCol("sentence") + +tokenizer = nlp.Tokenizer()\ + .setInputCols(["sentence"])\ + .setOutputCol("token") + +zero_shot_ner = medical.ZeroShotNerModel.pretrained("zero_shot_ner_roberta", "en", "clincial/models")\ + .setInputCols(["sentence", "token"])\ + .setOutputCol("zero_shot_ner")\ + .setEntityDefinitions( + { + "NAME": ["What is his name?", "What is my name?", "What is her name?"], + "CITY": ["Which city?", "Which is the city?"] + }) + +ner_converter = medical.NerConverterInternal()\ + .setInputCols(["sentence", "token", "zero_shot_ner"])\ + .setOutputCol("ner_chunk") + +pipeline = nlp.Pipeline(stages = [ + documentAssembler, + sentenceDetector, + tokenizer, + zero_shot_ner, + ner_converter]) + +zero_shot_ner_model = pipeline.fit(spark.createDataFrame([[""]]).toDF("text")) + +data = spark.createDataFrame(["Hellen works in London, Paris and Berlin. My name is Clara, I live in New York and Hellen lives in Paris.", + "John is a man who works in London, London and London."], nlp.StringType()).toDF("text") + +``` + + + +[//]: # (
    ) + + + +[//]: # () +[//]: # () +[//]: # (## Specify language for an action) + +[//]: # () +[//]: # () +[//]: # (### Print all supported languages) + +[//]: # () +[//]: # () +[//]: # (Any of these are partial NLU references which can be prefixed to a request to specify a language) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.languages()) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every component for one specific language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every German NLU component) + +[//]: # () +[//]: # (nlp.print_components(lang='de')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model for an action) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every lemmatizer for every language) + +[//]: # () +[//]: # (nlp.print_components(action='lemma')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model kind for an action and a language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print all english classifiers) + +[//]: # () +[//]: # (nlp.print_components(lang='en', action='classify')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print the entire NLU spellbook offering) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.print_components()) + +[//]: # () +[//]: # (```) + +
    \ No newline at end of file diff --git a/docs/en/quick_start_visuale.md b/docs/en/quick_start_visuale.md new file mode 100644 index 00000000..c5878c49 --- /dev/null +++ b/docs/en/quick_start_visuale.md @@ -0,0 +1,192 @@ +--- +layout: docs +header: true +seotitle: NLU | John Snow Labs +title: Quick Start +permalink: /docs/en/quickstart_visual +key: docs-concepts +modify_date: "2020-05-08" +--- + +
    + + +## Load & Predict 1 liner + +The `johnsnowlabs` library provides 2 simple methods with which most visual NLP tasks can be solved while achieving state-of-the-art results. +The **load** and **predict** method. +When building a `load&predict` based model you will follow these steps: + +1. Pick a visual model/pipeline/component you want to create from the [Namespace](/docs/en/namespace) +2. Call the `model = ocr.load('visual_component')` method which will return an auto-completed pipeline +3. Call `model.predict('path/to/image.png')` with a path to a file or an array of paths + +These 3 steps can be boiled down to **just 1 line** + +```python +from johnsnowlabs import nlp +nlp.load('img2text').predict('path/to/haiku.png') +``` + + +`jsl.load()` defines **6 visual components types** usable in 1-liners + +
    +{:.table-model-big} +| 1-liner | Transformer Class | +|--------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| +| `nlp.load('img2text').predict('path/to/cat.png')` | [ImageToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#imagetotext) | +| `nlp.load('pdf2text').predict('path/to/taxes.pdf')` | [PdfToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotext) | +| `nlp.load('doc2text').predict('path/to/my_homework.docx')` | [DocToText](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotext) | +| `nlp.load('pdf2table').predict('path/to/data_tables.pdf')` | [PdfToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#pdftotexttable) | +| `nlp.load('ppt2table').predict('path/to/great_presentation_with_tabular_data.pptx')` | [PptToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#ppttotexttable) | +| `nlp.load('doc2table').predict('path/to/tabular_income_data.docx')` | [DocToTextTable](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components#doctotexttable) | + + + +## Custom Pipelines +You can create [Visual Annotator & PretrainedPipeline based pipelines](https://nlp.johnsnowlabs.com/docs/en/ocr_pipeline_components) using all the classes +attached to the `visual` module which gives you the highest degree of freedom + +```python +from johnsnowlabs import nlp,visual +spark = nlp.start(visual=True) +# Load a PDF File and convert it into Spark DF format +doc_example = visual.pkg_resources.resource_filename('sparkocr', 'resources/ocr/docs/doc2.docx') +doc_example_df = spark.read.format("binaryFile").load(doc_example).cache() + +# Run the visual DocToText Annotator inside a pipe, recognize text and show the result +pipe = nlp.PipelineModel(stages=[visual.DocToText().setInputCol("content").setOutputCol("text")]) +result = pipe.transform(doc_example_df) + +print(result.take(1)[0].text) +``` +output: +![ocrresult.png](/assets/images/jsl_lib/ocr/doc2text.png) + + + +[//]: # (
    ) + + + +[//]: # () +[//]: # () +[//]: # (## Specify language for an action) + +[//]: # () +[//]: # () +[//]: # (### Print all supported languages) + +[//]: # () +[//]: # () +[//]: # (Any of these are partial NLU references which can be prefixed to a request to specify a language) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.languages()) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every component for one specific language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every German NLU component) + +[//]: # () +[//]: # (nlp.print_components(lang='de')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model for an action) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print every lemmatizer for every language) + +[//]: # () +[//]: # (nlp.print_components(action='lemma')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print every model kind for an action and a language) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (# Print all english classifiers) + +[//]: # () +[//]: # (nlp.print_components(lang='en', action='classify')) + +[//]: # () +[//]: # (```) + +[//]: # () +[//]: # () +[//]: # (
    ) + +[//]: # () +[//]: # () +[//]: # (### Print the entire NLU spellbook offering) + +[//]: # () +[//]: # () +[//]: # (These are complete NLU references and can be passed to the nlp.load() method right away) + +[//]: # () +[//]: # () +[//]: # (```python) + +[//]: # () +[//]: # (nlp.print_components()) + +[//]: # () +[//]: # (```) + +
    \ No newline at end of file diff --git a/docs/en/release_notes.md b/docs/en/release_notes.md index faaf8601..7b239bb5 100644 --- a/docs/en/release_notes.md +++ b/docs/en/release_notes.md @@ -255,7 +255,7 @@ returns :
    #### New NLU helper Methods -You can see all features showcased in the [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb) notebook or on [the new docs page for Spark NLP utils](https://nlu.johnsnowlabs.com/docs/en/spellbook/utils_for_spark_nlp) +You can see all features showcased in the [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb) notebook or on [the new docs page for Spark NLP utils](https://nlu.johnsnowlabs.com/docs/en/namespace/utils_for_spark_nlp)
    @@ -8183,7 +8183,7 @@ NLU 1.1.0 has over 720+ new pretrained models and pipelines while extending the #### NLU 1.1.0 New Features -* **720+** new models you can find an overview of all NLU models [here](https://nlu.johnsnowlabs.com/docs/en/spellbook) and further documentation in the [models hub](https://nlp.johnsnowlabs.com/models) +* **720+** new models you can find an overview of all NLU models [here](https://nlu.johnsnowlabs.com/docs/en/namespace) and further documentation in the [models hub](https://nlp.johnsnowlabs.com/models) * **NEW:** Introducing MarianTransformer annotator for machine translation based on MarianNMT models. Marian is an efficient, free Neural Machine Translation framework mainly being developed by the Microsoft Translator team (646+ pretrained models & pipelines in 192+ languages) * **NEW:** Introducing T5Transformer annotator for Text-To-Text Transfer Transformer (Google T5) models to achieve state-of-the-art results on multiple NLP tasks such as Translation, Summarization, Question Answering, Sentence Similarity, and so on * **NEW:** Introducing brand new and refactored language detection and identification models. The new LanguageDetectorDL is faster, more accurate, and supports up to 375 languages diff --git a/docs/en/streamlit_viz_examples.md b/docs/en/streamlit_viz_examples.md index 836c2151..d0f88bda 100644 --- a/docs/en/streamlit_viz_examples.md +++ b/docs/en/streamlit_viz_examples.md @@ -11,55 +11,72 @@ modify_date: "2019-05-16"
    -This page contains examples and tutorials on how to visualize the 1000+ state-of-the-art NLP models provided by NLU in *just 1 line of code* in `streamlit`. -It includes simple `1-liners` you can sprinkle into your Streamlit app to for features like **Dependency Trees, Named Entities (NER), text classification results, semantic simmilarity, -embedding visualizations via ELMO, BERT, ALBERT, XLNET and much more** . Additionally, improvements for T5 and various resolvers have been added. - -This is the ultimate NLP research tool. You can visualize and compare the results of hundreds of context aware deep learning embeddings and compare them with classical vanilla embeddings like Glove +This page contains examples and tutorials on how to visualize the 10000+ state-of-the-art NLP models in *just 1 line of +code* in `streamlit`. +It includes simple `1-liners` you can sprinkle into your Streamlit app to for features like **Dependency Trees, Named +Entities (NER), text classification results, semantic simmilarity, +embedding visualizations via ELMO, BERT, ALBERT, XLNET and much more** . Additionally, improvements for T5 and various +resolvers have been added. + +This is the ultimate NLP research tool. You can visualize and compare the results of hundreds of context aware deep +learning embeddings and compare them with classical vanilla embeddings like Glove and can see with your own eyes how context is encoded by transformer models like `BERT` or `XLNET`and many more ! -Besides that, you can also compare the results of the 200+ NER models John Snow Labs provides and see how peformances changes with varrying ebeddings, like Contextual, Static and Domain Specific Embeddings. +Besides that, you can also compare the results of the 200+ NER models John Snow Labs provides and see how peformances +changes with varrying ebeddings, like Contextual, Static and Domain Specific Embeddings.
    ## Install -[For detailed instructions refer to the NLU install documentation here](https://nlu.johnsnowlabs.com/docs/en/install) -You need `Open JDK 8` installed and the following python packages + ```bash -pip install nlu streamlit pyspark==3.0.1 sklearn plotly +pip install streamlit sklearn plotly ``` + Problems? [Connect with us on Slack!](https://join.slack.com/t/spark-nlp/shared_invite/zt-lutct9gm-kuUazcyFKhuGY3_0AMkxqA)
    ## Impatient and want some action? -Just run this Streamlit app, you can use it to generate python code for each NLU-Streamlit building block + +Just run this Streamlit app, you can use it to generate python code for each Streamlit building block + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/01_dashboard.py ```
    -## Quick Starter cheat sheet - All you need to know in 1 picture for NLU + Streamlit -For NLU models to load, see [the NLU spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) or the [John Snow Labs Modelshub](https://modelshub.johnsnowlabs.com/models) or go [straight to the source](https://github.com/JohnSnowLabs/nlu/blob/master/nlu/spellbook.py). -![NLU Streamlit Cheatsheet](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/NLU_Streamlit_Cheetsheet.png) +## Quick Starter cheat sheet - All you need to know in 1 picture for NLP + Streamlit + +For NLP models to load, see [the NLP namespace](https://nlu.johnsnowlabs.com/docs/en/namespace) or +the [John Snow Labs Modelshub](https://modelshub.johnsnowlabs.com/models) or +go [straight to the source](https://github.com/JohnSnowLabs/nlu/blob/master/nlu/namespace.py). +![NLP Streamlit Cheatsheet](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/NLU_Streamlit_Cheetsheet.png)
    ## Examples + Just try out any of these. You can use the first example to generate python-code snippets which you can recycle as building blocks in your streamlit apps! + ### Example: [`01_dashboard`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/01_dashboard.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/01_dashboard.py ``` + ### Example: [`02_NER`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/02_NER.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/02_NER.py ``` + ### Example: [`03_text_similarity_matrix`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/03_text_similarity_matrix.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/03_text_similarity_matrix.py ``` @@ -67,109 +84,124 @@ streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples
    ### Example: [`04_dependency_tree`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/04_dependency_tree.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/04_dependency_tree.py ``` ### Example: [`05_classifiers`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/05_classifiers.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/05_classifiers.py ``` ### Example: [`06_token_features`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/06_token_features.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/06_token_features.py ``` ### Example: [`07_token_embedding_dimension_reduction`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/07_token_embedding_manifolds.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/07_token_embedding_manifolds.py ``` ### Example: [`08_token_embedding_dimension_reduction`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/08_sentence_embedding_manifolds.py==) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/08_sentence_embedding_manifolds.py ``` ### Example: [`09_entity_embedding_dimension_reduction`](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/09_entity_embedding_manifolds.py) + ```shell streamlit run https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/examples/streamlit/09_entity_embedding_manifolds.py ```
    -## How to use NLU? -All you need to know about NLU is that there is the [`nlu.load()`](https://nlu.johnsnowlabs.com/docs/en/load_api) method which returns a `NLUPipeline` object -which has a [`.predict()`](https://nlu.johnsnowlabs.com/docs/en/predict_api) that works on most [common data types in the pydata stack like Pandas dataframes](https://nlu.johnsnowlabs.com/docs/en/predict_api#supported-data-types) . -Ontop of that, there are various visualization methods a NLUPipeline provides easily integrate in Streamlit as re-usable components. [`viz() method`](https://nlu.johnsnowlabs.com/docs/en/viz_examples) - -
    +## How to use the nlp module? -### Overview of NLU + Streamlit buildingblocks +All you need to know about the nlp module is that there is the [`nlp.load()`](https://nlu.johnsnowlabs.com/docs/en/load_api) method +which returns a `NLUPipeline` object +which has a [`.predict()`](https://nlu.johnsnowlabs.com/docs/en/predict_api) that works on +most [common data types in the pydata stack like Pandas dataframes](https://nlu.johnsnowlabs.com/docs/en/predict_api#supported-data-types) +. +Ontop of that, there are various visualization methods a NLUPipeline provides easily integrate in Streamlit as re-usable +components. [`viz() method`](https://nlu.johnsnowlabs.com/docs/en/viz_examples) +
    -|Method | Description | -|---------------------------------------------------------------|-------------------------------------------| -| [`nlu.load('').predict(data)`](TODO.com) | Load any of the [1000+ models](https://nlp.johnsnowlabs.com/models) by providing the model name any predict on most Pythontic [data strucutres like Pandas, strings, arrays of strings and more](https://nlu.johnsnowlabs.com/docs/en/predict_api#supported-data-types) | -| [`nlu.load('').viz_streamlit(data)`](TODO.com) | Display full NLU exploration dashboard, that showcases every feature avaiable with dropdown selectors for 1000+ models| -| [`nlu.load('').viz_streamlit_similarity([string1, string2])`](TODO.com) | Display similarity matrix and scalar similarity for every word embedding loaded and 2 strings. | -| [`nlu.load('').viz_streamlit_ner(data)`](TODO.com) | Visualize predicted NER tags from Named Entity Recognizer model| -| [`nlu.load('').viz_streamlit_dep_tree(data)`](TODO.com) | Visualize Dependency Tree together with Part of Speech labels| -| [`nlu.load('').viz_streamlit_classes(data)`](TODO.com) | Display all extracted class features and confidences for every classifier loaded in pipeline| -| [`nlu.load('').viz_streamlit_token(data)`](TODO.com) | Display all detected token features and informations in Streamlit | -| [`nlu.load('').viz(data, write_to_streamlit=True)`](TODO.com) | Display the raw visualization without any UI elements. See [viz docs for more info](https://nlu.johnsnowlabs.com/docs/en/viz_examples). By default all aplicable nlu model references will be shown. | -| [`nlu.enable_streamlit_caching()`](#test) | Enable caching the `nlu.load()` call. Once enabled, the `nlu.load()` method will automatically cached. **This is recommended** to run first and for large peformance gans | +### Overview of NLP + Streamlit buildingblocks + +| Method | Description | +|--------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [`nlp.load('').predict(data)`](TODO.com) | Load any of the [1000+ models](https://nlp.johnsnowlabs.com/models) by providing the model name any predict on most Pythontic [data strucutres like Pandas, strings, arrays of strings and more](https://nlu.johnsnowlabs.com/docs/en/predict_api#supported-data-types) | +| [`nlp.load('').viz_streamlit(data)`](TODO.com) | Display full NLP exploration dashboard, that showcases every feature avaiable with dropdown selectors for 1000+ models | +| [`nlp.load('').viz_streamlit_similarity([string1, string2])`](TODO.com) | Display similarity matrix and scalar similarity for every word embedding loaded and 2 strings. | +| [`nlp.load('').viz_streamlit_ner(data)`](TODO.com) | Visualize predicted NER tags from Named Entity Recognizer model | +| [`nlp.load('').viz_streamlit_dep_tree(data)`](TODO.com) | Visualize Dependency Tree together with Part of Speech labels | +| [`nlp.load('').viz_streamlit_classes(data)`](TODO.com) | Display all extracted class features and confidences for every classifier loaded in pipeline | +| [`nlp.load('').viz_streamlit_token(data)`](TODO.com) | Display all detected token features and informations in Streamlit | +| [`nlp.load('').viz(data, write_to_streamlit=True)`](TODO.com) | Display the raw visualization without any UI elements. See [viz docs for more info](https://nlu.johnsnowlabs.com/docs/en/viz_examples). By default all aplicable nlp model references will be shown. | +| [`nlp.enable_streamlit_caching()`](#test) | Enable caching the `nlp.load()` call. Once enabled, the `nlp.load()` method will automatically cached. ** +This is +recommended** to run first and for large peformance gans |
    {:.h2-select} + ## Detailed visualizer information and API docs ### function `pipe.viz_streamlit` - -Display a highly configurable UI that showcases almost every feature available for Streamlit visualization with model selection dropdowns in your applications. +Display a highly configurable UI that showcases almost every feature available for Streamlit visualization with model +selection dropdowns in your applications. Ths includes : + - `Similarity Matrix` & `Scalars` & `Embedding Information` for any of the [100+ Word Embedding Models]() - `NER visualizations` for any of the [200+ Named entity recognizers]() -- `Labled` & `Unlabled Dependency Trees visualizations` with `Part of Speech Tags` for any of the [100+ Part of Speech Models]() +- `Labled` & `Unlabled Dependency Trees visualizations` with `Part of Speech Tags` for any of + the [100+ Part of Speech Models]() - `Token informations` predicted by any of the [1000+ models]() - `Classification results` predicted by any of the [100+ models classification models]() - `Pipeline Configuration` & `Model Information` & `Link to John Snow Labs Modelshub` for all loaded pipelines - `Auto generate Python code` that can be copy pasted to re-create the individual Streamlit visualization blocks. - NlLU takes the first model specified as `nlu.load()` for the first visualization run. + NlLU takes the first model specified as `nlp.load()` for the first visualization run. Once the Streamlit app is running, additional models can easily be added via the UI. - It is recommended to run this first, since you can generate Python code snippets `to recreate individual Streamlit visualization blocks` + It is recommended to run this first, since you can generate Python code + snippets `to recreate individual Streamlit visualization blocks` ```python -nlu.load('ner').viz_streamlit(['I love NLU and Streamlit!','I hate buggy software']) +nlp.load('ner').viz_streamlit(['I love NLP and Streamlit!', 'I hate buggy software']) ``` - -![NLU Streamlit UI Overview](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/ui.gif) +![NLP Streamlit UI Overview](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/ui.gif)
    ### function parameters `pipe.viz_streamlit` -| Argument | Type | Default |Description | -|-----------------------|--------------------------------------------------|----------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------| -| `text` | `Union [str, List[str], pd.DataFrame, pd.Series]` | `'NLU and Streamlit go together like peanutbutter and jelly'` | Default text for the `Classification`, `Named Entitiy Recognizer`, `Token Information` and `Dependency Tree` visualizations -| `similarity_texts` | `Union[List[str],Tuple[str,str]]` | `('Donald Trump Likes to part', 'Angela Merkel likes to party')` | Default texts for the `Text similarity` visualization. Should contain `exactly 2 strings` which will be compared `token embedding wise`. For each embedding active, a `token wise similarity matrix` and a `similarity scalar` -| `model_selection` | `List[str]` | `[]` | List of nlu references to display in the model selector, see [the NLU spellbook](https://nlu.johnsnowlabs.com/docs/en/spellbook) or the [John Snow Labs Modelshub](https://modelshub.johnsnowlabs.com/models) or go [straight to the source](https://github.com/JohnSnowLabs/nlu/blob/master/nlu/spellbook.py) for more info -| `title` | `str` | `'NLU ❤️ Streamlit - Prototype your NLP startup in 0 lines of code🚀'` | Title of the Streamlit app -| `sub_title` | `str` | `'Play with over 1000+ scalable enterprise NLP models'` | Sub title of the Streamlit app -| `visualizers` | `List[str]` | `( "dependency_tree", "ner", "similarity", "token_information", 'classification')` | Define which visualizations should be displayed. By default all visualizations are displayed. -| `show_models_info` | `bool` | `True` | Show information for every model loaded in the bottom of the Streamlit app. -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `show_viz_selection` | `bool` | `False` | Show a selector in the sidebar which lets you configure which visualizations are displayed. -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_code_snippets` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -|`num_similarity_cols` | `int` | `2` | How many columns should for the layout in Streamlit when rendering the similarity matrixes. +| Argument | Type | Default | Description | +|-------------------------|---------------------------------------------------|-------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `text` | `Union [str, List[str], pd.DataFrame, pd.Series]` | `'NLP and Streamlit go together like peanutbutter and jelly'` | Default text for the `Classification`, `Named Entitiy Recognizer`, `Token Information` and `Dependency Tree` visualizations | +| `similarity_texts` | `Union[List[str],Tuple[str,str]]` | `('Donald Trump Likes to part', 'Angela Merkel likes to party')` | Default texts for the `Text similarity` visualization. Should contain `exactly 2 strings` which will be compared `token embedding wise`. For each embedding active, a `token wise similarity matrix` and a `similarity scalar` | +| `model_selection` | `List[str]` | `[]` | List of nlp references to display in the model selector, see [the NLP namespace](https://nlu.johnsnowlabs.com/docs/en/namespace) or the [John Snow Labs Modelshub](https://modelshub.johnsnowlabs.com/models) or go [straight to the source](https://github.com/JohnSnowLabs/nlu/blob/master/nlu/namespace.py) for more info | +| `title` | `str` | `'NLP ❤️ Streamlit - Prototype your NLP startup in 0 lines of code🚀'` | Title of the Streamlit app | +| `sub_title` | `str` | `'Play with over 1000+ scalable enterprise NLP models'` | Sub title of the Streamlit app | +| `visualizers` | `List[str]` | `( "dependency_tree", "ner", "similarity", "token_information", 'classification')` | Define which visualizations should be displayed. By default all visualizations are displayed. | +| `show_models_info` | `bool` | `True` | Show information for every model loaded in the bottom of the Streamlit app. | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `show_viz_selection` | `bool` | `False` | Show a selector in the sidebar which lets you configure which visualizations are displayed. | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLP namespace structure. | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_code_snippets` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `num_similarity_cols` | `int` | `2` | How many columns should for the layout in Streamlit when rendering the similarity matrixes. |
    @@ -179,199 +211,225 @@ Visualize the predicted classes and their confidences and additional metadata to Aplicable with [any of the 100+ classifiers](https://nlp.johnsnowlabs.com/models?task=Text+Classification) ```python -nlu.load('sentiment').viz_streamlit_classes(['I love NLU and Streamlit!','I love buggy software', 'Sign up now get a chance to win 1000$ !', 'I am afraid of Snakes','Unicorns have been sighted on Mars!','Where is the next bus stop?']) +nlp.load('sentiment').viz_streamlit_classes( + ['I love NLP and Streamlit!', 'I love buggy software', 'Sign up now get a chance to win 1000$ !', + 'I am afraid of Snakes', 'Unicorns have been sighted on Mars!', 'Where is the next bus stop?']) ``` + ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/class.gif)
    ### function parameters `pipe.viz_streamlit_classes` -| Argument | Type | Default |Description | -|--------------------------- | ---------- |-----------------------------------------------------------| ------------------------------------------------------- | -| `text` | `Union[str,list,pd.DataFrame, pd.Series, pyspark.sql.DataFrame ]` | `'I love NLU and Streamlit and sunny days!'` | Text to predict classes for. Will predict on each input of the iteratable or dataframe if type is not str.| -| `output_level` | `Optional[str]` | `document` | [Outputlevel of NLU pipeline, see `pipe.predict()` docsmore info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-level-parameter)| -| `include_text_col` | `bool` |`True` | Whether to include a e text column in the output table or just the prediction data | -| `title` | `Optional[str]` | `Text Classification` | Title of the Streamlit building block that will be visualized to screen | -| `metadata` | `bool` | `False` | [whether to output addition metadata or not, see `pipe.predict(meta=true)` docs for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-metadata) | -| `positions` | `bool` | `False` | [whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +| Argument | Type | Default | Description | +|-------------------------|-------------------------------------------------------------------|----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `text` | `Union[str,list,pd.DataFrame, pd.Series, pyspark.sql.DataFrame ]` | `'I love NLU and Streamlit and sunny days!'` | Text to predict classes for. Will predict on each input of the iteratable or dataframe if type is not str. | +| `output_level` | `Optional[str]` | `document` | [Outputlevel of NLP pipeline, see `pipe.predict()` docsmore info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-level-parameter) | +| `include_text_col` | `bool` | `True` | Whether to include a e text column in the output table or just the prediction data | +| `title` | `Optional[str]` | `Text Classification` | Title of the Streamlit building block that will be visualized to screen | +| `metadata` | `bool` | `False` | [whether to output addition metadata or not, see `pipe.predict(meta=true)` docs for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-metadata) | +| `positions` | `bool` | `False` | [whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLP namespace structure. |
    ## function `pipe.viz_streamlit_ner` + Visualize the predicted classes and their confidences and additional metadata to Streamlit. Aplicable with [any of the 250+ NER models](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition). You can filter which NER tags to highlight via the dropdown in the main window. Basic usage + ```python -nlu.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel from Germany dont share many views') +nlp.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel from Germany dont share many views') ``` ![NER visualization](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/NER.gif) Example for coloring + ```python # Color all entities of class GPE black -nlu.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel from Germany dont share many views',colors={'PERSON':'#6e992e', 'GPE':'#000000'}) +nlp.load('ner').viz_streamlit_ner('Donald Trump from America and Angela Merkel from Germany dont share many views', + colors={'PERSON': '#6e992e', 'GPE': '#000000'}) ``` + ![NER coloring](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/NER_colored.png)
    ### function parameters `pipe.viz_streamlit_ner` -| Argument | Type | Default |Description | -|--------------------------- | -----------------------|-----------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------ | -| `text` | `str` | `'Donald Trump from America and Anegela Merkel from Germany do not share many views'` | Text to predict classes for.| -| `ner_tags` | `Optional[List[str]]` | `None` |Tags to display. By default all tags will be displayed| -| `show_label_select` | `bool` |`True` | Whether to include the label selector| -| `show_table` | `bool` | `True` | Whether show to predicted pandas table or not| -| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | -| `sub_title` | `Optional[str]` | `'"Recognize various Named Entities (NER) in text entered and filter them. You can select from over 100 languages in the dropdown. On the left side.",'` | Sub-title of the Streamlit building block that will be visualized to screen | -| `colors` | `Dict[str,str]` | `{}` | Dict with `KEY=ENTITY_LABEL` and `VALUE=COLOR_AS_HEX_CODE`,which will change color of highlighted entities.[See custom color labels docs for more info.](https://nlu.johnsnowlabs.com/docs/en/viz_examples#define-custom-colors-for-labels) | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_text_input` | `bool` | `True` | Show text input field to input text in -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +| Argument | Type | Default | Description | +|-------------------------|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `text` | `str` | `'Donald Trump from America and Anegela Merkel from Germany do not share many views'` | Text to predict classes for. | +| `ner_tags` | `Optional[List[str]]` | `None` | Tags to display. By default all tags will be displayed | +| `show_label_select` | `bool` | `True` | Whether to include the label selector | +| `show_table` | `bool` | `True` | Whether show to predicted pandas table or not | +| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | +| `sub_title` | `Optional[str]` | `'"Recognize various Named Entities (NER) in text entered and filter them. You can select from over 100 languages in the dropdown. On the left side.",'` | Sub-title of the Streamlit building block that will be visualized to screen | +| `colors` | `Dict[str,str]` | `{}` | Dict with `KEY=ENTITY_LABEL` and `VALUE=COLOR_AS_HEX_CODE`,which will change color of highlighted entities.[See custom color labels docs for more info.](https://nlu.johnsnowlabs.com/docs/en/viz_examples#define-custom-colors-for-labels) | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models available in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_text_input` | `bool` | `True` | Show text input field to input text in | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additional information about ISO codes and the NLP namespace structure. |
    ## function `pipe.viz_streamlit_dep_tree` + Visualize a typed dependency tree, the relations between tokens and part of speech tags predicted. -Aplicable with [any of the 100+ Part of Speech(POS) models and dep tree model](https://nlp.johnsnowlabs.com/models?task=Part+of+Speech+Tagging) +Aplicable +with [any of the 100+ Part of Speech(POS) models and dep tree model](https://nlp.johnsnowlabs.com/models?task=Part+of+Speech+Tagging) ```python -nlu.load('dep.typed').viz_streamlit_dep_tree('POS tags define a grammatical label for each token and the Dependency Tree classifies Relations between the tokens') +nlp.load('dep.typed').viz_streamlit_dep_tree( + 'POS tags define a grammatical label for each token and the Dependency Tree classifies Relations between the tokens') ``` + ![Dependency Tree](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/img/DEP.png)
    ### function parameters `pipe.viz_streamlit_dep_tree` -| Argument | Type | Default |Description | -|--------------------------- | ---------- |-----------------------------------------------------------| ------------------------------------------------------- | -| `text` | `str` | `'Billy likes to swim'` | Text to predict classes for.| -| `title` | `Optional[str]` | `'Dependency Parse Tree & Part-of-speech tags'` | Title of the Streamlit building block that will be visualized to screen | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +| Argument | Type | Default | Description | +|-------------------------|-----------------|-------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `text` | `str` | `'Billy likes to swim'` | Text to predict classes for. | +| `title` | `Optional[str]` | `'Dependency Parse Tree & Part-of-speech tags'` | Title of the Streamlit building block that will be visualized to screen | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLP namespace structure. |
    ## function `pipe.viz_streamlit_token` + Visualize predicted token and text features for every model loaded. -You can use this with [any of the 1000+ models](https://nlp.johnsnowlabs.com/models) and select them from the left dropdown. +You can use this with [any of the 1000+ models](https://nlp.johnsnowlabs.com/models) and select them from the left +dropdown. ```python -nlu.load('stemm pos spell').viz_streamlit_token('I liek pentut buttr and jelly !') +nlp.load('stemm pos spell').viz_streamlit_token('I liek pentut buttr and jelly !') ``` + ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/token.gif)
    ### function parameters `pipe.viz_streamlit_token` -| Argument | Type | Default |Description | -|--------------------------- | ---------- |-----------------------------------------------------------| ------------------------------------------------------- | -| `text` | `str` | `'NLU and Streamlit are great!'` | Text to predict token information for.| -| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | -| `show_feature_select` | `bool` |`True` | Whether to include the token feature selector| -| `features` | `Optional[List[str]]` | `None` |Features to to display. By default all Features will be displayed| -| `metadata` | `bool` | `False` | [Whether to output addition metadata or not, see `pipe.predict(meta=true)` docs for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-metadata) | -| `output_level` | `Optional[str]` | `'token'` | [Outputlevel of NLU pipeline, see `pipe.predict()` docsmore info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-level-parameter)| -| `positions` | `bool` | `False` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +| Argument | Type | Default | Description | +|-------------------------|-----------------------|----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `text` | `str` | `'NLU and Streamlit are great!'` | Text to predict token information for. | +| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | +| `show_feature_select` | `bool` | `True` | Whether to include the token feature selector | +| `features` | `Optional[List[str]]` | `None` | Features to to display. By default all Features will be displayed | +| `metadata` | `bool` | `False` | [Whether to output addition metadata or not, see `pipe.predict(meta=true)` docs for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-metadata) | +| `output_level` | `Optional[str]` | `'token'` | [Outputlevel of NLP pipeline, see `pipe.predict()` docsmore info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-level-parameter) | +| `positions` | `bool` | `False` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLP namespace structure. |
    ## function `pipe.viz_streamlit_similarity` -- Displays a `similarity matrix`, where `x-axis` is every token in the first text and `y-axis` is every token in the second text. -- Index `i,j` in the matrix describes the similarity of `token-i` to `token-j` based on the loaded embeddings and distance metrics, based on [Sklearns Pariwise Metrics.](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics.pairwise). [See this article for more elaboration on similarities](https://medium.com/spark-nlp/easy-sentence-similarity-with-bert-sentence-embeddings-using-john-snow-labs-nlu-ea078deb6ebf) -- Displays a dropdown selectors from which various similarity metrics and over 100 embeddings can be selected. - -There will be one similarity matrix per `metric` and `embedding` pair selected. `num_plots = num_metric*num_embeddings` +- Displays a `similarity matrix`, where `x-axis` is every token in the first text and `y-axis` is every token in the + second text. +- Index `i,j` in the matrix describes the similarity of `token-i` to `token-j` based on the loaded embeddings and + distance metrics, based + on [Sklearns Pariwise Metrics.](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics.pairwise) + . [See this article for more elaboration on similarities](https://medium.com/spark-nlp/easy-sentence-similarity-with-bert-sentence-embeddings-using-john-snow-labs-nlu-ea078deb6ebf) +- Displays a dropdown selectors from which various similarity metrics and over 100 embeddings can be selected. + -There will be one similarity matrix per `metric` and `embedding` pair + selected. `num_plots = num_metric*num_embeddings` Also displays embedding vector information. Applicable with [any of the 100+ Word Embedding models](https://nlp.johnsnowlabs.com/models?task=Embeddings) - - ```python -nlu.load('bert').viz_streamlit_word_similarity(['I love love loooove NLU! <3','I also love love looove Streamlit! <3']) +nlp.load('bert').viz_streamlit_word_similarity( + ['I love love loooove NLP! <3', 'I also love love looove Streamlit! <3']) ``` + ![text_class1](https://raw.githubusercontent.com/JohnSnowLabs/nlu/master/docs/assets/streamlit_docs_assets/gif/SIM.gif)
    ### function parameters `pipe.viz_streamlit_similarity` -| Argument | Type | Default |Description | -|--------------------------- | ---------- |-----------------------------------------------------------| ------------------------------------------------------- | -| `texts` | `str` | `'Donald Trump from America and Anegela Merkel from Germany do not share many views.'` | Text to predict token information for.| -| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | -| `similarity_matrix` | `bool` | `None` |Whether to display similarity matrix or not| -| `show_algo_select` | `bool` |`True` | Whether to show dist algo select or not | -| `show_table` | `bool` | `True` | Whether show to predicted pandas table or not| -| `threshold` | `float` | `0.5` | Threshold for displaying result red on screen | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn -| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -|`write_raw_pandas` | `bool` | `False` | Write the raw pandas similarity df to streamlit -|`display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more. -|`dist_metrics` | `List[str]` | `['cosine']` | Which distance metrics to apply. If multiple are selected, there will be multiple plots for each embedding and metric. `num_plots = num_metric*num_embeddings`. Can use multiple at the same time, any of of `cityblock`,`cosine`,`euclidean`,`l2`,`l1`,`manhattan`,`nan_euclidean`. Provided via [Sklearn `metrics.pairwise` package](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics.pairwise) -|`num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes. -|`display_scalar_similarities` | `bool` | `False` | Display scalar simmilarities in an additional field. -|`display_similarity_summary` | `bool` | `False` | Display summary of all similarities for all embeddings and metrics. -| `show_logo` | `bool` | `True` | Show logo -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU spellbook structure. +| Argument | Type | Default | Description | +|-------------------------------|-----------------|----------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `texts` | `str` | `'Donald Trump from America and Anegela Merkel from Germany do not share many views.'` | Text to predict token information for. | +| `title` | `Optional[str]` | `'Named Entities'` | Title of the Streamlit building block that will be visualized to screen | +| `similarity_matrix` | `bool` | `None` | Whether to display similarity matrix or not | +| `show_algo_select` | `bool` | `True` | Whether to show dist algo select or not | +| `show_table` | `bool` | `True` | Whether show to predicted pandas table or not | +| `threshold` | `float` | `0.5` | Threshold for displaying result red on screen | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `generate_code_sample` | `bool` | `False` | Display Python code snippets above visualizations that can be used to re-create the visualization | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `write_raw_pandas` | `bool` | `False` | Write the raw pandas similarity df to streamlit | +| `display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more. | +| `dist_metrics` | `List[str]` | `['cosine']` | Which distance metrics to apply. If multiple are selected, there will be multiple plots for each embedding and metric. `num_plots = num_metric*num_embeddings`. Can use multiple at the same time, any of of `cityblock`,`cosine`,`euclidean`,`l2`,`l1`,`manhattan`,`nan_euclidean`. Provided via [Sklearn `metrics.pairwise` package](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics.pairwise) | +| `num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes. | +| `display_scalar_similarities` | `bool` | `False` | Display scalar similarities in an additional field. | +| `display_similarity_summary` | `bool` | `False` | Display summary of all similarities for all embeddings and metrics. | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additional information about ISO codes and the NLP namespace structure. |
    {:.h2-select} + ## Embedding visualization via Manifold and Matrix Decomposition algorithms ### function `pipe.viz_streamlit_word_embed_manifold` -Visualize Word Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 11 Supported methods from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) -and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition). -Additionally, you can color the lower dimensional points with a label that has been previously assigned to the text by specifying a list of nlu references in the `additional_classifiers_for_coloring` parameter. +Visualize Word Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 11 Supported methods +from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) +and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition) +. +Additionally, you can color the lower dimensional points with a label that has been previously assigned to the text by +specifying a list of nlp references in the `additional_classifiers_for_coloring` parameter. -- Reduces Dimensionality of high dimensional Word Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data in an interactive `Plotly` plot +- Reduces Dimensionality of high dimensional Word Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data in an + interactive `Plotly` plot - Applicable with [any of the 100+ Word Embedding models](https://nlp.johnsnowlabs.com/models?task=Embeddings) -- Color points by classifying with any of the 100+ [Parts of Speech Classifiers](https://nlp.johnsnowlabs.com/models?task=Part+of+Speech+Tagging) or [Document Classifiers](https://nlp.johnsnowlabs.com/models?task=Text+Classification) +- Color points by classifying with any of the + 100+ [Parts of Speech Classifiers](https://nlp.johnsnowlabs.com/models?task=Part+of+Speech+Tagging) + or [Document Classifiers](https://nlp.johnsnowlabs.com/models?task=Text+Classification) - Gemerates `NUM-DIMENSIONS` * `NUM-EMBEDDINGS` * `NUM-DIMENSION-REDUCTION-ALGOS` plots - - ```python -nlu.load('bert',verbose=True).viz_streamlit_word_embed_manifold(default_texts=['I love NLU <3', 'I love streamlit <3'],default_algos_to_apply=['TSNE'],MAX_DISPLAY_NUM=5) +nlp.load('bert', verbose=True).viz_streamlit_word_embed_manifold(default_texts=['I love NLU <3', 'I love streamlit <3'], + default_algos_to_apply=['TSNE'], MAX_DISPLAY_NUM=5) ``` @@ -380,27 +438,27 @@ nlu.load('bert',verbose=True).viz_streamlit_word_embed_manifold(default_texts=[' ### function parameters `pipe.viz_streamlit_word_embed_manifold` -| Argument | Type | Default |Description | -|----------------------------|------------|-----------------------------------------------------------|---------------------------------------------------------| -|`default_texts`| `List[str]` | ("Donald Trump likes to party!", "Angela Merkel likes to party!", 'Peter HATES TO PARTTY!!!! :(') | List of strings to apply classifiers, embeddings, and manifolds to. | -| `text` | `Optional[str]` | `'Billy likes to swim'` | Text to predict classes for. | -|`sub_title`| `Optional[str]` | "Apply any of the 11 `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Word Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | -|`default_algos_to_apply`| `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | -|`target_dimensions`| `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | -|`show_algo_select`| `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | -|`show_embed_select`| `bool` | `True` | Show selector for Embedding Selection | -|`show_color_select`| `bool` | `True` | Show selector for coloring plots | -|`MAX_DISPLAY_NUM`| `int` |`100` | Cap maximum number of Tokens displayed | -|`display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more.| -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not.| -|`num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes.| -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | -|`additional_classifiers_for_coloring` | `List[str]`|`['pos', 'sentiment.imdb']` | List of additional NLU references to load for generting hue colors | -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_logo` | `bool` | `True` | Show logo | -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU namespace structure.| -| `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | +| Argument | Type | Default | Description | +|---------------------------------------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `default_texts` | `List[str]` | ("Donald Trump likes to party!", "Angela Merkel likes to party!", 'Peter HATES TO PARTTY!!!! :(') | List of strings to apply classifiers, embeddings, and manifolds to. | +| `text` | `Optional[str]` | `'Billy likes to swim'` | Text to predict classes for. | +| `sub_title` | `Optional[str]` | "Apply any of the 11 `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Word Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | +| `default_algos_to_apply` | `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | +| `target_dimensions` | `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | +| `show_algo_select` | `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | +| `show_embed_select` | `bool` | `True` | Show selector for Embedding Selection | +| `show_color_select` | `bool` | `True` | Show selector for coloring plots | +| `MAX_DISPLAY_NUM` | `int` | `100` | Cap maximum number of Tokens displayed | +| `display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more. | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `additional_classifiers_for_coloring` | `List[str]` | `['pos', 'sentiment.imdb']` | List of additional NLP references to load for generating hue colors | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models available in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additional information about ISO codes and the NLP namespace structure. | +| `n_jobs` | `Optional[int]` | `3` | `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. |
    @@ -412,18 +470,23 @@ nlu.load('bert',verbose=True).viz_streamlit_word_embed_manifold(default_texts=[' ## function `pipe.viz_streamlit_sentence_embed_manifold` -Visualize Sentence Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 12 Supported methods from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) -and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition). -Additionally, you can color the lower dimensional points with a label that has been previously assigned to the text by specifying a list of nlu references in the `additional_classifiers_for_coloring` parameter. +Visualize Sentence Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 12 Supported methods +from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) +and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition) +. +Additionally, you can color the lower dimensional points with a label that has been previously assigned to the text by +specifying a list of nlp references in the `additional_classifiers_for_coloring` parameter. You can also select additional classifiers via the GUI. -- Reduces Dimensionality of high dimensional Sentence Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data in an interactive `Plotly` plot +- Reduces Dimensionality of high dimensional Sentence Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data + in an interactive `Plotly` plot - Applicable with [any of the 100+ Sentence Embedding models](https://nlp.johnsnowlabs.com/models?task=Embeddings) -- Color points by classifying with any of the 100+ [Document Classifiers](https://nlp.johnsnowlabs.com/models?task=Text+Classification) +- Color points by classifying with any of the + 100+ [Document Classifiers](https://nlp.johnsnowlabs.com/models?task=Text+Classification) - Gemerates `NUM-DIMENSIONS` * `NUM-EMBEDDINGS` * `NUM-DIMENSION-REDUCTION-ALGOS` plots ```python -nlu.load('embed_sentence.bert').viz_streamlit_sentence_embed_manifold(['text1','text2tdo']) +nlp.load('embed_sentence.bert').viz_streamlit_sentence_embed_manifold(['text1', 'text2tdo']) ``` @@ -432,65 +495,73 @@ nlu.load('embed_sentence.bert').viz_streamlit_sentence_embed_manifold(['text1',' ### function parameters `pipe.viz_streamlit_sentence_embed_manifold` -| Argument | Type | Default |Description | -|----------------------------|------------|-----------------------------------------------------------|---------------------------------------------------------| -|`default_texts`| `List[str]` | ("Donald Trump likes to party!", "Angela Merkel likes to party!", 'Peter HATES TO PARTTY!!!! :(') | List of strings to apply classifiers, embeddings, and manifolds to. | -| `text` | `Optional[str]` | `'Billy likes to swim'` | Text to predict classes for. | -|`sub_title`| `Optional[str]` | "Apply any of the 11 `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Sentence Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | -|`default_algos_to_apply`| `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | -|`target_dimensions`| `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | -|`show_algo_select`| `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | -|`show_embed_select`| `bool` | `True` | Show selector for Embedding Selection | -|`show_color_select`| `bool` | `True` | Show selector for coloring plots | -|`display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more.| -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not.| -|`num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes.| -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | -|`additional_classifiers_for_coloring` | `List[str]`|`['sentiment.imdb']` | List of additional NLU references to load for generting hue colors | -| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | -| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | -| `show_logo` | `bool` | `True` | Show logo | -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU namespace structure.| -| `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | +| Argument | Type | Default | Description | +|---------------------------------------|-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `default_texts` | `List[str]` | ("Donald Trump likes to party!", "Angela Merkel likes to party!", 'Peter HATES TO PARTTY!!!! :(') | List of strings to apply classifiers, embeddings, and manifolds to. | +| `text` | `Optional[str]` | `'Billy likes to swim'` | Text to predict classes for. | +| `sub_title` | `Optional[str]` | "Apply any of the 11 `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Sentence Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | +| `default_algos_to_apply` | `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | +| `target_dimensions` | `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | +| `show_algo_select` | `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | +| `show_embed_select` | `bool` | `True` | Show selector for Embedding Selection | +| `show_color_select` | `bool` | `True` | Show selector for coloring plots | +| `display_embed_information` | `bool` | `True` | Show additional embedding information like `dimension`, `nlu_reference`, `spark_nlp_reference`, `sotrage_reference`, `modelhub link` and more. | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `additional_classifiers_for_coloring` | `List[str]` | `['sentiment.imdb']` | List of additional NLP references to load for generting hue colors | +| `show_model_select` | `bool` | `True` | Show a model selection dropdowns that makes any of the 1000+ models avaiable in 1 click | +| `model_select_position` | `str` | `'side'` | [Whether to output the positions of predictions or not, see `pipe.predict(positions=true`) for more info](https://nlu.johnsnowlabs.com/docs/en/predict_api#output-positions-parameter) | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additional information about ISO codes and the NLP namespace structure. | +| `n_jobs` | `Optional[int]` | `3` | How many cores to use for paralleling when using Sklearn Dimension Reduction algorithms. | |
    ## Streamlit Entity Manifold visualization + ## function `pipe.viz_streamlit_entity_embed_manifold` -Visualize recognized entities by NER models via their Entity Embeddings in `1-D`, `2-D`, or `3-D` by `Reducing Dimensionality` via 10+ Supported methods from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) -and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition). -You can pick additional NER models and compare them via the GUI dropdown on the left. +Visualize recognized entities by NER models via their Entity Embeddings in `1-D`, `2-D`, or `3-D` +by `Reducing Dimensionality` via 10+ Supported methods +from [Manifold Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) +and [Matrix Decomposition Algorithms](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition) +. +You can pick additional NER models and compare them via the GUI dropdown on the left. -- Reduces Dimensionality of high dimensional Entity Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data in an interactive `Plotly` plot -- Applicable with [any of the 330+ Named Entity Recognizer models](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition) -- Gemerates `NUM-DIMENSIONS` * `NUM-NER-MODELS` * `NUM-DIMENSION-REDUCTION-ALGOS` plots +- Reduces Dimensionality of high dimensional Entity Embeddings to `1-D`, `2-D`, or `3-D` and plot the resulting data in + an interactive `Plotly` plot +- Applicable + with [any of the 330+ Named Entity Recognizer models](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition) +- Generates `NUM-DIMENSIONS` * `NUM-NER-MODELS` * `NUM-DIMENSION-REDUCTION-ALGOS` plots ```python -nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Labs', 'Peter loves to visit New York']) +nlp.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Labs', 'Peter loves to visit New York']) ``` +
    ### function parameters `pipe.viz_streamlit_sentence_embed_manifold` -| Argument | Type | Default |Description | -|----------------------------|------------|-----------------------------------------------------------|---------------------------------------------------------| -|`default_texts`| `List[str]` |"Donald Trump likes to visit New York", "Angela Merkel likes to visit Berlin!", 'Peter hates visiting Paris')| List of strings to apply classifiers, embeddings, and manifolds to. | -| `title` | `str` | `'NLU ❤️ Streamlit - Prototype your NLP startup in 0 lines of code🚀'` | Title of the Streamlit app -|`sub_title`| `Optional[str]` | "Apply any of the 10+ `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Entity Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | -|`default_algos_to_apply`| `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | -|`target_dimensions`| `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | -|`show_algo_select`| `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | -| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not.| -|`num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrixes.| -| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | -| `show_logo` | `bool` | `True` | Show logo | -| `display_infos` | `bool` | `False` | Display additonal information about ISO codes and the NLU namespace structure.| -| `n_jobs` | `Optional[int]` | `3`| `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | +| Argument | Type | Default | Description | +|--------------------------|-----------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `default_texts` | `List[str]` | "Donald Trump likes to visit New York", "Angela Merkel likes to visit Berlin!", 'Peter hates visiting Paris') | List of strings to apply classifiers, embeddings, and manifolds to. | +| `title` | `str` | `'NLU ❤️ Streamlit - Prototype your NLP startup in 0 lines of code🚀'` | Title of the Streamlit app | +| `sub_title` | `Optional[str]` | "Apply any of the 10+ `Manifold` or `Matrix Decomposition` algorithms to reduce the dimensionality of `Entity Embeddings` to `1-D`, `2-D` and `3-D` " | Sub title of the Streamlit app | +| `default_algos_to_apply` | `List[str]` | `["TSNE", "PCA"]` | A list Manifold and Matrix Decomposition Algorithms to apply. Can be either `'TSNE'`,`'ISOMAP'`,`'LLE'`,`'Spectral Embedding'`, `'MDS'`,`'PCA'`,`'SVD aka LSA'`,`'DictionaryLearning'`,`'FactorAnalysis'`,`'FastICA'` or `'KernelPCA'`, | +| `target_dimensions` | `List[int]` | `(1,2,3)` | Defines the target dimension embeddings will be reduced to | +| `show_algo_select` | `bool` | `True` | Show selector for Manifold and Matrix Decomposition Algorithms | +| `set_wide_layout_CSS` | `bool` | `True` | Whether to inject custom CSS or not. | +| `num_cols` | `int` | `2` | How many columns should for the layout in streamlit when rendering the similarity matrices. | +| `key` | `str` | `"NLU_streamlit"` | Key for the Streamlit elements drawn | +| `show_logo` | `bool` | `True` | Show logo | +| `display_infos` | `bool` | `False` | Display additional information about ISO codes and the NLP namespace structure. | +| `n_jobs` | `Optional[int]` | `3` | `False` | How many cores to use for paralellzing when using Sklearn Dimension Reduction algorithms. | ### [Supported Manifold Algorithms for Word, Sentence, and Entity Embeddings](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.manifold) + - [TSNE](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.TSNE.html#sklearn.manifold.TSNE) - [ISOMAP](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.Isomap.html#sklearn.manifold.Isomap) - [LLE](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.LocallyLinearEmbedding.html#sklearn.manifold.LocallyLinearEmbedding) @@ -498,6 +569,7 @@ nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Lab - [MDS](https://scikit-learn.org/stable/modules/generated/sklearn.manifold.MDS.html#sklearn.manifold.MDS) ### [Supported Matrix Decomposition Algorithms for Word, Sentence and Entity Embeddings](https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition) + - [PCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA) - [Truncated SVD aka LSA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.TruncatedSVD.html#sklearn.decomposition.TruncatedSVD) - [DictionaryLearning](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.DictionaryLearning.html#sklearn.decomposition.DictionaryLearning) @@ -506,5 +578,4 @@ nlu.load('ner').viz_streamlit_sentence_embed_manifold(['Hello From John Snow Lab - [KernelPCA](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.KernelPCA.html#sklearn.decomposition.KernelPCA) - [Latent Dirichlet Allocation](https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.LatentDirichletAllocation.html) -
    \ No newline at end of file diff --git a/docs/en/testing_utils.md b/docs/en/testing_utils.md new file mode 100644 index 00000000..66e41da9 --- /dev/null +++ b/docs/en/testing_utils.md @@ -0,0 +1,186 @@ +--- +layout: docs +seotitle: NLU | John Snow Labs +title: Release Testing Utilities +permalink: /docs/en/testing-utils +key: docs-install +modify_date: "2020-05-26" +header: true +--- + +## Utilities for Testing Models & Modelshub Code Snippets + +
    + +You can use the John Snow Labs library to automatically test 10000+ models and 100+ Notebooks in 1 line of code within +a small machine like a **single Google Colab Instance** and generate very handy error reports of potentially broken Models, Notebooks or Models hub Markdown Snippets. + +You can test the following things with the `test_markdown()` function : + +- A `local` Models Hub Markdown snippet via path. +- a `remote` Models Hub Markdown snippet via URL. +- a `local` folder of Models Hub Markdown files. Generates report +- a `list` of local paths or urls to .md files. Generates a report + +Test-Report Pandas Dataframe has the columns: + +| Report Column | Description | +|---------------|---------------------------------------------------------------| +| `test_script` | is the generated script for testing | +| `stderr` | Error logs of process ran. Print this to easily read | +| `stdout` | Standard Print logs of process ran. Print this to easily read | +| `success` | True if script ran successfully from top to bottom | +| `notebook` | The Source notebook for testing | + + + + + + + +### Test a Local Models Hub Markdown Snippet + +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('path/to/my/file.md') +``` + +### Test a Remote Models Hub Markdown Snippet + +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('https://nlp.johnsnowlabs.com/2022/08/31/legpipe_deid_en.html') +``` + +### Test a Folder with Models Hub Markdown Snippets +This will scan the folder for all files ending with `.md` , test them and generate a report +```python +from johnsnowlabs.utils.modelhub_markdown import test_markdown +test_markdown('my/markdown/folder') +``` + +### Test a List of Markdown References +Can be mixed with Urls and paths, will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +md_to_test = ['legpipe_deid_en.html', + 'path/to/local/markdown_snippet.md',] +test_markdown(md_to_test) +``` + + +
    + + + +
    + +## Utilities for Testing Notebooks + +You can use the John Snow Labs library to automatically test 10000+ models and 100+ Notebooks in 1 line of code within +a small machine like a **single Google Colab Instance** and generate very handy error reports of potentially broken Models, Notebooks or Models hub Markdown Snippets. + +You can test the following things with the `test_ipynb()` function : + + +- A `local` .ipynb file +- a `remote` .ipynb URL, point to RAW githubuser content URL of the file when using git. +- a `local` folder of ipynb files, generates report +- a `list` of local paths or urls to .ipynb files. Generates a Report +- The entire [John Snow Labs Workshop Certification Folder](https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings) Generates a Report +- A sub-folder of the [John Snow Labs Workshop Certification Folder](https://github.com/JohnSnowLabs/spark-nlp-workshop/tree/master/tutorials/Certification_Trainings) , i.e. only OCR or only Legal. Generates a Report + + + + +The generated Test-Report Pandas Dataframe has the columns: + +| Report Column | Description | +|---------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `test_script` | is the generated script for testing. If you think the notebook should not crash, check the file, there could be a generation error. | +| `stderr` | Error logs of process ran. Print this to easily read | +| `stdout` | Standard Print logs of process ran. Print this to easily read | +| `success` | True if script ran successfully from top to bottom | +| `notebook` | The Source notebook for testing | + + + + + + + +### Test a Local Notebook + +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('path/to/local/notebook.ipynb') +``` + +### Test a Remote Notebook + +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/5.Spark_OCR.ipynb',) +``` + +### Test a Folder with Notebooks +This will scan the folder for all files ending with `.ipynb` , test them and generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_ipynb('my/notebook/folder') +``` + + + +### Test a List of Notebook References +Can be mixed with Urls and paths, will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +nb_to_test = [ + 'https://raw.githubusercontent.com/JohnSnowLabs/spark-nlp-workshop/master/tutorials/Certification_Trainings/Healthcare/5.Spark_OCR.ipynb', + 'path/to/local/notebook.ipynb',] +test_ipynb(nb_to_test) +``` + + +### Run All Certification Notebooks +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP') +``` + + + + +### Run Finance Certification Notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-FIN') +``` + +### Run Legal notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-LEG') +``` + +### Run Medical notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-MED') +``` + +### Run Open Source notebooks only +Will generate a report +```python +from johnsnowlabs.utils.notebooks import test_ipynb +test_result = test_ipynb('WORKSHOP-OS') +``` + + + +
    \ No newline at end of file diff --git a/docs/en/testing_utils_notebook.md b/docs/en/testing_utils_notebook.md index 2bf7e35e..5cd5fdcf 100644 --- a/docs/en/testing_utils_notebook.md +++ b/docs/en/testing_utils_notebook.md @@ -118,9 +118,4 @@ test_result = test_ipynb('WORKSHOP-OS') - - - - -
    \ No newline at end of file diff --git a/docs/en/training.md b/docs/en/training.md index b95d806b..26d68f84 100644 --- a/docs/en/training.md +++ b/docs/en/training.md @@ -1,8 +1,8 @@ --- layout: docs header: true -seotitle: NLU | John Snow Labs -title: Training Models with NLU +seotitle: fit | John Snow Labs +title: Training Models with the fit() function permalink: /docs/en/training key: docs-developers modify_date: "2020-05-08" @@ -10,29 +10,30 @@ modify_date: "2020-05-08"
    -You can fit load a trainable NLU pipeline via ```nlu.load('train.')``` +You can fit load a trainable nlp pipeline via ```nlp.load('train.')``` ## Binary Text Classifier Training [Sentiment classification training demo](https://colab.research.google.com/drive/1f-EORjO3IpvwRAktuL4EvZPqPr2IZ_g8?usp=sharing) -To train the a Sentiment classifier model, you must pass a dataframe with a ```text``` column and a ```y``` column for the label. +To train a Sentiment classifier model, you must pass a dataframe with a ```text``` column and a ```y``` column for the label. Uses a Deep Neural Network built in Tensorflow. By default *Universal Sentence Encoder Embeddings (USE)* are used as sentence embeddings. ```python -fitted_pipe = nlu.load('train.sentiment').fit(train_df) +fitted_pipe = nlp.load('train.sentiment').fit(train_df) preds = fitted_pipe.predict(train_df) ``` -If you add a nlu sentence embeddings reference, before the train reference, NLU will use that Sentence embeddings instead of the default USE. + +To train on custom embeddings you can specify some sentence embeddings before the training reference which will be used instead of the default USE embeddings. ```python #Train Classifier on BERT sentence embeddings -fitted_pipe = nlu.load('embed_sentence.bert train.classifier').fit(train_df) +fitted_pipe = nlp.load('embed_sentence.bert train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` ```python #Train Classifier on ELECTRA sentence embeddings -fitted_pipe = nlu.load('embed_sentence.electra train.classifier').fit(train_df) +fitted_pipe = nlp.load('embed_sentence.electra train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` @@ -44,15 +45,15 @@ To train the Multi Class text classifier model, you must pass a dataframe with a By default *Universal Sentence Encoder Embeddings (USE)* are used as sentence embeddings. ```python -fitted_pipe = nlu.load('train.classifier').fit(train_df) +fitted_pipe = nlp.load('train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` -If you add a nlu sentence embeddings reference, before the train reference, NLU will use that Sentence embeddings instead of the default USE. +To train on custom embeddings you can specify some sentence embeddings before the training reference which will be used instead of the default USE embeddings. ```python #Train on BERT sentence emebddings -fitted_pipe = nlu.load('embed_sentence.bert train.classifier').fit(train_df) +fitted_pipe = nlp.load('embed_sentence.bert train.classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` @@ -68,36 +69,37 @@ The ```y``` label must be a string column where each label is seperated with a s By default, ```,``` is assumed as line seperator. If your dataset is using a different label seperator, you must configure the ```label_seperator``` parameter while calling the ```fit()``` method. -By default *Universal Sentence Encoder Embeddings (USE)* are used as sentence embeddings for training. +By default, *Universal Sentence Encoder Embeddings (USE)* are used as sentence embeddings for training. ```python -fitted_pipe = nlu.load('train.multi_classifier').fit(train_df) +fitted_pipe = nlp.load('train.multi_classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` -If you add a nlu sentence embeddings reference, before the train reference, NLU will use that Sentence embeddings instead of the default USE. +To train on custom embeddings you can specify some sentence embeddings before the training reference which will be used instead of the default USE embeddings. + ```python -#Train on BERT sentence emebddings -fitted_pipe = nlu.load('embed_sentence.bert train.multi_classifier').fit(train_df) +#Train on BERT sentence embeddings +fitted_pipe = nlp.load('embed_sentence.bert train.multi_classifier').fit(train_df) preds = fitted_pipe.predict(train_df) ``` Configure a custom line seperator ```python #Use ; as label seperator -fitted_pipe = nlu.load('embed_sentence.electra train.multi_classifier').fit(train_df, label_seperator=';') +fitted_pipe = nlp.load('embed_sentence.electra train.multi_classifier').fit(train_df, label_seperator=';') preds = fitted_pipe.predict(train_df) ``` ## Part of Speech (POS) Training -Your dataset must be in the form of universal dependencies [Universal Dependencies](https://universaldependencies.org/). +Your dataset must be in the form of [Universal Dependencies](https://universaldependencies.org/). You must configure the dataset_path in the ```fit()``` method to point to the universal dependencies you wish to train on. You can configure the delimiter via the ```label_seperator``` parameter [POS training demo]](https://colab.research.google.com/drive/1CZqHQmrxkDf7y3rQHVjO-97tCnpUXu_3?usp=sharing) ```python -fitted_pipe = nlu.load('train.pos').fit(dataset_path=train_path, label_seperator='_') +fitted_pipe = nlp.load('train.pos').fit(dataset_path=train_path, label_seperator='_') preds = fitted_pipe.predict(train_df) ``` @@ -107,19 +109,19 @@ preds = fitted_pipe.predict(train_df) [NER training demo](https://colab.research.google.com/drive/1_GwhdXULq45GZkw3157fAOx4Wqo-fmFV?usp=sharing) You can train your own custom NER model with an [CoNLL 20003 IOB](https://www.aclweb.org/anthology/W03-0419.pdf) formatted dataset. -By default *Glove 100d Token Embeddings* are used as features for the classifier. +By default, *Glove 100d Token Embeddings* are used as features for the classifier. ```python train_path = '/content/eng.train' -fitted_pipe = nlu.load('train.ner').fit(dataset_path=train_path) +fitted_pipe = nlp.load('train.ner').fit(dataset_path=train_path) ``` -If a NLU reference to a Token Embeddings model is added before the train reference, that Token Embedding will be used when training the NER model. +If a nlp reference to a Token Embeddings model is added before the train reference, that Token Embedding will be used when training the NER model. ```python # Train on BERT embeddigns train_path = '/content/eng.train' -fitted_pipe = nlu.load('bert train.ner').fit(dataset_path=train_path) +fitted_pipe = nlp.load('bert train.ner').fit(dataset_path=train_path) ```
    @@ -142,7 +144,7 @@ dataset = pd.DataFrame({ }) -trainable_pipe = nlu.load('train.resolve_chunks') +trainable_pipe = nlp.load('train.resolve_chunks') fitted_pipe = trainable_pipe.fit(dataset) res = fitted_pipe.predict(dataset) fitted_pipe.predict(["Peter told me to buy Tesla ", 'I have money to loose, is TSLA a good option?']) @@ -157,7 +159,7 @@ fitted_pipe.predict(["Peter told me to buy Tesla ", 'I have money to loose, is T ### Train with default glove embeddings ```python -untrained_chunk_resolver = nlu.load('train.resolve_chunks') +untrained_chunk_resolver = nlp.load('train.resolve_chunks') trained_chunk_resolver = untrained_chunk_resolver.fit(df) trained_chunk_resolver.predict(df) ``` @@ -167,7 +169,7 @@ trained_chunk_resolver.predict(df) ### Train with custom embeddings ```python # Use Healthcare Embeddings -trainable_pipe = nlu.load('en.embed.glove.healthcare_100d train.resolve_chunks') +trainable_pipe = nlp.load('en.embed.glove.healthcare_100d train.resolve_chunks') trained_chunk_resolver = untrained_chunk_resolver.fit(df) trained_chunk_resolver.predict(df) ``` @@ -182,7 +184,6 @@ A dictionary can be provided with setDictionary to map extracted entities to a u ```python -import nlu import json # Define helper functions to write NER rules to file """Generate json with dict contexts at target path""" @@ -208,7 +209,7 @@ neutral,neutral''' # Dump configs to file dump_dict_to_json_file(gender_data, 'gender.csv') dump_dict_to_json_file(gender_rules, 'gender.json') -gender_NER_pipe = nlu.load('match.context') +gender_NER_pipe = nlp.load('match.context') gender_NER_pipe.print_info() gender_NER_pipe['context_matcher'].setJsonPath('gender.json') gender_NER_pipe['context_matcher'].setDictionary('gender.csv', options={"delimiter":","}) @@ -250,33 +251,33 @@ You can define the following parameters in your rules.json file to define the en
    -## Saving a NLU pipeline to disk +## Saving a pipeline to disk ```python train_path = '/content/eng.train' -fitted_pipe = nlu.load('train.ner').fit(dataset_path=train_path) +fitted_pipe = nlp.load('train.ner').fit(dataset_path=train_path) stored_model_path = './models/classifier_dl_trained' fitted_pipe.save(stored_model_path) ```
    -## Loading a NLU pipeline from disk +## Loading a pipeline from disk ```python train_path = '/content/eng.train' -fitted_pipe = nlu.load('train.ner').fit(dataset_path=train_path) +fitted_pipe = nlp.load('train.ner').fit(dataset_path=train_path) stored_model_path = './models/classifier_dl_trained' fitted_pipe.save(stored_model_path) -hdd_pipe = nlu.load(path=stored_model_path) +hdd_pipe = nlp.load(path=stored_model_path) ```
    -## Loading a NLU pipeline as pyspark.ml.PipelineModel +## Loading a pipeline as pyspark.ml.PipelineModel ```python import pyspark -# load the NLU pipeline as pyspark pipeline +# load the NLP pipeline as pyspark pipeline pyspark_pipe = pyspark.ml.PipelineModel.load(stored_model_path) # Generate spark Df and transform it with the pyspark Pipeline s_df = spark.createDataFrame(df) diff --git a/docs/en/utils_for_sparknlp.md b/docs/en/utils_for_sparknlp.md index f6158845..d73bde35 100644 --- a/docs/en/utils_for_sparknlp.md +++ b/docs/en/utils_for_sparknlp.md @@ -12,7 +12,7 @@ modify_date: "2019-05-16" You can see all features showcased in the demo notebook [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/JohnSnowLabs/nlu/blob/master/examples/colab/spark_nlp_utilities/NLU_utils_for_Spark_NLP.ipynb) -## nlu.viz(pipe,data) +## nlp.viz(pipe,data) Visualize input data with an already configured Spark NLP pipeline, for Algorithms of type (Ner,Assertion, Relation, Resolution, Dependency) using [Spark NLP Display](https://nlp.johnsnowlabs.com/docs/en/display) @@ -26,7 +26,7 @@ text = """I have an allergic reaction to vancomycin. My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.""" -nlu.viz(ade_pipeline, text) +nlp.viz(ade_pipeline, text) ``` returns: @@ -45,9 +45,9 @@ corresponding ner_col, pos_col, dep_untyped_col, dep_typed_col, resolution_col,
    -## nlu.autocomplete_pipeline(pipe) +## nlp.autocomplete_pipeline(pipe) Auto-Complete a pipeline or single annotator into a runnable pipeline by harnessing NLU's DAG Autocompletion algorithm and returns it as NLU pipeline. -The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlu pipe +The standard Spark pipeline is avaiable on the `.vanilla_transformer_pipe` attribute of the returned nlp pipe Every Annotator and Pipeline of Annotators defines a `DAG` of tasks, with various dependencies that must be satisfied in `topoligical order`. NLU enables the completion of an incomplete DAG by finding or creating a path between @@ -65,7 +65,7 @@ text = """I have an allergic reaction to vancomycin. My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.""" -nlu_pipe = nlu.autocomplete_pipeline(re_model) +nlu_pipe = nlp.autocomplete_pipeline(re_model) nlu_pipe.predict(text) ``` @@ -105,8 +105,8 @@ text = """I have an allergic reaction to vancomycin. My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.""" -# output is same as nlu.autocomplete_pipeline(re_model).nlu_pipe.predict(text) -nlu.to_pretty_df(ade_pipeline,text) +# output is same as nlp.autocomplete_pipeline(re_model).nlp_pipe.predict(text) +nlp.to_pretty_df(ade_pipeline,text) ``` returns : @@ -117,17 +117,17 @@ returns : | present | sore throat/burning/itchy | ADE | 0.9019 | | present | numbness in tongue and gums | ADE | 0.9991 | -Annotators are grouped internally by NLU into output levels `token`,`sentence`, `document`,`chunk` and `relation` +Annotators are grouped internally by NLP into output levels `token`,`sentence`, `document`,`chunk` and `relation` Same level annotators output columns are zipped and exploded together to create the final output df. Additionally, most keys from the metadata dictionary in the result annotations will be collected and expanded into their own columns in the resulting Dataframe, with special handling for Annotators that encode multiple metadata fields inside of one, seperated by strings like `|||` or `:::`. Some columns are omitted from metadata to reduce total amount of output columns, these can be re-enabled by setting `metadata=True` -For a given pipeline output level is automatically set to the last anntators output level by default. +For a given pipeline output level is automatically set to the last annotators output level by default. This can be changed by defining `to_preddty_df(pipe,text,output_level='my_level'` for levels `token`,`sentence`, `document`,`chunk` and `relation` .
    -## nlu.to_nlu_pipe(pipe) +## nlp.to_nlu_pipe(pipe) Convert a pipeline or list of annotators into a NLU pipeline making `.predict()` and `.viz()` avaiable for every Spark NLP pipeline. Assumes the pipeline is already runnable. @@ -139,7 +139,7 @@ text = """I have an allergic reaction to vancomycin. My skin has be itchy, sore throat/burning/itchy, and numbness in tongue and gums. I would not recommend this drug to anyone, especially since I have never had such an adverse reaction to any other medication.""" -nlu_pipe = nlu.to_nlu_pipe(ade_pipeline) +nlu_pipe = nlp.to_nlu_pipe(ade_pipeline) # Same output as nlu.to_pretty_df(pipe,text) nlu_pipe.predict(text) diff --git a/docs/en/viz_examples.md b/docs/en/viz_examples.md index d1acd24c..85fd650c 100644 --- a/docs/en/viz_examples.md +++ b/docs/en/viz_examples.md @@ -2,7 +2,7 @@ layout: docs header: true seotitle: NLU | John Snow Labs -title: NLU Visualization Examples +title: The nlp.viz() function key: viz-examples permalink: /docs/en/viz_examples modify_date: "2019-05-16" @@ -10,18 +10,12 @@ modify_date: "2019-05-16"
    -NLU can do quite a lot of things in just one line. -But imagine the things you could do in multiple lines, like visualizations! -In this section we will demonstrate a few common NLU idioms for the data science lifecycle, especially for the data exploration phase. - -
    - {:.h2-select} -## Visualizations using nlu.load().viz() -You can use the build in visualization module on any pipeline or model returned by `nlu.load()`. -Simply call `viz()` and NLU will try to deduct a applicable visualization. +## Visualizations using nlp.load().viz() +You can use the build in visualization module on any pipeline or model returned by `nlp.load()`. +Simply call `viz()` and an applicable visualization will be deducted. Alternatively, you can also manually specify, which visualization you want to invoke. -These visualizations are provided via [Spark-NLP-Display package](https://nlp.johnsnowlabs.com/docs/en/display) which NLU will try to automatically install when calling the .viz() method. +These visualizations are provided via [Spark-NLP-Display package](https://nlp.johnsnowlabs.com/docs/en/display) ![NER visualization](/assets/images/nlu/VizExamples/viz_module/cheat_sheet.png) @@ -38,7 +32,7 @@ See the [visualization tutorial](https://github.com/JohnSnowLabs/nlu/blob/master ## NER visualization Applicable to any of the [100+ NER models! See here for an overview](https://nlp.johnsnowlabs.com/models?task=Named+Entity+Recognition) ```python -nlu.load('ner').viz("Donald Trump from America and Angela Merkel from Germany don't share many oppinions.") +nlp.load('ner').viz("Donald Trump from America and Angela Merkel from Germany don't share many oppinions.") ``` ![NER visualization](/assets/images/nlu/VizExamples/viz_module/NER.png) @@ -47,14 +41,14 @@ nlu.load('ner').viz("Donald Trump from America and Angela Merkel from Germany do ## Dependency tree visualization Visualizes the structure of the labeled dependency tree and part of speech tags ```python -nlu.load('dep.typed').viz("Billy went to the mall") +nlp.load('dep.typed').viz("Billy went to the mall") ``` ![Dependency Tree visualization](/assets/images/nlu/VizExamples/viz_module/DEP.png) ```python #Bigger Example -nlu.load('dep.typed').viz("Donald Trump from America and Angela Merkel from Germany don't share many oppinions but they both love John Snow Labs software") +nlp.load('dep.typed').viz("Donald Trump from America and Angela Merkel from Germany don't share many oppinions but they both love John Snow Labs software") ``` ![Dependency Tree visualization](/assets/images/nlu/VizExamples/viz_module/DEP_big.png) @@ -64,7 +58,7 @@ nlu.load('dep.typed').viz("Donald Trump from America and Angela Merkel from Germ Visualizes asserted statuses and entities. Applicable to any of the [10 + Assertion models! See here for an overview](https://nlp.johnsnowlabs.com/models?task=Assertion+Status) ```python -nlu.load('med_ner.clinical assert').viz("The MRI scan showed no signs of cancer in the left lung") +nlp.load('med_ner.clinical assert').viz("The MRI scan showed no signs of cancer in the left lung") ``` @@ -73,7 +67,7 @@ nlu.load('med_ner.clinical assert').viz("The MRI scan showed no signs of cancer ```python #bigger example data ='This is the case of a very pleasant 46-year-old Caucasian female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation, expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed.' -nlu.load('med_ner.clinical assert').viz(data) +nlp.load('med_ner.clinical assert').viz(data) ``` ![Assert visualization](/assets/images/nlu/VizExamples/viz_module/assertion_big.png) @@ -83,14 +77,14 @@ nlu.load('med_ner.clinical assert').viz(data) Visualizes the extracted entities between relationship. Applicable to any of the [20 + Relation Extractor models See here for an overview](https://nlp.johnsnowlabs.com/models?task=Relation+Extraction) ```python -nlu.load('med_ner.jsl.wip.clinical relation.temporal_events').viz('The patient developed cancer after a mercury poisoning in 1999 ') +nlp.load('med_ner.jsl.wip.clinical relation.temporal_events').viz('The patient developed cancer after a mercury poisoning in 1999 ') ``` ![Entity Relation visualization](/assets/images/nlu/VizExamples/viz_module/relation.png) ```python # bigger example data = 'This is the case of a very pleasant 46-year-old Caucasian female, seen in clinic on 12/11/07 during which time MRI of the left shoulder showed no evidence of rotator cuff tear. She did have a previous MRI of the cervical spine that did show an osteophyte on the left C6-C7 level. Based on this, negative MRI of the shoulder, the patient was recommended to have anterior cervical discectomy with anterior interbody fusion at C6-C7 level. Operation, expected outcome, risks, and benefits were discussed with her. Risks include, but not exclusive of bleeding and infection, bleeding could be soft tissue bleeding, which may compromise airway and may result in return to the operating room emergently for evacuation of said hematoma. There is also the possibility of bleeding into the epidural space, which can compress the spinal cord and result in weakness and numbness of all four extremities as well as impairment of bowel and bladder function. However, the patient may develop deeper-seated infection, which may require return to the operating room. Should the infection be in the area of the spinal instrumentation, this will cause a dilemma since there might be a need to remove the spinal instrumentation and/or allograft. There is also the possibility of potential injury to the esophageus, the trachea, and the carotid artery. There is also the risks of stroke on the right cerebral circulation should an undiagnosed plaque be propelled from the right carotid. She understood all of these risks and agreed to have the procedure performed' -pipe = nlu.load('med_ner.jsl.wip.clinical relation.clinical').viz(data) +pipe = nlp.load('med_ner.jsl.wip.clinical relation.clinical').viz(data) ``` ![Entity Relation visualization](/assets/images/nlu/VizExamples/viz_module/relation_big.png) @@ -100,14 +94,14 @@ pipe = nlu.load('med_ner.jsl.wip.clinical relation.clinical').viz(data) Visualizes resolutions of entities Applicable to any of the [100+ Resolver models See here for an overview](https://nlp.johnsnowlabs.com/models?task=Entity+Resolution) ```python -nlu.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz("He took Prevacid 30 mg daily") +nlp.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz("He took Prevacid 30 mg daily") ``` ![Chunk Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_chunk.png) ```python # bigger example data = "This is an 82 - year-old male with a history of prior tobacco use , hypertension , chronic renal insufficiency , COPD , gastritis , and TIA who initially presented to Braintree with a non-ST elevation MI and Guaiac positive stools , transferred to St . Margaret\'s Center for Women & Infants for cardiac catheterization with PTCA to mid LAD lesion complicated by hypotension and bradycardia requiring Atropine , IV fluids and transient dopamine possibly secondary to vagal reaction , subsequently transferred to CCU for close monitoring , hemodynamically stable at the time of admission to the CCU ." -nlu.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz(data) +nlp.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz(data) ``` ![Chunk Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_chunk_big.png) @@ -118,14 +112,14 @@ nlu.load('med_ner.jsl.wip.clinical resolve_chunk.rxnorm.in').viz(data) Visualizes resolutions of entities in sentences Applicable to any of the [100+ Resolver models See here for an overview](https://nlp.johnsnowlabs.com/models?task=Entity+Resolution) ```python -nlu.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz('She was diagnosed with a respiratory congestion') +nlp.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz('She was diagnosed with a respiratory congestion') ``` ![Sentence Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_sentence.png) ```python # bigger example data = 'The patient is a 5-month-old infant who presented initially on Monday with a cold, cough, and runny nose for 2 days. Mom states she had no fever. Her appetite was good but she was spitting up a lot. She had no difficulty breathing and her cough was described as dry and hacky. At that time, physical exam showed a right TM, which was red. Left TM was okay. She was fairly congested but looked happy and playful. She was started on Amoxil and Aldex and we told to recheck in 2 weeks to recheck her ear. Mom returned to clinic again today because she got much worse overnight. She was having difficulty breathing. She was much more congested and her appetite had decreased significantly today. She also spiked a temperature yesterday of 102.6 and always having trouble sleeping secondary to congestion' -nlu.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz(data) +nlp.load('med_ner.jsl.wip.clinical resolve.icd10cm').viz(data) ``` ![Sentence Resolution visualization](/assets/images/nlu/VizExamples/viz_module/resolve_sentence_big.png) @@ -141,7 +135,7 @@ and defining `hex color codes` in a dictionary that maps `labels` to `colors` . data = 'Dr. John Snow suggested that Fritz takes 5mg penicilin for his cough' # Define custom colors for labels viz_colors={'STRENGTH':'#800080', 'DRUG_BRANDNAME':'#77b5fe', 'GENDER':'#77ffe'} -nlu.load('med_ner.jsl.wip.clinical').viz(data,viz_colors =viz_colors) +nlp.load('med_ner.jsl.wip.clinical').viz(data,viz_colors =viz_colors) ``` ![define colors labels](/assets/images/nlu/VizExamples/viz_module/define_colors.png) @@ -155,14 +149,16 @@ Applicable for ner, resolution and assert. data = 'Dr. John Snow suggested that Fritz takes 5mg penicilin for his cough' # Filter wich NER label to viz labels_to_viz=['SYMPTOM'] -nlu.load('med_ner.jsl.wip.clinical').viz(data,labels_to_viz=labels_to_viz) +nlp.load('med_ner.jsl.wip.clinical').viz(data,labels_to_viz=labels_to_viz) ``` ![filter labels](/assets/images/nlu/VizExamples/viz_module/filter_labels.png)
    {:.h2-select} -## Visualizations using Pandas +## Visualizations using Pandas + +### Common Idioms The most common two liner you will use in NLU is loading a classifier like *emotion* or *sentiment* and then plotting the occurence of each predicted label . @@ -170,14 +166,14 @@ An few examples for this are the following : ```python -emotion_df = nlu.load('sentiment').predict(df) +emotion_df = nlp.load('sentiment').predict(df) emotion_df['sentiment'].value_counts().plot.bar() ``` ![Sentiment Counts](/assets/images/nlu/VizExamples/sentiment_counts.png) ```python -emotion_df = nlu.load('emotion').predict(df) +emotion_df = nlp.load('emotion').predict(df) emotion_df['emotion'].value_counts().plot.bar() ``` ![Category counts](/assets/images/nlu/VizExamples/category_counts.png) @@ -185,7 +181,7 @@ emotion_df['emotion'].value_counts().plot.bar() Another simple idiom is to group by an arbitrary feature from the original dataset and then plot the counts four each group. ```python -emotion_df = nlu.load('sentiment').predict(df) +emotion_df = nlp.load('sentiment').predict(df) sentiment_df.groupby('source')['sentiment'].value_counts().plot.bar(figsize=(20,8)) ``` @@ -193,8 +189,8 @@ sentiment_df.groupby('source')['sentiment'].value_counts().plot.bar(figsize=(20, ```python -nlu_emotion_df = nlu.load('emotion').predict(df) -nlu_emotion_df.groupby('airline')['emotion'].value_counts().plot.bar(figsize=(20,8)) +emotion_df = nlp.load('emotion').predict(df) +emotion_df.groupby('airline')['emotion'].value_counts().plot.bar(figsize=(20,8)) ``` ![Sentiment Groupy ](/assets/images/nlu/VizExamples/emotion_groupy.png) From 2e38f194893e6fd152ee9cd9f19ee23b5979af40 Mon Sep 17 00:00:00 2001 From: Vildan <64216738+Meryem1425@users.noreply.github.com> Date: Wed, 11 Jan 2023 13:43:09 -0500 Subject: [PATCH 23/26] Update jsl_release_notes.md --- docs/en/jsl_release_notes.md | 47 +++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md index 64c50d21..4889f790 100644 --- a/docs/en/jsl_release_notes.md +++ b/docs/en/jsl_release_notes.md @@ -11,6 +11,51 @@ header: true
    See [Github Releases](https://github.com/JohnSnowLabs/johnsnowlabs/releases) for detailed information on Release History and Features. +## 4.2.5 +The John Snow Labs 4.2.5 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.4` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.4` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + +## 4.2.4 +The John Snow Labs 4.2.4 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.1` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.4` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + +## 4.2.3 +The John Snow Labs 4.2.3 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.1` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.3` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + + ## 4.2.2 The John Snow Labs 4.2.2 Library released with the following pre-installed and recommended dependencies @@ -57,4 +102,4 @@ The John Snow Labs 4.2.0 Library released with the following pre-installed and r | [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | -
    \ No newline at end of file +
    From 7c86fc8225d4b083c0fe5f3d3a39943b97d9c50c Mon Sep 17 00:00:00 2001 From: Vildan <64216738+Meryem1425@users.noreply.github.com> Date: Tue, 31 Jan 2023 15:12:05 -0500 Subject: [PATCH 24/26] Update jsl_release_notes.md Updated jsl_release_notes md file --- docs/en/jsl_release_notes.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md index 4889f790..6222b435 100644 --- a/docs/en/jsl_release_notes.md +++ b/docs/en/jsl_release_notes.md @@ -11,6 +11,20 @@ header: true
    See [Github Releases](https://github.com/JohnSnowLabs/johnsnowlabs/releases) for detailed information on Release History and Features. +## 4.2.8 +The John Snow Labs 4.2.8 Library released with the following pre-installed and recommended dependencies + +| Library | Version | +|-----------------------------------------------------------------------------|------------| +| [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.3.0` | +| [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.8` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | +| [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | +| [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.8` | +| [Pyspark](https://spark.apache.org/docs/latest/api/python/) | `3.1.2` | + ## 4.2.5 The John Snow Labs 4.2.5 Library released with the following pre-installed and recommended dependencies From 95808c1d58f4ea68e861514474e43cd46f87c50f Mon Sep 17 00:00:00 2001 From: Vildan <64216738+Meryem1425@users.noreply.github.com> Date: Sun, 5 Feb 2023 20:26:45 -0500 Subject: [PATCH 25/26] Update jsl_release_notes.md --- docs/en/jsl_release_notes.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/en/jsl_release_notes.md b/docs/en/jsl_release_notes.md index 6222b435..09680194 100644 --- a/docs/en/jsl_release_notes.md +++ b/docs/en/jsl_release_notes.md @@ -18,8 +18,8 @@ The John Snow Labs 4.2.8 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.3.0` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.8` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.8` | @@ -32,8 +32,8 @@ The John Snow Labs 4.2.5 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.4` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.4` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | @@ -47,8 +47,8 @@ The John Snow Labs 4.2.4 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.1` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.4` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | @@ -62,8 +62,8 @@ The John Snow Labs 4.2.3 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.1` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.3` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.4` | @@ -77,8 +77,8 @@ The John Snow Labs 4.2.2 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.2.0` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.2` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.2` | @@ -92,8 +92,8 @@ The John Snow Labs 4.2.1 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.1.0` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.0` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.1` | @@ -108,8 +108,8 @@ The John Snow Labs 4.2.0 Library released with the following pre-installed and r |-----------------------------------------------------------------------------|------------| | [Visual NLP](https://nlp.johnsnowlabs.com/docs/en/ocr_release_notes) | `4.0.0` | | [Enterprise NLP](https://nlp.johnsnowlabs.com/docs/en/licensed_annotators) | `4.2.0` | -| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.0.0` | -| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.0.0` | +| [Finance NLP](https://nlp.johnsnowlabs.com/docs/en/financial_release_notes) | `1.X.X` | +| [Legal NLP](https://nlp.johnsnowlabs.com/docs/en/legal_release_notes) | `1.X.X` | | [NLU](https://github.com/JohnSnowLabs/nlu/releases) | `4.0.1rc4` | | [Spark-NLP-Display](https://nlp.johnsnowlabs.com/docs/en/display) | `4.1` | | [Spark-NLP](https://github.com/JohnSnowLabs/spark-nlp/releases/) | `4.2.0` | From f61381bb34abb4fa3421749f404edb82080a285b Mon Sep 17 00:00:00 2001 From: ckl Date: Tue, 21 Feb 2023 21:28:43 +0500 Subject: [PATCH 26/26] fix bug missing cols for nerconverter internal based pipes --- nlu/pipe/extractors/extractor_configs_HC.py | 2 +- nlu/pipe/utils/output_level_resolution_utils.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/nlu/pipe/extractors/extractor_configs_HC.py b/nlu/pipe/extractors/extractor_configs_HC.py index 7b3b828f..46b574ab 100644 --- a/nlu/pipe/extractors/extractor_configs_HC.py +++ b/nlu/pipe/extractors/extractor_configs_HC.py @@ -53,7 +53,7 @@ def default_NER_converter_licensed_config(output_col_prefix='entities'): output_col_prefix=output_col_prefix, get_result=True, get_meta=True, - meta_white_list=['entity', 'confidence'], # sentence, chunk + meta_white_list=['entity', 'confidence','sentence', 'chunk'], name='default_ner', description='Converts IOB-NER representation into entity representation and generates confidences for the entire entity chunk', ) diff --git a/nlu/pipe/utils/output_level_resolution_utils.py b/nlu/pipe/utils/output_level_resolution_utils.py index a7c47fd8..4347f950 100644 --- a/nlu/pipe/utils/output_level_resolution_utils.py +++ b/nlu/pipe/utils/output_level_resolution_utils.py @@ -89,9 +89,9 @@ def get_columns_at_same_level_of_pipe(pipe, df, anno_2_ex_config, get_embeddings if output_level == pipe.prediction_output_level: generated_cols = ColSubstitutionUtils.get_final_output_cols_of_component(c, df, anno_2_ex_config) for generated_col in generated_cols: - # if '_k_' in generated_col and c.jsl_anno_class_id == NLP_HC_NODE_IDS.SENTENCE_ENTITY_RESOLVER: - # # all _k_ fields of resolver may never be viewed as any common outputlevel and thus never be zipped. - # continue + if '_k_' in generated_col and c.jsl_anno_class_id == NLP_HC_NODE_IDS.SENTENCE_ENTITY_RESOLVER: + # all _k_ fields of resolver may never be viewed as any common outputlevel and thus never be zipped. + continue same_output_level_cols.append(generated_col) return list(set(same_output_level_cols))