from semantic import * from parser.feature import * sem = SemanticRuleSet() identity = lambda x: x ### Rules ### # Start Rules sem.add("Start -> S", lambda s: processSentence(s)) sem.add("S -> MP Dose Route Freq", lambda med, dose, route, freq: med(dose, route, freq, 'null', 'null', 'null')) sem.add("S -> MP Num Route Freq", lambda med, num, route, freq: med(num, route, freq, 'null', 'null', 'null')) sem.add("S -> MP Dose", lambda med, dose: med(dose, 'null', 'null', 'null', 'null', 'null')) sem.add("S -> MP Dose Freq", lambda med, dose, freq: med(dose, 'null', freq, 'null', 'null', 'null')) sem.add("S -> MP Num Freq", lambda med, num, freq: med(num, 'null', freq, 'null', 'null', 'null')) sem.add("S -> MP Dose Freq Quan", lambda med, dose, freq, quan: med(dose, 'null', freq, quan, 'null', 'null')) sem.add("S -> MP Dose Freq Quan Refill", lambda med, dose, freq, quan, refill: med (dose, 'null', freq, quan, refill, 'null')) sem.add("S -> MP Dose Quan Dose Route Freq", lambda med, dose1, quan, dose2, route, freq: med(dose1 + " " + dose2, route, freq, quan, 'null', 'null')) sem.add("S -> MP Dose Quan Num Route Freq", lambda med, dose1, quan, num, route, freq: med(dose1 + " " + num, route, freq, quan, 'null', 'null')) sem.add("S -> MP Dose Route", lambda med, dose, route: med(dose, route, 'null', 'null', 'null', 'null')) sem.add("S -> MP Dose Route Freq Quan", lambda med, dose, route, freq, quan: med(dose, route, freq, quan, 'null', 'null')) sem.add("S -> MP Num Route Freq Quan", lambda med, num, route, freq, quan: med(num, route, freq, quan, 'null', 'null')) sem.add("S -> MP Freq", lambda med, freq: med('null', 'null', freq, 'null', 'null', 'null')) sem.add("S -> MP Route", lambda med, route: med('null', route, 'null', 'null', 'null', 'null')) sem.add("S -> MP Route Freq", lambda med, route, freq: med('null', route, freq, 'null', 'null', 'null')) sem.add("S -> MP Dose Freq Misc", lambda med, dose, freq, misc: med(dose, 'null', freq, 'null', 'null', misc)) sem.add("S -> MP Num Freq Misc", lambda med, num, freq, misc: med(num, 'null', freq, 'null', 'null', misc)) sem.add("S -> MP Dose Freq Misc Refill", lambda med, dose, freq, misc, refill: med(dose, 'null', freq, 'null', refill, misc)) sem.add("S -> MP Dose Route Freq Misc", lambda med, dose, route, freq, misc: med(dose, route, freq, 'null', 'null', misc)) sem.add("S -> MP Freq Misc", lambda med, freq, misc: med('null', 'null', freq, 'null', 'null', misc)) sem.add("S -> MP Misc Freq", lambda med, misc, freq: med('null', 'null', freq, 'null', 'null', misc)) sem.add("S -> MP Quan Freq", lambda med, quan, freq: med('null', 'null', freq, quan, 'null', 'null')) sem.add("S -> MP Dose Route Freq Quan Refill Num Route Freq", lambda med, dose1, route1, freq1, quan, refill, num, route2, freq2: med(dose1 + " OR " + num, route1 + " OR " + route2, freq1 + " OR " + freq2, quan, refill, 'null')) sem.add("S -> MP Num Route Freq Trash Dose Freq", lambda med, num, route, freq1, trash, dose, freq2: med(num + " " + dose, route, freq1 + " OR " + freq2, 'null', 'null', 'null')) sem.add("MP -> Med", lambda med: lambda dose, route, freq, quan, refill, misc: C("Prescription", medication = med, dose = dose, route = route, frequency = freq, quantity = quan, refill = refill, misc = misc)) sem.add("MP -> Med MedMod", lambda med, medmod: lambda dose, route, freq, quan, refill, misc: C("Prescription", medication = med, modifier = medmod, dose = dose, route = route, frequency = freq, quantity = quan, refill = refill, misc = misc)) sem.add("MP -> MedMod Med", lambda medmod, med: lambda dose, route, freq, quan, refill, misc: C("Prescription", medication = med, modifier = medmod, dose = dose, route = route, frequency = freq, quantity = quan, refill = refill, misc = misc)) sem.add("MP -> Trash MP", lambda trash, mp: mp) sem.add("Med -> Med Med", lambda med1, med2: med1 + " " + med2) sem.add("MedMod -> MedMod MedMod", lambda medmod1, medmod2: medmod1 + " " + medmod2) sem.add("Dose -> Num Unit", lambda num, unit: num + " " + unit) sem.add("Dose -> Dose Unit", lambda dose, unit: dose + " " + unit) sem.add("Dose -> Dose Num", lambda dose, num: num + " " + dose) sem.add("Dose -> Dose Dose", lambda dose1, dose2: dose1 + " " + dose2) sem.add("DoseMod -> DoseMod DoseMod", lambda dosemod1, dosemod2: dosemod1 + " " + dosemod2) sem.add("Dose -> Dose Dosemod", lambda dose, dosemod: dose + " " + dosemod) sem.add("MedMod -> With MP", lambda with, med: with(med("null", "null", 'null', 'null', 'null', 'null'))) sem.add("Num -> Num To Num", lambda num1, to, num2: num1 + " " + to + " " + num2) sem.add("Num -> Num Num", lambda num1, num2: num1 + " " + num2) sem.add("Freq -> Freq Freq", lambda freq1, freq2: freq1 + " " + freq2) sem.add("Freq -> Det TimeUnit", lambda det, unit: det + " " + unit) sem.add("Freq -> Trash Freq", lambda trash, dose: dose) sem.add("Freq -> Unit Det TimeUnit", lambda unit, det, time: unit + " " + det + " " + time) sem.add("Quan -> WordQuan Quan", lambda wordquan, quan: quan) sem.add("Quan -> Trash Quan", lambda trash, quan: quan) sem.add("Quan -> Num QuanUnit", lambda num, unit: num + " " + unit) sem.add("Refill -> Num TimeUnit", lambda num, unit: num + " " + unit) sem.add("Refill -> RefillDet Num", lambda det, num: det + " " + num) sem.add("Refill -> Num RefillWord", lambda num, refill: num + " " + refill) sem.add("Route -> Trash Route", lambda trash, route: route) sem.add("Route -> To Route", lambda to, route: to + " " + route) sem.add("Misc -> Misc Misc", lambda misc1, misc2: misc1 + " " + misc2) sem.add("Misc -> Misc Num", lambda misc, num: misc + " " + num) sem.add("Trash -> Trash Trash", lambda trash1, trash2: trash2) sem.addMatch("Med -> *", identity) sem.addLexicon("Med", ['actonel', 'advil', 'albuterol', 'amlodipine', 'anusol', 'aspirin', 'atenolol', 'ativan', 'augmentin', 'avapro', 'budesonide', 'calcium', 'casodex', 'centrum', 'cimetidine', 'clozaril', 'colace', 'colchicine', 'combivent', 'coumadin', 'detrol', 'digoxin', 'dovonex', 'dyazide', 'epipen', 'eucerin', 'eurontin', 'flonase', 'flovent', 'folic', 'fosamax', 'gemfibrozil', 'glyburide', 'hydrochlorothiazide', 'hydrocortizone', 'isordil', 'lac-hydrin', 'levoxyl', 'lexapro', 'lipitor', 'lupron', 'metformin', 'methotrexate', 'methylphenidate', 'metoprolol', 'mevacor', 'nasacort', 'nasonex', 'necon', 'niaspan', 'niferex', 'permax', 'potassium', 'pravachol', 'propafenone', 'provigil', 'quinine', 'ranitidine', 'robaxin', 'serevent', 'sinemet', 'singulair', 'sonata', 'synthroid', 'tetracycline', 'tiazac', 'toprol', 'trimethoprim', 'ultram', 'vasocon-a', 'verapamil', 'vioxx', 'vitamin', 'voltaren', 'xalatan', 'xanax', 'zestril', 'zocor', 'zyrtec', 'd', 'carbonate', 'silver', 'chloride', 'sulfate', 'xl', 'sr', 'b12', 'e', 'hc', 'acid', 'caltrate', 'neurontin']) sem.addMatch("MedMod -> *", identity) sem.addLexicon("MedMod", ['nasal', 'spray', 'inhaler', 'autoinjector', 'cream', 'eyedrops', 'enteric', 'coated', '12%']) sem.addMatch("Num -> *", identity) sem.addLexicon("Num", ['1', 'one', 'two', 'one-half', 'no', 'three']) sem.addMatch("Misc -> *", identity) sem.addLexicon("Misc", ['misc', 'a', 'coumadin']) sem.addMatch("Quan -> *", identity) sem.addLexicon("Quan", ['quan']) sem.addMatch("WordQuan -> *", identity) sem.addLexicon("WordQuan", ['quantity']) sem.addMatch("QuanUnit -> *", identity) sem.addLexicon("QuanUnit", ['tube']) sem.addMatch("Unit -> *", identity) sem.addLexicon("Unit", ['mg', 'meq', 'iu', 'tablets', 'tablet', 'spray', 'puffs', 'puff', 'mcg', 'tabs', 'tube', 'gtt']) sem.addMatch("Route -> *", identity) sem.addLexicon("Route", ['po', 'nasal', 'im', 'topically', 'rash']) sem.addMatch("With -> *", lambda word: lambda obj: C("Modifier", With=obj)) sem.addLexicon("With", ['with']) sem.addMatch("To -> *", identity) sem.addLexicon("To", ['to']) sem.addMatch("Freq -> *", identity) sem.addLexicon("Freq", ['bid', 'tid', 'qd', 'qAM', 'qPM', 'qhs', 'q4-6hrs', 'prn', 'qwk', 'once', 'qmonth']) sem.addMatch("DoseMod -> *", identity) sem.addLexicon("DoseMod", ['each', 'nostril', 'in', 'ou']) sem.addMatch("Det -> *", identity) sem.addLexicon("Det", ['a', 'twice', 'per']) sem.addMatch("TimeUnit -> *", identity) sem.addLexicon("TimeUnit", ['day', 'year', 'week', 'daily']) sem.addMatch("RefillDet -> *", identity) sem.addLexicon("RefillDet", ['x']) sem.addMatch("RefillWord -> *", identity) sem.addLexicon("RefillWord", ['refill', 'refills']) sem.addMatch("Trash -> *", identity) sem.addLexicon("Trash", ['taken', 'applied', 'apply', 'is', 'refilled', 'add', 'please', 'starting']) def processSentence(data): sem.learned.add(data) return data