From 9ba708762a06e53ab5d72c0bec8c2c005b298b33 Mon Sep 17 00:00:00 2001 From: Bureaux Tao Date: Wed, 8 Dec 2021 17:16:04 +0800 Subject: [PATCH] v1.1.0 stable --- __pycache__/api.cpython-37.pyc | Bin 1659 -> 1987 bytes __pycache__/give_color.cpython-37.pyc | Bin 0 -> 6395 bytes __pycache__/model.cpython-37.pyc | Bin 18324 -> 18684 bytes api.py | 12 +- give_color.py | 226 ++++++++++++++++++++++++++ model.py | 64 ++++++-- 6 files changed, 286 insertions(+), 16 deletions(-) create mode 100644 __pycache__/give_color.cpython-37.pyc create mode 100644 give_color.py diff --git a/__pycache__/api.cpython-37.pyc b/__pycache__/api.cpython-37.pyc index 1fffb8865ee29e17815a353075d3574315e0ebde..b673d274a46bd3b88af3b16dcff844f266f879af 100644 GIT binary patch delta 823 zcmZ8f&1=+95Py?Rvb#z4quJedYb%0Kb@3n`gdW603x0qWv4RkUWzD>9(`FNSd8@P} z?qNL%LYG_wduaay!Hah^zL6EhzP#7Nvkx&o5^oxnEA~xzpan8>Pn?z5b^yO zzU%!mCe=2)nOuBy6A7w*ZBTdWK&XWpof#{RP3?mQ>W6?uEWIRSaGKQKYG4_SKA`zp zK?^HWe+yxqbgGjNj#2JY-gQGiWN8g!qQpkkTh1si+%zjoNNKY zwz3E8TlyWoz^nAVvOJ2_1LKf9))PG`CZ(jD7>UWvn8bQqijCMDYl$T=#KpLr;|kZ& zjp_(dH|VqyS`hjTdot3_y4>E@T$xay&0)mH}+% z4#@F*daH1?ea3^l^nxsnMC@R3jm@Nch0o_(Vzh@Hg*Aj_O`$r9qtk$UeCJ5Z_T#I2 zV5NW5Ya>&{k4kcLTTvJ|hWyKNnOsw+`mYR=g^z$TOIj6syysXOUVvWE@A_WEothg4 zu0M>tFvuLOER0=7pZYzQV)uE-&}pCKje=95g*$`6FbFqAxzOFD17X?DY8Y@q%9*-fy#8OZcfIjXYiy;kl%se&1#Z-nNc_F2i|Ux&IlacPhV(PE;qpd z9ZEt}P=w5aJw?)!$pwWiiTuuN`boPxZ}h!qG`qOzvK(y?BK4V>F6!r2>av^6{;&D; e9H$IQ*G2Bor#Hk2lE@b7xW^^1z*3BYt^EZ&gVAaL delta 503 zcmYjNJxBvF7|nOryPns->yKI$ClM_U;vf_e5yefqCAh+n%J?rPisA3N2YX zRNS4MToqhg90a*Z1a~JF5lq^mCgg?pCEt55xr=>;qZ^TkNyK>gxOQHHooE`)J9B$0 zG>icnYbkk)TD>@Gmw-A3&qxdM32K$%Xy8Zz(7aGEgyDWYiLgU5k6pM|Q!5IOuF?Wb9V$B{ zKs@cp6j!@IPE{a{oEOB=769>rO?9y2*pQ2?vX0|J4nv;iU3Dov@vA&3m63?-Q#oew zcl9Zh66tpR06Lz-Ujl6~c~M*5mbrbSKs~!ubE_GhB}9QGCCCOJC<{q4A>r@&QF%7P z=z&|P78^7!Xl5KeLAJu0B&7}CZzFp8NF48g^*w}W}sZiVY4VO7(+c_@!8guI& lWicr)+x~g<-TFqxs!*wy>6-XkQnLgYFqrd7STWUv_5;HQa+3f6 diff --git a/__pycache__/give_color.cpython-37.pyc b/__pycache__/give_color.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fdd666bba06371bea9abc851dc66216e167c05a4 GIT binary patch literal 6395 zcmb_gYfu~472aLF7a=gl&!i4<+ysPq2psBAPo~)5SWS#mV?(a@R;&lCq*P?& zDQ^RoE#+ln2UA1{Bz7^RcKqOB|LOF1e(z-ZBVqOUY=bm$}u5>Uvo2B68^UpedT}V;iqsj7155#ZaLlzzg1vi-z_VdiZbmK@b!XLUq=y8Tnd|{=c#Qa=!BT^nCrazD9|E zIbV5vdcM}95ApL%168y=g}S$hmbAx2hpRsDTWDQYzBg%al*4oJdl%$;cM|g-JzltG zi;rG=ybw-&dPjcPTT%LIi~I4yfbH?ZAe$PGEZx7bMr1_*;8Np5Adu?$LLTT}x1%_U&xUm-~uZ#-zArX5EjJ!>Rd5vVTM#IG?&co}2=W&Sdu^`TCVA zYo)aUOC-8x6IU0JTc3oN?q7`G?^B)X?23QZ3A%}eVX!O@UX=U$z$_vrE@S&cWCh$I zE8qpJCmt=pda^sL&=Z#lo$R}n?3;td)WWHZwJk?bBs;Jw|+ z?i+}RbtZ1bQ1o51srlaTJG)sqayvD?0$?k*?pF~ymmW?j+t@d^wD{4!^lb!vNR1r1 z3vf$|SCKtzhS3O1@V-mvk8A+8h?L@t+a9l0M%P{ zL8U5SE3E(lC zfROuV<^Fk6_)yj0BsntF;{}vZVo~2sb*fofw))p1&=J`_Sny zfp&}RaORn%fTBuXoFQimQeU_upPz%ORdT!hx2jQ5R0 zaEb0qN-wKnkl3IF?Z|c+s>t}rAe>o=;fXb2EMA3!kN6GJKwu?MA>r836jjyo6wOf; zD)UB|A_HWKW@rb=3_O52f<#IyQg%FF1+p?lAjsm{{PkT-T)qig2&D;M2Jz96dV7Vf zr0TU-*_t|ASxsGKalxTCkD$k^WmUxmb#EL#PLBHGf;XL2zgngb)mGX{3K~jm<>e&> zZ`-O$SUG$pb#)vS{dANd7uFxGC7gIBah?0@V;7 zxdF8jAHEbHen|MRh^h@0++p}WGrT8=fAac-79IM6gI6wm4DdMwAK$;=uG&hS(?#jv z-Vj|&Md?$!&*?*Yp56i9i)R^80$Q_!I%gmwuRY87`W0H2M(fjPLmF*Nqv2Mo>auBc z7TCGWn+fVRiqGB#_JRlf)EFHyj4`~0&xtWG=JK2Hn8$C%V?Mtn#)POC1GlWabHI7xnss94uf~M?>Gme7-Q0xs%oN;%5czG22T0nK z?g2<2ZlV;a?LQ*rQl)nMh}4JJDjQ{jyKttMQ~7G9cEaxkM$CW87}-@`|5x3)=P<78 zncy<*Csf?$0hboaSVS{W3b{FMxWAF_No}Z16$hmQEbbyX1|KTmQFnV zl(sAxwsh_F>VECTxa>2+orD;4?JS^cpp!IFy|^cM0xC(zmxMI|nL5iQ^Qg`#E4D zq#XGm@$p|Jef`O!2kVY=+6FsU$7$e>D^XY)e(@~LU3x;lPG++aJUb9DBd0JgF+B)t z#GAp-2?L8|Feb17T%470gwxd3*Ky3-^_=dly2iS;h*>)O(zTdB`y5kE2{_uVB^dFDa#s~C1V{>iM|xu5`6A;6gja%4tc z{4g;Gclmj^1tqTaE~43!<2?f`Z_63M4Wrm`$m{Wg zjXm$9V z?+KjA6L1Tnqs8IkOuW~L&H6ZlFW`1N#178V;&S+W&eP5o5cfhDUjG>gl79C~O56<_ z^`x-uq)!liWd{SI;0OfE-f;TM(ElAZZ`;dS!9a71*X0#U+d3putKcUy_;-`?eFG0l ztEDZpnKsfDbSa%n>*>989?bQ0IlZ0H0-eA7ftdx~h?7rSjLJx}u<|lIw=x!Z=Ka72 zq3(wDoq)iuAYi2QwR9RR5I(|V@@epd*_lo=X7EyZYZ!X@E$)GsBx7^4+u`&yHwW@z z3ODi9#6n_8Gie&9n~7BD$MmmGCYiP~o$2&VCYecCRyv&_|2ETUd(L?)4_0la zWqrSU&$;)WbMCq4+z+pevVV>-$L@>_n*e{Cx^H+(M#dcZY<%qDBkao9aKqTgosQ3; z$tQT2EO&79))`$)>Q-&0y3KtO3`YqCZ@>iR2;ucalfuO`2uf6q__p3DHT5 zY?9NbL@3R&ol1+GL8Vo8P??r&cVau31hefHbrJuE1d)7Y1$;!1(ulATrW4vj8Iu|4 zg(-H#6fs8dGe<1QRZ0v+QAgMuPRkR(6ld5HwjDEEW_%uN#B&AAP!}W@NN~suT19?1 zlsRcfdJ31yuIU2WF1wD2(B1&;Sz5cCSs=(+c|s%|>2SI%oD&OBS32}rgS;pSv4w@n zY#_mr&1;m)M`D@pOrDTd-BXo@pzUlxr^4sM{)(=-}6uH@+7$)HEd zK@ODGK-5fKa#nf?8ge5TjCtTIW3oj={{b(bS_-fQgyh14<;c0Tw0UwqEopA3u)C zrSfpb6buJW{ykLZ-$V5;NOeApC|IRh<3t5g?TomRs*@eVE>itqQuWuQ8e9&Rr_RpE z9i$>}#k}%JYGx!WDK#&gMe^3k0_+wAt*WqhzzI9bVsz;A!rMa&H(!q5{4g=Av=5kp z8^8X}{H<5C>WxvX+LyVB_eYi))RtrzpvThOwQpGYH|)`GSmOXPz8v{Uvb;{^(%gh5 z>fA^3v#%|jJr`H1&5yG6O3+-^VD$%%`*^=kR`WZ8fsUSmet$3^abI7Lx5Fn(F9f-) z=5+c4GW=W3j*XhX5ZNXrn6|a)x1d&FX8eg}(F&ziOj1y{-TjGo@nXMBJ7CBw0XaMq zp$Ncj;Ty1Cp_F8-eQ*<22`ZtcW=UPXkmL)5{Gk)l3;xhi>EPAaa~W1Ks}`G$Z7rVW zcFu56oigZrptKRI>kuA7*ov?XVLL*;a?@F3bwSl_=Npu-o!PlNklz5H8hX8h9ut7% zSCv9nX+erDR&46`pY;7kdD8U{9~ofSbFhWO*#PPh(g55BPDYS^w8U+q396Q(-s3*( zzpT<@0a6MLhO`;$)3)HOq3v(Vjm$5isEHpy(3O}{l<<6LSH-^eq&APaubm{f;<#mv zsfx^~sIUFs(5b%=Kww7rWivahE!JG3gT)+c*0T(nu4#Ys;pY9|>Ydqp({)$pD`VL? z735)>H9DBqmKS4<)_X0~R71ZngzK&RDZ64jI$g8OjkS#kDK1}w=E?rfP9Mh@@P;66 zT}-LZx!ytcSX){T?`mr~*h-$EL|7RAfXevgX}733i59`AMcH1|qH9jkXGeXIEM82I z3Z*gkc&oO|&8^Lv^obFze0_42bb}`SzJk%uAfxWpyua+#W0C?$ch`-Uce%>H4HpI|i@h4R}Mr-V=O>a9_UgguZRge95i_ut4zO?EV^XHLEf$viqO3TY- zq*F}B^-h{B1y99JmHvyF$fe5ZvNBeuc-L)LJ}cXIAVq&Vin1?jHS1bEmX6>+ASCtk z4s7-zkPRyoD}CjK?A_SQ<+H4aJmkk-RscE|7EXV(F!T=On0H;vv$|qEyJ&4z=p-$w zi4?15ZLhpbDM(ix7~R3pQ6HB=C;EJ!#w_cDq661QTZ+rWyhcf{s8Bw5IJ;F32uvT| zj6i!fB{%Lid?!K^f(Kz2!fu2;0PduP$B?l@$=tB!UhyIY26~_O@!PS-Hk=Y!K>78? z{S0l`%!10!iq=C4()@!;AOYXNdqO8UN}C1x>Jy2)uQ zM6dAgAOsMC2)IPNUwOQGCkrVf)phNw%~BoGQEx!*@xdVx=<4xlhmXD?>ONcTDb2V0 zK)BlhTcfL{);xfkjw_GXG;YV}@uc-Fr(Pe@R&P%a9Yv`DorX)?C&5Wo8T(buR<^4e zC2c{#Stkz%egcJ9V0Xd2MiqPbz2b!rLa$+^zRte`O^3s!mA?QL&EAt(`#yl1Y2lyZ zRqbSHeMR|e-C!{t@Tnc}!qN6!ax6^oJ(Z-pBp0OPrAUxKI8>iR^f$p5o-&#yM7wlY)O# zG8)UH3?$;85k50~=*Ip}0J?+-gAXp+-SBKZCUSZ3A*i!G!n4H@Lzqp9VS|jX7I?zK zYsNSMF99a}u<$8ia1i<#lKsT{^xOTE5I8jW5Z?3ebiJR*9uT=w_5DO%c}jqHGa8If z5PXE+}bTbwQHB% zE-n6@D=x*$hi__T;pvvVi2hjw2V+XmZD}1`eeJ9mzO|xO7PFJigWTIwr4Lc68XGpy z>S{LymG#^+<<^7HuVR-QTMX<_OnvMu1Mh;_#T@?wgP%q~Df|pV6oHb4GJ=vuk9kT9 zJxeG-D7o~!(o>2ujIu;eAIg`_dcsh4t<0Jg2>_O;R-A5ke=v|xT)Pjm5~XYR`e+r} zNT(RtsN0j0wFTHu*R4+@C2I$<9~za-fEO|?p}iTVSQG%yT3Y~?jy4V|8!8H&$LFV2qMesLl(JDiw3 zzchETrfS>9YWnIsdcPVvlQ?~2adsFgOLG@$V=H@-CY z#+O4A@sUfwk6(TT@#b_Ci_sY3tsi|k^k)3c^VLeUtgHKsgYoF;_Ait==l81t;N{2 z#7iF~W?#I0_8KskqH`A)-y5$4Iq?fG#xK4Gec=_-5U1y8eJ{?>_N|k+dk%}^AHtOe z98!758}Uo8FJ65se(qA@wfDf4pbDPI3)i9(8(M0sYila&syA52MBw&>)c8YEC8v_0Y9vK6Srt?9bzrMXL+tJmKdw5P5{@77jR4b683HSgQ|Bv8qo zhwAI1K*ev2EuJ4m9?Z7fb~3Xv_0R26#b7_(cT|fnaNN&>0iFk8LXR+Bj&OPVc-#PbQ`=34R2i?rR$!4<%@OR~lTdtbpJ@#zY-?MNJ>+LzQ+Tymk6MK{U zgyXDdu+jc|uyPAdCJRncE>}v~uk&?myvD4XbMmJ{e{krU}@jp}WvC$B=2*c<#V zE<{S!Kxia15t<1T{FYt|rrF2#7~1vi_-|}CMWv!DRsN_;2_^=NfrKmplClO&0m}j1 zdBzvxh-5ae5ypaK17C?UBkfhcy*B~h`;eLhH7dL($o2yw%svMCBvmgb%@E||ETKIS z-vf!V&?U~mSZ1(EMp=-YK#1NHcr{JDHNi5-*&P|=k{NW?X!t)x-CO$@x^K6lE?}K> zZG?9qgl2z3vr%HB*&?^dso)R(n_x+j!5cJ^Nop)#ph#=i1EvFO`dH3DmO+|K)PR#T zD0-TlPDRd;GpV>~{;a0#rWw66`veASZ4%Clyu&{Wt>HgC3mTIN{+!+%lmt}~6hv&d zwc9~FTQdyU$>AK3pp!?yQf|Q32h%~4F-_=1izb4qAc5)>$OQhRbVbks1A zOrhseXdPckp_4H5Ga+=mjzXlztSg6&Bi(U}HY%P#TT4 zT~AqFn-N|k{Wpdmo_osHsc(0>>1}PBby7Ea>kP=+VBZRl&-_SLkl7SPKN*Yo{!@KWu1M_ zdV|$dHju1^*f=U-7KaqLAAc7(pgc<8BSWNe2_dhcNGrj zA|lz?tabtTuMi=_w&01h3eBq%;+;xNzx!=^^pAvfAjhIE?XRq`M9t1H%) zZNgQ9?sMh0sb2*#60bzif*9h0@C?w0#g^J=G^eqpmOQ_R^Clz42Qp%ymfB%3YQ?e$ zOb?%QW`%0uC|R_#(313gX2T?$hV2z~72APoSH{+tG^#PSGfDO|G`Km|%H{X?yei|w z0uoNO<}+|a^`8Z!u&&kZ$NDSZW-Q9ZBB+@zz|lg4m=Y*!Gqc6N2})gNe?28*uB@ut zSW{VDMYK>aj$FJ=&&c`f4pC)@DxgbtJW++8a)tyq`PG08+E3)lV!qjodGR zB$flrKNBD~v~I=)F&onhn>JQ$tgYU$OWg)xRte?#%d9L`sTgu zt;+rD>a#nfw)1Of^L>O}2u|gj+~W1m&lr>C#GF~nnD0g@HTmnx?zwq+d+|LkWh`$r zWyx0``e^RI*h00BYF^p7aYyye8g7PZVMBH8wu)EjXdLOhH_~wf`21yF$BwwX5-|jx zm})jgEgPq)-q+^!ORanls$WN-++q?^dgjk$=R%*%A7HbHITu=C{P@7Dl!5%@y;^Xp zAk~uU7892ug$)$kX;jb5X97cnupJxS=Wld#$$zB9{b{IRflst!?bPy|Kf#NY#fujy zzbQx$YRy8Y>L$#S&TiV&xbyi72pbS;5Y{2AN7xA9h-O%i0;FMr9#@z(g_$?LOxRhH zx9#9QH~%#ggiyWXZIQW^uNG}*m{b{SP+W_vUVar_+xYj;D^XI8qyHx{j!T)$PWkuZ z`Ez0l1UmIVXo)8CXBOH}l%$`DH1X94ZiEH|tQ&7qJS7|00p(`Nvf8O>h3!(K%PTj# z;r8(EZ+5G<64fw{#HrL#hI|V+ci7>KEGaEDHe;lNil=n#D&jJsWpbbH2bI(8YHp@G zDxTH^q_stYD=aniW$6mGu?RgaL%>x>Zw=mpPE2s{;4$PBoB4DN#C>4pQR>P(Yq0)s z>r`a$XT6Q>xZvJ?K29H;+dGYYa=gJMiIp}QzLK*_` zm5QSjgk*#)gd~J*2rnV*K&VD|83EJb62cn@`w(OVKY|B=7VsvHS^*|e}7q)F=OIo;`M+!*&&u@rKw9{g1%ZO_TY$(tLwfBng| z)9@`la^=GK;HBk-<%MPS2ge7`4nOD^esp8(Mkfr$x*iS>Da#6%6_%22wDZoBffJF_ zCnMeW&~)g7;Rg@LP8=IMc5|$+WArC|Uw0g{fal7{*@vs=E{k;E432(yH}dGj(&Eyh zl45W&VW3$|7?j5uOlzSzsGAI-Iape}GHTEr!s)QCASR(&loUDM7ztMIkS3y+B|z&xw_5x>)PTl~YeH-Ua%>aS=FHO15PNQ^KOJmA;~cO>XZY z4~HKr>9}w4CgZsXIS9C8`P%?a(^j~S;NEsxHv7Ew&29MWAguRsSM#)IWAqS!+3`o! Y+Jin>`Ng(^wAaj5y+JQpn0fN^A7WUDPXGV_ diff --git a/api.py b/api.py index 2e974dc..eafaa29 100644 --- a/api.py +++ b/api.py @@ -3,7 +3,7 @@ import copy import requests import uuid from flask import Flask, request, redirect, url_for, render_template, flash, jsonify, Blueprint - +from give_color import get_color from model import Oral oral_api = Blueprint('oral', __name__) @@ -38,7 +38,15 @@ def recognize(): print('' if verbose == 0 else 'verbose out:') oral = Oral(finding, conclusion, verbose = False if verbose == 0 else 1) data = oral.get_json() - return jsonify({'success': True, 'description': {'data': data}}), 200 + finding_list, conclusion_list, findind_replaced_word, conclusion_replaced_word, ImmunohistochemistryContent, MolecularResultsContent = oral.get_entity() + color_finding = get_color(finding, finding_list, findind_replaced_word, ImmunohistochemistryContent, + MolecularResultsContent) + color_conclusion = get_color(conclusion, conclusion_list, conclusion_replaced_word, + ImmunohistochemistryContent, MolecularResultsContent) + return jsonify({'success': True, + 'description': {'entity': data, + 'color': {'finding': color_finding, + 'conclusion': color_conclusion}}}), 200 except Exception as e: print("/n******ERROR SRART******/n") print(e) diff --git a/give_color.py b/give_color.py new file mode 100644 index 0000000..2c20808 --- /dev/null +++ b/give_color.py @@ -0,0 +1,226 @@ +## +from model import Oral +import re + +## +Finding = """ +左IV区淋巴结:1枚,直径2.5cm(1) +颏下:1枚,直径2cm(1) +左颊:部分上、下颌骨及颊部组织12*9*8cm,黏膜切面见一肿块6*3*2cm,灰白,界不清(1) +送检切缘:前内、前外、上内、上外、颊、翼内肌、翼外肌、腮腺、鼻底、鼻旁、鼻腔、软腭、舌根、颏突,均0.5cm +送检切缘:腮腺2,0.5cm +左颈大块:9*6*4cm,为肌肉、脂肪、血管,灰黄。 +右颈大块:10*8*4cm,一侧见一腺体4*3*2cm,灰黄分叶,余为脂肪血管。 +左I区: 1只直径1cm。 +左II区: 2只直径0.5-1cm。 +左III区: 4只直径0.8-1.3cm。 +左IV区: 3只直径1.2-1.8cm。 +左V区: 1只直径1cm。 +右I区: 3只直径1-3.5cm。 +右II区: 3只直径0.8-2cm。 +右III区: 4只直径0.5-1cm。 +右IV区: 4只直径0.5-1.2cm。 +右V区: 2只直径0.5-0.8cm。 +""" +Conclusion = """ +“左颊”黏膜鳞状细胞癌,高-中分化,DOI>10mm +送检切缘:“腮腺”阳性(+)、“前内、前外、上内、上外、颊、翼内肌、翼外肌、鼻底、鼻旁、鼻腔、软腭、舌根、颏突、腮腺2”均阴性(-) +冰冻送检:“颏下淋巴结”1只内见鳞状细胞癌转移(+),侵犯至包膜外,“左IV区淋巴结”1只为软组织,伴出血 +“左颈大块”为软组织、“右颌下腺”轻度慢性炎 +送检淋巴结:“右I”1/3只有肿瘤转移(+),余及“左”“I”1只,“II”2只,“III”4只,“IV”3只,“V”1只,“右”“II”3只,“III”4只,“IV”4只,“V”2只均阴性(-) +免疫组化结果NI21-695 +AE1/AE3+ CKH+ CK5/6+ EGFR部分+ Ki67部分+ CD31- S-100- P16- +北院分子结果(NM2021-0316):EGFR扩增探针 FISH(未见明显扩增(-)) +""" + +oral = Oral(Finding, Conclusion, verbose = False) + + +## +def get_color(text, entity_list, replaced_word, ImmunohistochemistryContent, MolecularResultsContent): + # print('replaced_word:', replaced_word) + # print(ImmunohistochemistryContent) + # print(MolecularResultsContent) + synonyms = [] + for item in entity_list: + if item['tag'] == 'ANATOMY': + words_anatomy = item['words'] + if item['words'] == 'I' or item['words'] == 'II' or item['words'] == 'III' or item['words'] == 'IV' or item[ + 'words'] == 'VI' or item['words'] == 'V' or item['words'] == '右' or item['words'] == '左': + words_anatomy = "“" + item['words'] + "”" + for i in re.finditer( + words_anatomy.replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + synonyms.append(i.span()) + if item['tag'] == 'OTHER': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + synonyms.append(i.span()) + + negative = [] + for i in re.finditer('无', text): + negative.append(i.span()) + for i in re.finditer('未见', text): + negative.append(i.span()) + for i in re.finditer('未发生', text): + negative.append(i.span()) + + numeracal = [] + for item in entity_list: + if item['tag'] == 'NUMBER': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + numeracal.append(i.span()) + if item['tag'] == 'SIZE': + # if item['words']=='12*9*8cm': + # print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") + # print(text) + # for i in re.finditer(item['words'], text): + # print(i) + # print("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^") + + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + numeracal.append(i.span()) + if item['tag'] == 'DOI': + if replaced_word == '': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), + text): + numeracal.append(i.span()) + else: + if item['words'] not in text: + if replaced_word == '大于': + doi_words = item['words'].replace(">", "大于") + elif replaced_word == '小于': + doi_words = item['words'].replace("<", "小于") + elif replaced_word == '大于等于': + doi_words = item['words'].replace("≥", "大于等于") + elif replaced_word == '小于等于': + doi_words = item['words'].replace("≤", "小于等于") + elif replaced_word == '>': + doi_words = item['words'].replace(">", ">") + elif replaced_word == '小于': + doi_words = item['words'].replace("<", "<") + for i in re.finditer( + doi_words.replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), + text): + numeracal.append(i.span()) + + summary = [] + for item in entity_list: + if item['tag'] == 'ENE': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + summary.append(i.span()) + if item['tag'] == 'PN': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + summary.append(i.span()) + + classification = [] + for item in entity_list: + if item['tag'] == 'LEVEL': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + classification.append(i.span()) + + other = [] + for item in entity_list: + if item['tag'] == 'SQUAMOUS': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + other.append(i.span()) + if item['tag'] == 'INVASION': + for i in re.finditer( + item['words'].replace('*', '\*').replace('(', '\(').replace(')', '\)').replace('+', '\+'), text): + other.append(i.span()) + if ImmunohistochemistryContent != '': + for i in re.split('。| |\n', ImmunohistochemistryContent): + # print(i) + if i == "" or i == "\n": + continue + for j in re.finditer(i, text): + # print(j) + other.append(j.span()) + if MolecularResultsContent != '': + for i in re.split('。| |\n', MolecularResultsContent): + # print(i) + if i == "" or i == "\n": + continue + for j in re.finditer(i, text): + # print(j) + other.append(j.span()) + + synonyms = list(set(synonyms)) + negative = list(set(negative)) + numeracal = list(set(numeracal)) + summary = list(set(summary)) + classification = list(set(classification)) + other = list(set(other)) + + return { + '医学术语解析': other, + '同义词判断': synonyms, + '识别否定修饰词及其修饰对象': negative, + '数值解析': numeracal, + '对可归纳总结的信息进行解析后归纳判断': summary, + '对定义明确的分类变量进行赋值': classification + } + + +## +if __name__ == '__main__': + + finding_list, conclusion_list, findind_replaced_word, conclusion_replaced_word, ImmunohistochemistryContent, MolecularResultsContent = oral.get_entity() + + for i in finding_list: + print(i) + r1 = get_color(Finding, finding_list, findind_replaced_word, ImmunohistochemistryContent, MolecularResultsContent) + print("\n医学术语解析:") + for i in r1['医学术语解析']: + print(Finding[i[0]: i[1]], i[0], i[1]) + print("\n同义词判断:") + for i in r1['同义词判断']: + print(Finding[i[0]: i[1]], i[0], i[1]) + print("\n识别否定修饰词及其修饰对象:") + for i in r1['识别否定修饰词及其修饰对象']: + print(Finding[i[0]: i[1]], i[0], i[1]) + print("\n数值解析:") + for i in r1['数值解析']: + print(Finding[i[0]: i[1]], i[0], i[1]) + print("\n对可归纳总结的信息进行解析后归纳判断:") + for i in r1['对可归纳总结的信息进行解析后归纳判断']: + print(Finding[i[0]: i[1]], i[0], i[1]) + print("\n对定义明确的分类变量进行赋值:") + for i in r1['对定义明确的分类变量进行赋值']: + print(Finding[i[0]: i[1]], i[0], i[1]) + + print("\n*****************************************\n") + + for i in conclusion_list: + print(i) + r2 = get_color(Conclusion, conclusion_list, conclusion_replaced_word, ImmunohistochemistryContent, + MolecularResultsContent) + print("\n医学术语解析:") + for i in r2['医学术语解析']: + print(Conclusion[i[0]: i[1]], i[0], i[1]) + print("\n同义词判断:") + for i in r2['同义词判断']: + print(Conclusion[i[0]: i[1]], i[0], i[1], ) + print("\n识别否定修饰词及其修饰对象:") + for i in r2['识别否定修饰词及其修饰对象']: + print(Conclusion[i[0]: i[1]], i[0], i[1]) + print("\n数值解析:") + for i in r2['数值解析']: + print(Conclusion[i[0]: i[1]], i[0], i[1]) + print("\n对可归纳总结的信息进行解析后归纳判断:") + for i in r2['对可归纳总结的信息进行解析后归纳判断']: + print(Conclusion[i[0]: i[1]], i[0], i[1]) + print("\n对定义明确的分类变量进行赋值:") + for i in r2['对定义明确的分类变量进行赋值']: + print(Conclusion[i[0]: i[1]], i[0], i[1]) + +# ## +# print(Conclusion[235:236]) +# print(Conclusion[179:180]) +# print(Conclusion[161:162]) diff --git a/model.py b/model.py index f3ff0c7..cb8f6ce 100644 --- a/model.py +++ b/model.py @@ -17,12 +17,39 @@ class Oral: self._Conclusion = '' self._Finding = '' + self.inversed = False + if '送检淋巴结' in ImagingConclusion: self._Conclusion = ImagingConclusion self._Finding = ImagingFindings else: self._Conclusion = ImagingFindings self._Finding = ImagingConclusion + self.inversed = True + + self.conclusion_replaced_word = '' + self.findind_replaced_word = '' + if "大于" in self._Conclusion: + self.conclusion_replaced_word = "大于" + if "小于" in self._Conclusion: + self.conclusion_replaced_word = "小于" + if "大于等于" in self._Conclusion: + self.conclusion_replaced_word = "大于等于" + if "小于等于" in self._Conclusion: + self.conclusion_replaced_word = "小于等于" + if ">" in self._Conclusion: + self.conclusion_replaced_word = ">" + + if "大于" in self._Finding: + self.findind_replaced_word = "大于" + if "小于" in self._Finding: + self.findind_replaced_word = "小于" + if "大于等于" in self._Finding: + self.findind_replaced_word = "大于等于" + if "小于等于" in self._Finding: + self.findind_replaced_word = "小于等于" + if ">" in self._Finding: + self.findind_replaced_word = ">" self._Conclusion = self._Conclusion.strip('"').strip() \ .replace("大于", ">").replace("小于", "<").replace("大于等于", "≥").replace("小于等于", "≤").replace(">", ">").replace( @@ -694,6 +721,21 @@ class Oral: for i in self._y_pre_o: print(i) + def get_entity(self): + finding_list = [] + conclusion_list = [] + if self.inversed == True: + for i in self._y_pre: + finding_list.append({'tag': i[0], 'words': i[1]}) + for i in self._y_pre_o: + conclusion_list.append({'tag': i[0], 'words': i[1]}) + else: + for i in self._y_pre_o: + finding_list.append({'tag': i[0], 'words': i[1]}) + for i in self._y_pre: + conclusion_list.append({'tag': i[0], 'words': i[1]}) + return finding_list, conclusion_list, self.findind_replaced_word, self.conclusion_replaced_word, self.ImmunohistochemistryContent, self.MolecularResultsContent + def print_list_item(self, l): for i in l: print(i) @@ -735,21 +777,15 @@ class Oral: ## if __name__ == '__main__': Finding = """ -" 左颈大块:6*5*4cm,一侧见一腺体3*3*2cm,灰黄分叶,余为脂肪血管。 -左I区: 3只直径0.2-1.2cm。 -左II区: 3只直径0.5-1.2cm。 -左III区: 3只直径0.5-1cm。 -左IV区: 3只直径0.5-0.8cm。 -右I区:3只直径1-2cm。 -右II区: 3只直径1cm。 -右III区: 3只直径0.5-0.8cm。 -右IV区: 3只直径0.5-0.6cm。 -右颈淋巴:7*7*6cm,內见一腺体3*3*2cm,灰黄分叶,余为脂肪血管。" +"1、一带黏膜组织,1.8*0.8*0.5cm。灰黄。(2全)。 + +2、送检切缘:“前、后、左、右、底”均0.5cm。" """ Conclusion = """ -"“左颌下腺”慢性涎腺炎 -“右颌下腺”慢性涎腺炎 -送检淋巴结:“左”“I区”1/3只、“II区”1/3只、“III区”1/3只(肿瘤位于软组织内)及“右”“I区”2/3只(其中1只肿瘤侵犯至包膜外)、“II区”2/3只(肿瘤侵犯至包膜外)有肿瘤转移(+),余及“左IV区”3只、“右”“III区”3只、“IV区”3只均阴性(-)" +"“右口底”黏膜上皮中-重度异常增生及瘤样增生,癌变为鳞状细胞癌,高-中分化,DOI:小于5mm。 +送检切缘:“前、后、左、右、底”均阴性(-)。 + +南院免疫组化结果(I2021-3047):CKH(+),CK5/6(+),P16(-),Ki67(约30-40%+),CD31(-),S100(-),EGFR(+),P53(少量+)。" """ oral = Oral(Finding, Conclusion) @@ -758,4 +794,4 @@ if __name__ == '__main__': oral.print_y_pred_o() print("-----------------") oral.get_Info() - print(oral.get_json()) + # print(oral.get_json()) -- 2.22.0