SGTY 3 ماه پیش
والد
کامیت
5f0ad1e938
5فایلهای تغییر یافته به همراه103 افزوده شده و 96 حذف شده
  1. 2 2
      agent/cdss/capbility.py
  2. 97 90
      agent/cdss/libs/cdss_helper.py
  3. 1 1
      router/graph_router.py
  4. 1 1
      router/knowledge_nodes_api.py
  5. 2 2
      tests/test.py

+ 2 - 2
agent/cdss/capbility.py

@@ -36,8 +36,8 @@ class CDSSCapability:
 
             for item in result["score_diags"][:10]:
                 output.diagnosis.value[item[0]] = item[1]
-            for item in result["count_diags"][:10]:
-                output.count_diagnosis.value[item[0]] = item[1]
+            # for item in result["count_diags"][:10]:
+            #     output.count_diagnosis.value[item[0]] = item[1]
             # for item in result["checks"][:5]:
             #     item[1]['score'] = item[1]['count'] / result["total_checks"]
             #     output.checks.value[item[0]] = item[1]

+ 97 - 90
agent/cdss/libs/cdss_helper.py

@@ -54,7 +54,9 @@ class CDSSHelper(GraphHelper):
         print("load entity data")
         # 这里设置了读取的属性
         data = {"id": [], "name": [], "type": [],"is_symptom": [], "sex": [], "age": []}
-        with open(f"{CACHED_DATA_PATH}\\entities_med.json", "r", encoding="utf-8") as f:
+        if not os.path.exists(os.path.join(CACHED_DATA_PATH, 'entities_med.json')):
+            return []
+        with open(os.path.join(CACHED_DATA_PATH, 'entities_med.json'), "r", encoding="utf-8") as f:
             entities = json.load(f)
             for item in entities:
                 #如果id已经存在,则跳过
@@ -91,7 +93,9 @@ class CDSSHelper(GraphHelper):
         print("load relationship data")
 
         for i in range(47):
-            if os.path.exists(f"{CACHED_DATA_PATH}\\relationship_med_{i}.json"):
+            if not os.path.exists(os.path.join(CACHED_DATA_PATH, f"relationship_med_{i}.json")):
+                continue
+            if os.path.exists(os.path.join(CACHED_DATA_PATH, f"relationship_med_{i}.json")):
                 print(f"load entity data {CACHED_DATA_PATH}\\relationship_med_{i}.json")
                 with open(f"{CACHED_DATA_PATH}\\relationship_med_{i}.json", "r", encoding="utf-8") as f:
                     data = {"src": [], "dest": [], "type": [], "weight": []}
