Home   Package List   Routine Alphabetical List   Global Alphabetical List   FileMan Files List   FileMan Sub-Files List   Package Component Lists   Package-Namespace Mapping  
Routine: ICDTOKN

ICDTOKN.m

Go to the documentation of this file.
  1. ICDTOKN ;DLS/DEK - Parse Text ;04/21/2014
  1. ;;18.0;DRG Grouper;**57**;Oct 20, 2000;Build 1
  1. ;
  1. ; Global Variables
  1. ; None
  1. ;
  1. ; External References
  1. ; $$UP^XLFSTR ICR 10104
  1. ;
  1. Q
  1. TOK(X) ; Parse Text into Tokens in array PARS()
  1. K PARS D PAR($G(X),.PARS,1)
  1. Q
  1. TOKEN(X,ROOT,SYS,ARY) ; Parse Text into Tokens
  1. ;
  1. ; Input
  1. ;
  1. ; X Text (Required)
  1. ;
  1. ; ROOT Global Root/File # (Required)
  1. ;
  1. ; ^ICD9( or 80
  1. ; ^ICD0( or 80.1
  1. ;
  1. ; SYS Coding System (Required)
  1. ;
  1. ; 1 or ICD or ICD-9-CM
  1. ; 2 or ICP or ICD-9 Proc
  1. ; 30 or 10D or ICD-10-CM
  1. ; 31 or 10P or ICD-10-PCS
  1. ;
  1. ; .ARY Output array passed by reference (Required)
  1. ;
  1. ; This is an array of words parsed from the input
  1. ; string X arranged by frequency of use
  1. ;
  1. ; ARY(0)=# of words
  1. ; ARY(#)=word
  1. ;
  1. ; The least frequently used word will be ARY(1)
  1. ; and the most frequently used word will be
  1. ; ARY($O(ARY(" "),-1)). words not found in
  1. ; the file and coding system will not appear in
  1. ; the parsed array.
  1. ;
  1. ; D TOKEN^ICDTOKN($G(X),$G(ROOT),$G(SYS),.ARY) is called
  1. ; TOKEN^ICDEX to parse words in use order
  1. ;
  1. N TMP,ORD,NUM,IEN,USAGE,ABBR,TOKEN K ARY,TMP,ORD S ROOT=$$ROOT^ICDEX($G(ROOT)),SYS=$$SYS^ICDEX($G(SYS)) D PAR($G(X),.TMP)
  1. K ORD S IEN=0 F S IEN=$O(TMP(IEN)) Q:+IEN'>0 D
  1. . N NUM,SEG S SEG=$G(TMP(IEN)) Q:$L(SEG)'>1
  1. . S USAGE=$$CT(SEG,ROOT,SYS),ABBR=+($P(USAGE,"^",2)),USAGE=+USAGE
  1. . S NUM=$O(ORD(+USAGE," "),-1)+1
  1. . S ORD(+USAGE,NUM)=SEG
  1. . S:ABBR>0 ORD(+USAGE,NUM,"A")=1
  1. K ARY S USAGE="" F S USAGE=$O(ORD(USAGE)) Q:'$L(USAGE) D
  1. . N NUM S NUM=0 F S NUM=$O(ORD(USAGE,NUM)) Q:+NUM'>0 D
  1. . . N SEG,INC S SEG=$G(ORD(USAGE,NUM)) Q:'$L(SEG)
  1. . . S INC=$O(ARY(" "),-1)+1,ARY(INC)=SEG
  1. . . S:+($G(ORD(+USAGE,NUM,"A")))>0 ARY(INC,"A")=1
  1. K TMP,ORD S IEN=0 F S IEN=$O(ARY(IEN)) Q:+IEN'>0 S ARY(0)=$G(ARY(0))+1
  1. Q
  1. CT(SEG,ROOT,SYS) ; Count Usage
  1. S SEG=$G(SEG) Q:'$L(SEG) 0 S ROOT=$G(ROOT) Q:'$L(ROOT) 0 S SYS=+($G(SYS))
  1. N EROOT,IEN,CNT,ABR S (ABR,CNT)=0
  1. S EROOT=ROOT_"""D""," S:+SYS>0&($D(@(ROOT_"""AD"","_+SYS_")"))) EROOT=ROOT_"""AD"","_+SYS_","
  1. I $D(@(EROOT_""""_SEG_""")")) D
  1. . N IEN S IEN=0 F S IEN=$O(@(EROOT_""""_SEG_""","_+IEN_")")) Q:+IEN'>0 D
  1. . . S CNT=CNT+1 N EFF S EFF="" F S EFF=$O(@(EROOT_""""_SEG_""","_+IEN_","""_EFF_""")")) Q:'$L(EFF)!(EFF'?7N) D
  1. . . . N TIEN S TIEN=0 F S TIEN=$O(@(EROOT_""""_SEG_""","_+IEN_","""_EFF_""","_+TIEN_")")) Q:+TIEN'>0 D
  1. . . . . S:$O(@(EROOT_""""_SEG_""","_+IEN_","""_EFF_""","_+TIEN_",0)"))>0 ABR=ABR+1
  1. I '$D(@(EROOT_""""_SEG_""")")) D
  1. . N ORD,IEN S ORD=$E(SEG,1,($L(SEG)-1))_$C(($A($E(SEG,$L(SEG)))-1))_"~"
  1. . F S ORD=$O(@(EROOT_""""_ORD_""")")) Q:$E(ORD,1,$L(SEG))'=SEG D
  1. . . S IEN=0 F S IEN=$O(@(EROOT_""""_ORD_""","_+IEN_")")) Q:+IEN'>0 D
  1. . . . S CNT=CNT+1 N EFF S EFF="" F S EFF=$O(@(EROOT_""""_SEG_""","""_EFF_""")")) Q:'$L(EFF)!(EFF'?7N) D
  1. . . . . N TIEN S TIEN=0 F S TIEN=$O(@(EROOT_""""_SEG_""","""_EFF_""","_+TIEN_")")) Q:+TIEN'>0 D
  1. . . . . . S:$O(@(EROOT_""""_SEG_""","_+IEN_","""_EFF_""","_+TIEN_",0)"))>0 ABR=ABR+1
  1. S ABR=$S(CNT>0&(CNT=ABR):1,1:0) S CNT=CNT_"^"_ABR
  1. Q CNT
  1. PAR(X,ARY,FLG) ; Parse
  1. ;
  1. ; Called by ICDIDX for indexing words
  1. ; D PAR^ICDTOKN($G(X),.ARY,0)
  1. ;
  1. ; Called by ICDEXLK3 for lookup of words
  1. ; D PAR^ICDTOKN($G(X),.PARS,1)
  1. ;
  1. N BEG,END,CHR,I,NUM,TXT,PIE S TXT=$$UP^XLFSTR(X),TXT=$$SWAP(TXT)
  1. K ARY S BEG=1 F END=1:1:$L(TXT)+1 D
  1. . S CHR=$E(TXT,END) I "~!@#$%&*()_+`-=[]{};'\:|,./?<> """[CHR D
  1. . . S PIE=$E(TXT,BEG,END-1),BEG=END+1
  1. . . I $L(PIE)>1,$L(PIE)<31,$$EXC(PIE) D
  1. . . . Q:$D(ARY("B",PIE)) N I,NUM S NUM=(246-$L(PIE))
  1. . . . I +($G(FLG))'>0 S I=$O(ARY(" "),-1)+1,ARY(I)=PIE,ARY("B",PIE)="" Q
  1. . . . S I=$O(ARY(+($G(NUM))," "),-1)+1,ARY(+($G(NUM)),I)=PIE,ARY("B",PIE)=""
  1. K ARY("B") S NUM=0 F S NUM=$O(ARY(NUM)) Q:+NUM'>0 D
  1. . I +($G(FLG))'>0 S ARY(0)=$G(ARY(0))+1 Q
  1. . N I S I=0 F S I=$O(ARY(NUM,I)) Q:+I'>0 S ARY(0)=$G(ARY(0))+1
  1. Q
  1. EXC(X) ; Exclusions
  1. Q:$L($G(X))'>1 0
  1. Q:"^ABOUT^AFTER^ALMOST^ALSO^ALTHOUGH^AND^ANOTHER^"[("^"_$G(X)_"^") 0
  1. Q:"^ANY^ARE^AREA^AREAS^AT^BE^BEEN^BEFORE^BEST^BUT^"[("^"_$G(X)_"^") 0
  1. Q:"^BY^CAN^COULD^DONE^EACH^EVEN^FAR^FOR^FORM^FORMS^"[("^"_$G(X)_"^") 0
  1. Q:"^FROM^GIVEN^HAD^HAVE^HER^HERE^HERSELF^HIM^"[("^"_$G(X)_"^") 0
  1. Q:"^HIMSELF^HIS^HOW^IN^INTO^IS^IT^IT'S^ITS^ITS'^"[("^"_$G(X)_"^") 0
  1. Q:"^ITSELF^KIND^LIKE^LOST^MANY^MAY^MERE^MORE^MOST^"[("^"_$G(X)_"^") 0
  1. Q:"^MUST^NEW^NOTE^NOW^OF^OFTEN^ON^ONESELF^ONLY^"[("^"_$G(X)_"^") 0
  1. Q:"^OR^OUR^OURS^OUT^OWN^PUT^SAME^SET^SHOULD^SOME^"[("^"_$G(X)_"^") 0
  1. Q:"^SUCH^STATED^SURE^THAN^THAT^THE^THEN^THERE^THEREBY^"[("^"_$G(X)_"^") 0
  1. Q:"^THESE^THEY^THIS^THUS^TO^TOO^UPON^WAS^"[("^"_$G(X)_"^") 0
  1. Q:"^WHAT^WHEN^WHERE^WHICH^WHO^WHOSE^WITHIN^"[("^"_$G(X)_"^") 0
  1. Q:"^WOULD^"[("^"_$G(X)_"^") 0
  1. Q 1
  1. ;
  1. SWAP(X) ; Special Case Word Swap
  1. ;
  1. ; This sub-routine swaps one word for another
  1. ; This swap must apply to both Lookup and Indexing
  1. ; This swap only applies to uppercase text
  1. ; These words cannot be Replacement Words in file 757.05
  1. ;
  1. N TXT S (X,TXT)=$G(X) Q:'$L(TXT) X
  1. S (X,TXT)=$$UP^XLFSTR(X) N SEG
  1. F SEG="X-RAY","X RAY" D
  1. . I TXT[SEG S TXT=$$SW(TXT,SEG,"XRAY")
  1. F SEG="E.COLI","E COLI","E. COLI" D
  1. . I TXT[SEG S TXT=$$SW(TXT,SEG,"ECOLI")
  1. S X=$G(TXT)
  1. Q X
  1. SW(X,SEG1,SEG2) ; Swap text SEG1 for SEG2 in X
  1. ;
  1. ; Input
  1. ;
  1. ; X Text string
  1. ; SEG1 Word to remove in string (replace)
  1. ; SEG2 Word to insert in string (with)
  1. ;
  1. ; Output
  1. ;
  1. ; X Text string without SEG1
  1. ;
  1. N TXT,NOT,CHR,LEAD,TRAIL S (X,TXT)=$G(X) Q:'$L(TXT) X S SEG1=$G(SEG1)
  1. Q:'$L(SEG1) X S SEG2=$G(SEG2) Q:'$L(SEG2) X Q:TXT'[SEG1 X
  1. S NOT="~!@#$%^&*()_+`{}|[]\:;'<>?,./" I TXT=SEG1 S X=SEG2 Q X
  1. I $E(TXT,1,$L(SEG1))=SEG1 D
  1. . N CHR S CHR=$E(TXT,($L(SEG1)+1)) Q:CHR'=" "
  1. . S TXT=SEG2_$E(TXT,($L(SEG1)+1),$L(TXT))
  1. F LEAD=" ","-","(","<","{","[","," D
  1. . N REP,WIT F TRAIL=" ","-",")",">","}","]","," D
  1. . . N REP,WIT
  1. . . S REP=LEAD_SEG1_TRAIL,WIT=LEAD_SEG2_TRAIL
  1. . . Q:TXT'[REP
  1. . . F Q:TXT'[REP S TXT=$P(TXT,REP,1)_WIT_$P(TXT,REP,2)
  1. . S REP=LEAD_SEG1,WIT=LEAD_SEG2
  1. . I TXT[REP,$L($P(TXT,REP,1)),'$L($P(TXT,REP,2)) D
  1. . . S TXT=$P(TXT,REP,1)_WIT
  1. S X=$G(TXT)
  1. Q X