|
@@ -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
|