@@ -261,7 +265,6 @@ class CDSSHelper(GraphHelper):
             5. 按科室汇总结果(STEP 3)
             6. 对结果进行排序和统计(STEP 4-6)
         """
-        start_time = time.time()
         # 定义允许的节点类型,包括科室、疾病、药品、检查和症状
         # 这些类型用于后续的节点过滤和路径查找
         DEPARTMENT = ['科室', 'Department']
@@ -299,44 +302,10 @@ class CDSSHelper(GraphHelper):
                 logger.debug(f"node {node} not found")
         node_ids = node_ids_filtered
 
-        end_time = time.time()
         results = self.step1(node_ids,node_id_names, input, allowed_types, allowed_links,max_hops,DIESEASE)
 
-        # 这里输出markdonw格式日志
-        log_data = ["|疾病|症状|出现次数|是否相关"]
-        log_data.append("|--|--|--|--|")
-        for item in results:
-            data = results[item]
-            data['relevant'] = False
-            if data["count"] / len(start_nodes) > 0.5:
-                # 疾病有50%以上的症状出现,才认为是相关的
-                data['relevant'] = True
-                disease_name = data["name"]
-                key = 'disease_name_parent_' +disease_name
-                cached_value = self.cache.get(key)
-                if cached_value is None:
-                    out_edges = self.graph.out_edges(item, data=True)
-
-                    for edge in out_edges:
-                        src, dest, edge_data = edge
-                        if edge_data["type"] != '疾病相关父类':
-                            continue
-                        dest_data = self.entity_data[self.entity_data.index == dest]
-                        if dest_data.empty:
-                            continue
-                        dest_name = self.entity_data[self.entity_data.index == dest]['name'].tolist()[0]
-                        self.cache.set(key, dest_name)
-                        break
-
-            # 如果data['relevant']为False,那么我们就不输出
-            if data['relevant'] == False:
-                continue
-
+        self.printValidDisease(results, start_nodes)
 
-            log_data.append(f"|{data['name']}|{','.join(data['path'])}|{data['count']}|{data['relevant']}|")
-
-        # content = "疾病和症状相关性统计表格\n" + "\n".join(log_data)
-        # print(f"\n{content}")
         # 调用step2方法处理科室、检查和药品信息
         results = self.step2(results)
 
@@ -346,7 +315,7 @@ class CDSSHelper(GraphHelper):
         sorted_final_results = self.step4(final_results)
 
         # STEP 5: 对于final_results里面的diseases, checks和durgs统计全局出现的次数并且按照次数降序排序
-        sorted_score_diags, sorted_count_diags,total_diags = self.step5(final_results, input)
+        sorted_score_diags,total_diags = self.step5(final_results, input)
 
         # STEP 6: 整合数据并返回
         # if "department" in item.keys():
@@ -361,11 +330,50 @@ class CDSSHelper(GraphHelper):
         #     final_results["symptoms"] = list(set(final_results["symptoms"]+item["symptoms"]))
 
         return {"details": sorted_final_results,
-                "score_diags": sorted_score_diags,"count_diags": sorted_count_diags,"total_diags": total_diags,
+                "score_diags": sorted_score_diags,"total_diags": total_diags,
                 # "checks":sorted_checks, "drugs":sorted_drugs,
                 # "total_checks":total_check, "total_drugs":total_drug
                 }
 
+    def printValidDisease(self, results, start_nodes):
+        """
+        输出有效的疾病信息为Markdown格式
+        :param results: 疾病结果字典
+        :param start_nodes: 起始症状节点列表
+        :return: 格式化后的Markdown字符串
+        """
+        log_data = ["|疾病|症状|出现次数|是否相关"]
+        log_data.append("|--|--|--|--|")
+        for item in results:
+            data = results[item]
+            data['relevant'] = False
+            if data["count"] / len(start_nodes) > 0.5:
+                data['relevant'] = True
+                # 初始化疾病的父类疾病
+                # disease_name = data["name"]
+                # key = 'disease_name_parent_' +disease_name
+                # cached_value = self.cache.get(key)
+                # if cached_value is None:
+                #     out_edges = self.graph.out_edges(item, data=True)
+                #
+                #     for edge in out_edges:
+                #         src, dest, edge_data = edge
+                #         if edge_data["type"] != '疾病相关父类':
+                #             continue
+                #         dest_data = self.entity_data[self.entity_data.index == dest]
+                #         if dest_data.empty:
+                #             continue
+                #         dest_name = self.entity_data[self.entity_data.index == dest]['name'].tolist()[0]
+                #         self.cache.set(key, dest_name)
+                #         break
+            if data['relevant'] == False:
+                continue
+
+            log_data.append(f"|{data['name']}|{','.join(data['path'])}|{data['count']}|{data['relevant']}|")
+
+        content = "疾病和症状相关性统计表格\n" + "\n".join(log_data)
+        print(f"\n{content}")
+
     def step1(self, node_ids,node_id_names, input, allowed_types, allowed_links,max_hops,DIESEASE):
         """
         根据症状节点查找相关疾病
@@ -382,9 +390,10 @@ class CDSSHelper(GraphHelper):
             temp_results = {}
             cache_key = f"symptom_ref_disease_{node}"
             cache_data = self.cache.get(cache_key)
+            print(str(len(cache_data)))
             if cache_data:
                 temp_results = cache_data
-           
+                print(cache_key+":"+node_id_names[node] +':'+ str(len(temp_results)))
                 if results=={}:
                     results = temp_results      
                 else:
@@ -450,7 +459,7 @@ class CDSSHelper(GraphHelper):
                         queue.append((src, depth + 1, path, data))
                     # else:
                     # print(f"skip travel from {src} to {dest}")
-            print(node_id_names[node]+":"+str(len(temp_results)))
+            print(cache_key+":"+node_id_names[node]+':'+ str(len(temp_results)))
             self.cache.set(cache_key, temp_results)
             if results == {}:
                 results = temp_results
