在構建醫藥知識圖譜和自動問答時,參考了項目1 。在構建醫藥知識圖譜和問答系統上做瞭如下優化:
在建好知識圖譜和問答系統後,增加前端交互和KG展示,用的是echarts的力引導圖。實現參考項目4 。
neo4j-community-4.1.4 % bin/neo4j start
medical_knowledge_graph_app-master % python med_kg/manage.py runserver
img 功能界面圖
kg/prepare_data 爬蟲文件
kg/data/medical_rebuild.json 最終處理好的數據
kg/build_medicalgraph.py 創建neo4j圖數據庫
med_kg/el_model 實體鏈接模型
med_kg/el_model/embedding 疾病/藥物/症狀詞典的詞嵌入表示
med_kg/el_model/entity_linking.py 實體鏈接腳本
med_kg/med_kg django框架的視圖和配置文件
med_kg/templates django框架的模版
med_kg/static 前端bootstrap文件
med_kg/ner_model 命名實體識別模型
med_kg/ner_model/models 命名實體識別模型模型代碼
med_kg/ner_model/data 訓練模型的數據
med_kg/ner_model/losses 訓練模型的損失函數
med_kg/ner_model/outpus/1101medselfner-finetune 精調(訓練好)的模型
med_kg/ner_model/prev_trained_model 放pytorch的預訓練模型
med_kg/util 工具,冷啟動
med_kg/Model 與neo4j圖數據庫交互的腳本
med_kg/MedModel 自動問答
med_kg/MedModel/question_classifier.py 意圖識別腳本
med_kg/MedModel/question_parser.py 把識別出的提及詞和意圖轉為查詢語句的腳本
med_kg/MedModel/answer_search.py 查詢圖數據庫返回答案
med_kg/MedModel/dict 領域詞典
'*' 號表示原項目基礎上變化的項
| 實體類型 | 中文含義 | 實體數量 | 舉例 |
|---|---|---|---|
| Check | 診斷檢查項目 | 3,353 | 支氣管造影;關節鏡檢查 |
| Department | 醫療科目 | 54 | 整形美容科;燒傷科 |
| Disease | 疾病 | 8,807 | 血栓閉塞性脈管炎;胸降主動脈動脈瘤 |
| Drug | 藥品 | 3,828 | 京万紅痔瘡膏;布林佐胺滴眼液 |
| Food | 食物 | 4,870 | 番茄衝菜牛肉丸湯;竹筍燉羊肉 |
| Producer | 藥品大類 | 17,201 | 通藥製藥青黴素V鉀片;青陽醋酸地塞米松片 |
| Symptom* | 疾病症狀 | 4,377 | 乳腺組織肥厚;腦實質深部出血 |
| Total | 總計 | 44,111 | 約4.4萬實體量級 |
'*' 號表示原項目基礎上變化的項
| 實體關係類型 | 中文含義 | 關係數量 | 舉例 |
|---|---|---|---|
| belongs_to | 屬於 | 8,844 | <婦科,屬於,婦產科> |
| common_drug | 疾病常用藥品 | 14,649 | <陽強,常用,甲磺酸酚妥拉明分散片> |
| do_eat | 疾病宜吃食物 | 22,238 | <胸椎骨折,宜吃,黑魚> |
| drugs_of | 藥品在售藥品 | 17,315 | <青黴素V鉀片,在售,通藥製藥青黴素V鉀片> |
| need_check | 疾病所需檢查 | 39,422 | <單側肺氣腫,所需檢查,支氣管造影> |
| no_eat | 疾病忌吃食物 | 22,247 | <唇病,忌吃,杏仁> |
| recommand_drug | 疾病推薦藥品 | 59,467 | <混合痔,推薦用藥,京万紅痔瘡膏> |
| recommand_eat | 疾病推薦食譜 | 40,221 | <鞘膜積液,推薦食譜,番茄衝菜牛肉丸湯> |
| has_symptom* | 疾病症狀 | 99,492 | <早期乳腺癌,疾病症狀,乳腺組織肥厚> |
| acompany_with | 疾病並發疾病 | 12,029 | <下肢交通靜脈瓣膜關閉不全,並發疾病,血栓閉塞性脈管炎> |
| Total | 總計 | 294,149 | 約30萬關係量級 |
| 屬性類型 | 中文含義 | 舉例 |
|---|---|---|
| name | 疾病名稱 | 喘息樣支氣管炎 |
| desc | 疾病簡介 | 又稱哮喘性支氣管炎... |
| cause | 疾病病因 | 常見的有合胞病毒等... |
| prevent | 預防措施 | 注意家族與患兒自身過敏史... |
| cure_lasttime | 治療週期 | 6-12個月 |
| cure_way | 治療方式 | "藥物治療","支持性治療" |
| cured_prob | 治愈概率 | 95% |
| easy_get | 疾病易感人群 | 無特定的人群 |
| 問句類型 | 中文含義 | 問句舉例 | 說明 |
|---|---|---|---|
| disease_symptom | 疾病症狀 | 乳腺癌的症狀有哪些? | 不同類實體間關係 |
| symptom_disease | 已知症狀找可能疾病 | 老流鼻涕是什麼毛病? | 不同類實體間關係 |
| disease_cause | 疾病病因 | 為什麼有的人會失眠? | 實體屬性 |
| disease_acompany | 疾病的並發症 | 失眠有哪些並發症? | 同類實體間關係 |
| disease_not_food | 疾病需要忌口的食物 | 失眠的人不要吃啥? | 不同類實體間關係 |
| disease_do_food | 疾病建議吃什麼食物 | 耳鳴了吃點啥? | 不同類實體間關係 |
| food_not_disease | 什麼病最好不要吃某事物 | 哪些人最好不好吃蜂蜜? | 不同類實體間關係 |
| food_do_disease | 食物對什麼病有好處 | 鵝肉有什麼好處? | 不同類實體間關係 |
| disease_drug | 啥病要吃啥藥 | 肝病要吃啥藥? | 不同類實體間關係 |
| drug_disease | 藥品能治啥病 | 板藍根顆粒能治啥病? | 不同類實體間關係 |
| disease_check | 疾病需要做什麼檢查 | 腦膜炎怎麼才能查出來? | 不同類實體間關係 |
| check_disease | 檢查能查什麼病 | 全血細胞計數能查出啥來? | 不同類實體間關係 |
| disease_prevent | 預防措施 | 怎樣才能預防腎虛? | 實體屬性 |
| disease_lasttime | 治療週期 | 感冒要多久才能好? | 實體屬性 |
| disease_cureway | 治療方式 | 高血壓要怎麼治? | 實體屬性 |
| disease_cureprob | 治愈概率 | 白血病能治好嗎? | 實體屬性 |
| disease_easyget | 疾病易感人群 | 什麼人容易得高血壓? | 實體屬性 |
| disease_desc | 疾病描述 | 糖尿病是什麼? | 實體屬性 |
| disease_getprob(todo) | 患病概率 | 糖尿病的患病率有多高? | 實體屬性 |
(1)提及識別:基於詞典的匹配+基於BERT_CRF的NER,取二者較長的作為提及詞。
(2)實體鏈接:基於SBERT的語義匹配,存儲好詞典的embedding,提及詞和領域詞典匹配,相似度top20的候選實體中結合重疊字,相似度top20的候選實體且與提及次的重疊字大於等於提及詞長度的一半,認為是目標實體。
(3)意圖識別:基於提問詞+領域詞典。比如提問“眼睛乾澀是什麼毛病?”中識別出提及詞“symptom:眼睛乾澀”以及疾病提問詞“毛病”。則認為提問意圖是symptom_disease:已知症狀找可能疾病。

結合BERT和領域詞典匹配兩種方法得到query中的症狀提及"鼻黏膜腫脹"。

用SBERT句對匹配得到症狀提及"鼻黏膜腫脹"的目標實體"鼻粘膜腫脹"。




識別出問句中的一個或多個提及詞,鏈接到對應的一個或多個kg實體,結合意圖識別的結果返回query答案。

出現這個bug:
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.
參考5 ,把./site-package/torch/serialization.py的load函數,用def load(f, map_location='cpu', pickle_module=pickle, **pickle_load_args):代替def load(f, map_location=None, pickle_module=pickle, **pickle_load_args):
https://github.com/liuhuanyong/QASystemOnMedicalKG ↩
https://github.com/lonePatient/BERT-NER-Pytorch ↩
https://github.com/UKPLab/sentence-transformers ↩
https://github.com/jiangnanboy/movie_knowledge_graph_app ↩
https://stackoverflow.com/questions/56369030/runtimeerror-attempting-to-deserialize-object-on-a-cuda-device ↩