def run(self, request): response = {'text': '', 'weight': 0, 'type': 'normal'} js = json.loads(request, encoding = 'utf-8') if len(js) == 0: response['text'] = '' response['weight'] = 0 res = json.dumps(response, ensure_ascii = False) return res candidates = {} sym_list = js['Self Explaination'].split(' ') for sym in sym_list: if sym in self.disease_id: id = self.disease_id[sym] if not id in candidates: candidates[id] = 0 candidates[id] += 1 if sym in self.ds_rind: for id, rate in self.ds_rind[sym].items(): if not id in candidates: candidates[id] = 0 candidates[id] += rate ids = sorted(candidates.items(), key=lambda d:d[1], reverse=True)[:20] print('candidates generated', file = sys.stderr) dw = {} deps = {} for i, r in ids: if r >= 1: for d in self.disease_part[i]: if not d in deps: deps[d] = 0 deps[d] += 1 try: model = BIFReader('models/model.bif.%s' % i).get_model() except: continue infer = VariableElimination(model) key = self.fea_map['D_' + self.disease_name[i]] observed_info = {} if '性别' in js['User Info']: observed_info['SEX'] = js['User Info']['性别'] if '年龄' in js['User Info']: observed_info['AGE'] = js['User Info']['年龄'] for sym in sym_list: sym = 'S_' + sym if not sym in model.nodes(): continue if not sym in self.fea_map: continue observed_info[self.fea_map[sym]] = 0 score = infer.query(variables = [key], evidence = observed_info)[key].values[0] dw[self.disease_name[i]] = score #print('%s: %s = %.8f' % (i, self.disease_name[i], score)) for d in self.disease_part[i]: if not d in deps: deps[d] = 0 deps[d] += score if len(deps) == 0: print('unknown symptoms...', file = sys.stderr) response['weight'] = 0 response['text'] = '' res = json.dumps(response, ensure_ascii = False) return res for name, score in sorted(dw.items(), key=lambda d:d[1], reverse=True)[:10]: print('%s\t%.8f' % (name, score), file = sys.stderr) dep_list = sorted(deps.items(), key=lambda d:d[1], reverse=True) print('department: ', file = sys.stderr) for dep, wei in dep_list[:3]: print(dep, file = sys.stderr) response['text'] += dep response['text'] += ' ' response['weight'] = (1000 * dep_list[0][1]) + 0.8 res = json.dumps(response, ensure_ascii = False) return res
dw = {} for i in ids: try: model = BIFReader('models/model.bif.%s' % i).get_model() except: continue infer = VariableElimination(model) key = fea_map['D_' + disease_name[i]] observed_info = {} for sym in a: if sym.startswith('SEX_'): observed_info['SEX'] = int(sym[len('SEX_'):]) if sym.startswith('AGE_'): observed_info['AGE'] = int(sym[len('AGE_'):]) sym = 'S_' + sym if not sym in model.nodes(): continue if not sym in fea_map: continue observed_info[fea_map[sym]] = 0 score = infer.query(variables=[key], evidence=observed_info)[key].values[0] dw[disease_name[i]] = score print('%s: %s = %.8f' % (i, disease_name[i], score)) for name, score in sorted(dw.items(), key=lambda d: d[1], reverse=True)[:10]: print('%s\t%.8f' % (name, score)) sys.stdout.flush()