@@ -469,15 +478,13 @@ class CDSSHelper(GraphHelper):
         new_results = {}
 
         for item in results:
-            if item == 1795251:
-                print('1111')
             if self.check_sex_allowed(item, input.pat_sex.value) == False:
                 continue
             if self.check_age_allowed(item, input.pat_age.value) == False:
                 continue
             new_results[item] = results[item]
         results = new_results
-        print(len(results))
+        print('STEP 1 '+str(len(results)))
         print(f"STEP 1 执行完成,耗时:{end_time - start_time:.2f}秒")
         print(f"STEP 1 遍历图谱查找相关疾病 finished")
         return results
@@ -522,17 +529,17 @@ class CDSSHelper(GraphHelper):
         print(f"STEP 2 执行完成,耗时:{end_time - start_time:.2f}秒")
 
         # 输出日志
-        # log_data = ["|disease|count|department|check|drug|"]
-        # log_data.append("|--|--|--|--|--|")
-        # for item in results.keys():
-        #     department_data = results[item].get("department", [])
-        #     count_data = results[item].get("count")
-        #     check_data = results[item].get("check", [])
-        #     drug_data = results[item].get("drug", [])
-        #     log_data.append(
-        #         f"|{results[item].get("name", item)}|{count_data}|{','.join(department_data)}|{','.join(check_data)}|{','.join(drug_data)}|")
-        #
-        # print("疾病科室检查药品相关统计\n" + "\n".join(log_data))
+        log_data = ["|disease|count|department|check|drug|"]
+        log_data.append("|--|--|--|--|--|")
+        for item in results.keys():
+            department_data = results[item].get("department", [])
+            count_data = results[item].get("count")
+            check_data = results[item].get("check", [])
+            drug_data = results[item].get("drug", [])
+            log_data.append(
+                f"|{results[item].get("name", item)}|{count_data}|{','.join(department_data)}|{','.join(check_data)}|{','.join(drug_data)}|")
+
+        print("疾病科室检查药品相关统计\n" + "\n".join(log_data))
         return results
 
     def step3(self, results):
@@ -576,18 +583,18 @@ class CDSSHelper(GraphHelper):
 
         print(f"STEP 3 finished")
         # 这里输出日志
-        # log_data = ["|department|disease|check|drug|count|score"]
-        # log_data.append("|--|--|--|--|--|--|")
-        # for department in final_results.keys():
-        #     diesease_data = final_results[department].get("diseases", [])
-        #     check_data = final_results[department].get("checks", [])
-        #     drug_data = final_results[department].get("drugs", [])
-        #     count_data = final_results[department].get("count", 0)
-        #     score_data = final_results[department].get("score", 0)
-        #     log_data.append(
-        #         f"|{department}|{','.join(diesease_data)}|{','.join(check_data)}|{','.join(drug_data)}|{count_data}|{score_data}|")
-        #
-        # print("\n" + "\n".join(log_data))
+        log_data = ["|department|disease|check|drug|count|score"]
+        log_data.append("|--|--|--|--|--|--|")
+        for department in final_results.keys():
+            diesease_data = final_results[department].get("diseases", [])
+            check_data = final_results[department].get("checks", [])
+            drug_data = final_results[department].get("drugs", [])
+            count_data = final_results[department].get("count", 0)
+            score_data = final_results[department].get("score", 0)
+            log_data.append(
+                f"|{department}|{','.join(diesease_data)}|{','.join(check_data)}|{','.join(drug_data)}|{count_data}|{score_data}|")
+
+        print("\n" + "\n".join(log_data))
         return final_results
 
     def step4(self, final_results):
@@ -626,17 +633,17 @@ class CDSSHelper(GraphHelper):
         end_time = time.time()
         print(f"STEP 4 执行完成,耗时:{end_time - start_time:.2f}秒")
         # 这里输出markdown日志
