Exemple #1
0
    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
Exemple #2
0
    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()