基于neo4j知識圖譜的大數(shù)據(jù)醫(yī)療領(lǐng)域知識問答系統(tǒng)(完整源碼資料)
一、項目概述
基于知識圖譜+flask的KBQA醫(yī)療問答系統(tǒng)基于醫(yī)療方面知識的問答,通過搭建一個醫(yī)療領(lǐng)域知識圖譜,并以該知識圖譜完成自動問答與分析服務(wù)。 基于知識圖譜+flask的KBQA醫(yī)療問答系統(tǒng)以neo4j作為存儲,本系統(tǒng)知識圖譜建模使用的最大向前匹配是一種貪心算法,從句首開始匹配,每次選擇最長的詞語。由于只需一次遍歷,因此在速度上相對較快。 算法相對簡單,容易實現(xiàn)和理解,不需要復雜的數(shù)據(jù)結(jié)構(gòu)。 對于中文文本中大部分是左向的情況,最大向前匹配通常能夠較好地切分。與最大向前匹配相反,最大向后匹配從句尾開始匹配,每次選擇最長的詞語。適用于大部分右向的中文文本。雙向最大匹配結(jié)合了最大向前匹配和最大向后匹配的優(yōu)勢,從兩個方向分別匹配,然后選擇分詞數(shù)量較少的一種結(jié)果。這種方法綜合考慮了左向和右向的特點,提高了切分的準確性,以關(guān)鍵詞執(zhí)行cypher查詢,并返回相應(yīng)結(jié)果查詢語句作為問答。后面我又設(shè)計了一個簡單的基于 Flask 的聊天機器人應(yīng)用,利用nlp自然語言處理,通過醫(yī)療AI助手根據(jù)用戶的問題返回結(jié)果,用戶輸入和系統(tǒng)返回的輸出結(jié)果都會一起自動存儲到sql數(shù)據(jù)庫。
在多模式匹配方面, Aho-Corasick算法專門用于在一個文本中同時搜索多個模式(關(guān)鍵詞)。相比于暴力搜索算法,Aho-Corasick算法的時間復雜度較低,在本知識圖譜建模問答系統(tǒng)中,性能更為顯著。在線性時間復雜度方面,進行預(yù)處理的階段,Aho-Corasick算法構(gòu)建了一個確定性有限自動機(DFA),使得在搜索階段的時間復雜度為O(n),其中n是待搜索文本的長度。這種線性時間復雜度使得算法在本應(yīng)用中非常高效。在靈活性方面, Aho-Corasick算法在構(gòu)建有限自動機的過程中,可以方便地添加、刪除模式串,而不需要重新構(gòu)建整個數(shù)據(jù)結(jié)構(gòu),提高了算法的靈活性和可維護性。
二、實現(xiàn)知識圖譜的醫(yī)療知識問答系統(tǒng)基本流程
-
配置好所需要的環(huán)境(jdk,neo4j,pycharm,python等)
-
爬取所需要的醫(yī)學數(shù)據(jù),獲取所需基本的醫(yī)療數(shù)據(jù)。
-
對醫(yī)療數(shù)據(jù)進行數(shù)據(jù)清洗處理。
-
基于貪心算法進行分詞策略。
-
關(guān)系抽取定義與實體識別。
-
知識圖譜建模。
-
基于
Aho-Corasick
算法進行多模式匹配。 -
設(shè)計一個基于 Flask 的聊天機器人AI助手。
-
設(shè)計用戶輸入和系統(tǒng)輸出記錄數(shù)據(jù)自動存儲到sql數(shù)據(jù)庫。
系統(tǒng)部分內(nèi)容展示及解析(完整資料獲取看文末):
具體的疾病詳情頁面如下:
首先對網(wǎng)址上的疾病鏈接進行分析,以感冒為例:
感冒的鏈接:http://jib.xywy.com/il_sii_38.htm
可以看到,上面包含了疾病的簡介、病因、預(yù)防、癥狀、檢查、治療、并發(fā)癥、飲食保健等詳情頁的內(nèi)容。下面我們要使用爬蟲把信息收集起來。
通過觀察可以看出,鏈接部分 http://jib.xywy.com/il_sii_ 都是相同的,是通過數(shù)字的疊加來組成不同的病例。通過string類型的拼接進行循環(huán)后可以得到我們需要的內(nèi)容。
數(shù)據(jù)收集模塊放在/prepare_data文件夾下面。
要收集 url 下面對應(yīng)的數(shù)據(jù),具體爬蟲代碼如下:
爬取醫(yī)學數(shù)據(jù)并將其存儲到 MongoDB 數(shù)據(jù)庫中。
之前老版本的insert方法被棄用,再用會出現(xiàn)警告。insert 替換為了 insert_one,這樣就不會再收到關(guān)于 insert 方法被棄用的警告了。如果你需要一次性插入多個文檔,可以使用 insert_many 方法。
# 使用 insert_one 或 insert_many 方法。提供了更多的靈活性,并且支持更多的功能,比如插入后返回的文檔的 _id 值。
class MedicalSpider:
def __init__(self):
# 在類初始化時,建立與 MongoDB 數(shù)據(jù)庫的連接
self.conn = pymongo.MongoClient()
# 選擇名為 'medical2' 的數(shù)據(jù)庫
self.db = self.conn['medical']
# 在數(shù)據(jù)庫中選擇名為 'data' 的集合(類似于關(guān)系數(shù)據(jù)庫中的表)
self.col = self.db['data']
def insert_data(self, data):
# 使用 insert_one 方法插入單個文檔
self.col.insert_one(data)
- class MedicalSpider:: 定義了一個名為 MedicalSpider 的類。
- def init(self):: 這是類的構(gòu)造函數(shù),用于在創(chuàng)建類的實例時進行初始化。在初始化過程中,建立了與 MongoDB 數(shù)據(jù)庫的連接,并選擇了名為 ‘medical’ 的數(shù)據(jù)庫和名為 ‘data’ 的集合。
- def insert_data(self, data):: 這是一個方法,用于插入數(shù)據(jù)到 MongoDB 中。它使用了 insert_one 方法,該方法用于插入單個文檔(記錄)到 MongoDB 集合中。data 參數(shù)是要插入的文檔數(shù)據(jù)。
需要爬取的信息包括疾病名、所屬目錄、癥狀、治療方案等等,都可以從頁面上獲取。
MongoDB里面的數(shù)據(jù)也是刷新顯示最新數(shù)據(jù)記錄
我們隨便點一個我們爬取的網(wǎng)頁鏈接,點擊查看網(wǎng)頁詳情:
這里代碼爬蟲的主要功能是爬取疾病相關(guān)的信息,并將數(shù)據(jù)存儲到MongoDB數(shù)據(jù)庫中。代碼的主要結(jié)構(gòu)是一個名為MedicalSpider的類,它包含了各種方法來處理不同類型的數(shù)據(jù)采集任務(wù)。在代碼的開頭,導入了一些必要的庫,如requests、urllib、lxml和pymongo。然后定義了一個MedicalSpider類,該類的構(gòu)造函數(shù)初始化了MongoDB的連接,并指定了要使用的數(shù)據(jù)庫和集合。
接下來是一系列方法,用于實現(xiàn)不同類型的數(shù)據(jù)采集。其中,get_html方法用于發(fā)送HTTP請求并獲取網(wǎng)頁的HTML內(nèi)容。url_parser方法用于解析HTML內(nèi)容,提取出需要的URL。basicinfo_spider方法用于解析疾病的基本信息,如名稱、描述和所屬目錄。treat_spider、drug_spider和food_spider方法分別用于解析治療信息、藥物信息和食物信息。symptom_spider方法用于解析疾病的癥狀信息。inspect_spider方法用于解析疾病的檢查信息。common_spider方法用于解析通用模塊下的內(nèi)容,如疾病預(yù)防和疾病起因。
在spider_main方法中,通過循環(huán)遍歷頁面,構(gòu)造不同類型的URL,并調(diào)用相應(yīng)的方法進行數(shù)據(jù)采集。采集到的數(shù)據(jù)以字典的形式存儲,并插入到MongoDB數(shù)據(jù)庫中。
最后,代碼調(diào)用了MedicalSpider類的實例,并依次調(diào)用了inspect_crawl和spider_main方法,完成了數(shù)據(jù)的采集和存儲。
總的來說,通過爬取尋醫(yī)問藥網(wǎng)站的相關(guān)頁面,獲取疾病的基本信息、治療信息、藥物信息、食物信息、癥狀信息和檢查信息,并將數(shù)據(jù)存儲到MongoDB數(shù)據(jù)庫中。
結(jié)束之后我們可以在MongoDB數(shù)據(jù)庫中查看我們爬取到的疾病鏈接和解析出的網(wǎng)頁內(nèi)容:91496d548148a6a102d46a94d8c.png)貪心算法策略+Aho-Corasick算法
本次知識圖譜建模使用的最大向前匹配是一種貪心算法,從句首開始匹配,每次選擇最長的詞語。由于只需一次遍歷,因此在速度上相對較快。 算法相對簡單,容易實現(xiàn)和理解,不需要復雜的數(shù)據(jù)結(jié)構(gòu)。 對于中文文本中大部分是左向的情況,最大向前匹配通常能夠較好地切分。與最大向前匹配相反,最大向后匹配從句尾開始匹配,每次選擇最長的詞語。適用于大部分右向的中文文本。雙向最大匹配結(jié)合了最大向前匹配和最大向后匹配的優(yōu)勢,從兩個方向分別匹配,然后選擇分詞數(shù)量較少的一種結(jié)果。這種方法綜合考慮了左向和右向的特點,提高了切分的準確性。
在多模式匹配方面, Aho-Corasick算法專門用于在一個文本中同時搜索多個模式(關(guān)鍵詞)。相比于暴力搜索算法,Aho-Corasick算法的時間復雜度較低,在本知識圖譜建模問答中,性能更為顯著。
在線性時間復雜度方面,進行預(yù)處理的階段,Aho-Corasick算法構(gòu)建了一個確定性有限自動機(DFA),使得在搜索階段的時間復雜度為O(n),其中n是待搜索文本的長度。這種線性時間復雜度使得算法在本應(yīng)用中非常高效。
在靈活性方面, Aho-Corasick算法在構(gòu)建有限自動機的過程中,可以方便地添加、刪除模式串,而不需要重新構(gòu)建整個數(shù)據(jù)結(jié)構(gòu),提高了算法的靈活性和可維護性。
在Cypher查詢的效率方面,基于Cypher查詢的數(shù)據(jù)庫檢索機制在系統(tǒng)中表現(xiàn)出良好的效率。這證明了Cypher查詢語言的優(yōu)越性,以及它在處理醫(yī)療知識圖譜時的高效性,確保了用戶能夠快速獲取所需的醫(yī)學信息。
在問答模型用戶界面計方面,基于文本的命令行問答設(shè)計的成功實現(xiàn)極大地提高了系統(tǒng)的可用性和用戶體驗。用戶可以通過直觀且易于導航的界面與系統(tǒng)進行交互,從而更輕松地獲取所需的醫(yī)療信息。
處理數(shù)據(jù)后對應(yīng)的圖譜系統(tǒng)數(shù)據(jù)關(guān)鍵詞:
3)所搭建的系統(tǒng)框架,包括知識圖譜實體類型,實體關(guān)系類型,知識圖譜屬性類型等。
知識圖譜實體類型:
一般來說,一個醫(yī)療知識圖譜問答系統(tǒng)Schema包括以下幾個部分:
實體:指代醫(yī)療領(lǐng)域中的具體概念或?qū)ο?,如藥品、疾病、癥狀等。
屬性:指代實體的特征或描述,如藥品的成分、劑型、適應(yīng)癥等。
關(guān)系:指代實體之間的聯(lián)系或影響,如疾病與藥物的治療關(guān)系、食物的忌吃關(guān)系等。
問題:指代用戶對醫(yī)療領(lǐng)域的信息需求,如“高血壓應(yīng)該吃什么藥?”、“感冒有哪些常見的癥狀?”等。
答案:指代針對問題的回復或解釋,如“高血壓可以服用降壓藥物,如氨氯地平片、硝苯地平片等。”、“感冒常見的癥狀有發(fā)熱、咳嗽、流鼻涕等?!钡?。
departments = [] #科室
diseases = [] # 疾病
drugs = [] # 藥品
foods = [] # 食物
producers = [] #藥品大類
symptoms = []#癥狀
實體關(guān)系類型:
# 構(gòu)建節(jié)點實體關(guān)系,共11類,medical2做出來的只有10類,因為數(shù)據(jù)量少
rels_department = []
rels_noteat = [] # 疾?。沙允澄镪P(guān)系
rels_doeat = [] # 疾?。顺允澄镪P(guān)系
rels_recommandeat = [] # 疾?。扑]吃食物關(guān)系
rels_commonddrug = [] # 疾病-通用藥品關(guān)系
rels_recommanddrug = [] # 疾?。瓱衢T藥品關(guān)系
rels_check = [] # 疾?。瓩z查關(guān)系
rels_drug_producer = [] # 廠商-藥物關(guān)系
rels_symptom = [] #疾病癥狀關(guān)系
rels_acompany = [] # 疾病并發(fā)關(guān)系
rels_category = [] # 疾病與科室之間的關(guān)系
知識圖譜屬性類型:
4)導入Neo4j數(shù)據(jù)庫,生成圖譜。
新建一個數(shù)據(jù)庫:基于醫(yī)療領(lǐng)域的問答系統(tǒng)
開啟Node4j數(shù)據(jù)庫:
連接我們所建的neo4j數(shù)據(jù)庫:
知識圖譜數(shù)據(jù)入庫:
根據(jù)字典形式的數(shù)據(jù)創(chuàng)建結(jié)點,以疾病為中心定義關(guān)系形成三元組表示的知識,將結(jié)點和關(guān)系導入neo4j數(shù)據(jù)庫形成知識圖譜,通過運行build_medicalgraph.py腳本構(gòu)建圖譜:
建立實體關(guān)系類型:
5a2bb0.png)
該腳本構(gòu)建了一個MedicalGraph類,定義了Graph類的成員變量g和json數(shù)據(jù)路徑成員變量data_path。
建立的圖譜實體關(guān)系和屬性類型數(shù)量有點多,需要等待一會。
項目資料部分截圖:
提示:Started streaming 44112 records in less than 1 ms and completed in less than 1 ms.
在不到1毫秒內(nèi)開始流式傳輸44112條記錄,并在不到1秒內(nèi)完成。
)問答系統(tǒng)的實現(xiàn)與測試,包括問答系統(tǒng)·支持的問答類型,實現(xiàn)方法與步驟。**
本項目問答對話系統(tǒng)的分析思路,整體上接近一個基于規(guī)則的對話系統(tǒng),首先我們需要對用戶輸入進行分類,其實就是分析用戶輸入涉及到的實體及問題類型,也就是Neo4j中的node、property、relationship,然后我們利用分析出的信息,轉(zhuǎn)化成Neo4j的查詢語句,最后再把查詢的結(jié)果返回給用戶,就完成了一次問答。
本項目問答系統(tǒng)支持的問答類型:
節(jié)點ID查詢
以上部分內(nèi)容展示,需要完整資料可掃碼
各位有興趣的小伙伴可以加下面二完整項目源碼和其它相關(guān)資料。
文章來源:http://www.zghlxwxcb.cn/news/detail-786571.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-786571.html
到了這里,關(guān)于基于neo4j知識圖譜的大數(shù)據(jù)醫(yī)療領(lǐng)域知識問答系統(tǒng)(完整源碼資料)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!