-        # log_data = ["|department|disease|check|drug|count|score"]
-        # log_data.append("|--|--|--|--|--|--|")
-        # for department in final_results.keys():
-        #     diesease_data = final_results[department].get("diseases")
-        #     check_data = final_results[department].get("checks")
-        #     drug_data = final_results[department].get("drugs")
-        #     count_data = final_results[department].get("count", 0)
-        #     score_data = final_results[department].get("score", 0)
-        #     log_data.append(f"|{department}|{diesease_data}|{check_data}|{drug_data}|{count_data}|{score_data}|")
-        #
-        # print("\n" + "\n".join(log_data))
+        log_data = ["|department|disease|check|drug|count|score"]
+        log_data.append("|--|--|--|--|--|--|")
+        for department in final_results.keys():
+            diesease_data = final_results[department].get("diseases")
+            check_data = final_results[department].get("checks")
+            drug_data = final_results[department].get("drugs")
+            count_data = final_results[department].get("count", 0)
+            score_data = final_results[department].get("score", 0)
+            log_data.append(f"|{department}|{diesease_data}|{check_data}|{drug_data}|{count_data}|{score_data}|")
+
+        print("\n" + "\n".join(log_data))
         return sorted_final_results
 
     def step5(self, final_results, input):
@@ -674,19 +681,19 @@ class CDSSHelper(GraphHelper):
                     diags[disease] = {"count": data["count"], "score": data["count"] * department_factor}
 
         sorted_score_diags = sorted(diags.items(), key=lambda x: x[1]["score"], reverse=True)
-        sorted_count_diags = sorted(diags.items(), key=lambda x: x[1]["count"], reverse=True)
+        #sorted_count_diags = sorted(diags.items(), key=lambda x: x[1]["count"], reverse=True)
 
         print(f"STEP 5 finished")
         end_time = time.time()
         print(f"STEP 5 执行完成,耗时:{end_time - start_time:.2f}秒")
 
-        # log_data = ["|department|disease|count|score"]
-        # log_data.append("|--|--|--|--|")
-        # for department in final_results.keys():
-        #     diesease_data = final_results[department].get("diseases")
-        #     count_data = final_results[department].get("count", 0)
-        #     score_data = final_results[department].get("score", 0)
-        #     log_data.append(f"|{department}|{diesease_data}|{count_data}|{score_data}|")
-        #
-        # print("这里是经过排序的数据\n" + "\n".join(log_data))
-        return sorted_score_diags, sorted_count_diags, total_diags
+        log_data = ["|department|disease|count|score"]
+        log_data.append("|--|--|--|--|")
+        for department in final_results.keys():
+            diesease_data = final_results[department].get("diseases")
+            count_data = final_results[department].get("count", 0)
+            score_data = final_results[department].get("score", 0)
+            log_data.append(f"|{department}|{diesease_data}|{count_data}|{score_data}|")
+
+        print("这里是经过排序的数据\n" + "\n".join(log_data))
+        return sorted_score_diags, total_diags

+ 1 - 1
router/graph_router.py

@@ -62,7 +62,7 @@ async def neighbor_search(
         print(output.diagnosis.value)
         return StandardResponse(
             success=True,
-            data={"可能诊断":output.diagnosis.value,"高频诊断":output.count_diagnosis.value,"症状":keywords,"推荐检验":output.checks.value}
+            data={"可能诊断":output.diagnosis.value,"症状":keywords,"推荐检验":output.checks.value}
         )
     except Exception as e:
         print(e)

+ 1 - 1
router/knowledge_nodes_api.py

@@ -48,7 +48,7 @@ async def paginated_search(
         result.pop('pagination', None)
         #result[records]改为result[nodes]
         result['nodes'] = result['records']
-        result.pop('records', None)   
+        result.pop('records', None)
         return StandardResponse(
             success=True,
             requestId=request_id,

+ 2 - 2
tests/test.py

@@ -19,8 +19,8 @@ if __name__ == "__main__":
     print(output.departments.value)
     for item in output.diagnosis.value:
         print(f"DIAG {item}  {output.diagnosis.value[item]} ")
-    for item in output.count_diagnosis.value:
-        print(f"count DIAG {item}  {output.count_diagnosis.value[item]} ")
+    # for item in output.count_diagnosis.value:
+    #     print(f"count DIAG {item}  {output.count_diagnosis.value[item]} ")
     # for item in output.checks.value:
     #     print(f"CHECK {item}  {output.checks.value[item]} ")
     # for item in output.drugs.value: