楊美潔 張 興 熊相超
(重慶醫(yī)科大學(xué)醫(yī)學(xué)信息學(xué)院 重慶 400016)
高血壓是最常見的慢性病,也是心腦血管病最主要的危險因素[1]。隨著我國經(jīng)濟的發(fā)展和人口的老齡化,高血壓患病率持續(xù)增加,高血壓引起的冠心病、腦卒中等疾病的致殘率、致命率高[2],在我國心腦血管疾病死亡的第1位危險因素是高血壓[3]。目前我國醫(yī)療資源緊張導(dǎo)致看病難等問題,在人工智能、大數(shù)據(jù)時代背景下,將新興信息技術(shù)應(yīng)用到醫(yī)療服務(wù)中,使患者在家中通過網(wǎng)絡(luò)就能得到醫(yī)療建議,緩解就醫(yī)壓力。
目前關(guān)于高血壓本體構(gòu)建和知識庫平臺的研究主要包括:張宇[4]等構(gòu)建高血壓非藥物治療知識庫Web端界面,從Web獲取的大量文檔,利用文本分類技術(shù)以及詞頻(Term Frequency,TF)和文件頻率(Document Frequency,DF)方法提取文檔和類別特征,通過支持向量機(Support Vector Machine,SVM)方法對文檔分類,最后建立本地高血壓非藥物治療知識庫。吳昊[5]等提出基于本體和案例推理的高血壓診療系統(tǒng)的框架結(jié)構(gòu)。鞏沐歌[6]等將高血壓疾病、知識庫和本體結(jié)合起來,構(gòu)建具有推理功能的高血壓知識庫。張巍[7]等提出基于本體和案例推理的高血壓診療系統(tǒng)模型。構(gòu)建高血壓領(lǐng)域本體及推理規(guī)則,使用Jess推理機進行推理操作,使用Jena實現(xiàn)對本體庫和案例庫并行的查詢。李博[8]等結(jié)合本體方法將文本臨床指南轉(zhuǎn)變成臨床指南知識庫。本文利用Python爬蟲技術(shù)爬取網(wǎng)絡(luò)高血壓數(shù)據(jù),通過本體技術(shù)和Protege工具構(gòu)建高血壓本體庫,描述領(lǐng)域概念及其之間的約束和聯(lián)系,將其存儲在Mysql數(shù)據(jù)庫中,本體構(gòu)建完成后以RDF/XML形式存儲,用于網(wǎng)絡(luò)本體語言(Web Ontology Language,OWL)或規(guī)則推理。使用Jieba分詞與正則化技術(shù)對用戶輸入的自然語言進行分詞處理,Jena推理引擎返回結(jié)果,采用Python Web的Django框架進行構(gòu)建前臺可視化界面。
高血壓知識庫平臺構(gòu)建流程,見圖1。Studer等在1998年對本體定義為本體是共享概念明確的形式化規(guī)范說明[9]。本文參照《中國高血壓防治指南2017》版,結(jié)合Python爬取的高血壓網(wǎng)絡(luò)數(shù)據(jù)、相關(guān)文獻圖書等資料,借鑒7步法和骨架法,采用美國斯坦福大學(xué)開發(fā)的本體編輯軟件Protege 5.0軟件進行本體的構(gòu)建[10]。主要構(gòu)建高血壓的癥狀體征、檢查檢驗、藥物等。
圖1 高血壓知識庫平臺構(gòu)建流程
高血壓本體模型,見圖2。本文構(gòu)建高血壓的領(lǐng)域本體包括癥狀體征、檢查檢驗和藥物。其中癥狀體征主要表現(xiàn)為:頭暈、惡心、嘔吐、咳嗽、心悸、尿頻、四肢麻木、下肢水腫等。檢驗檢驗主要包括血壓、血尿素氮、肌酐、低高密度脂蛋白、膽固醇、三酰甘油等。抗高血壓藥物主要包括ACE和ARB、α受體阻滯劑、β受體阻滯劑、抗高血壓藥物、拮抗劑、利尿劑等。利用Protege 5.0為高血壓本體構(gòu)建3大類,分別是檢查檢驗、藥物、癥狀。Protege中有兩個屬性定義,分別是類屬性和關(guān)系屬性。檢查檢驗類屬性項目、結(jié)果、單位、參考值;藥物類屬性:藥物名、副作用;癥狀類屬性:癥狀名、癥狀概述。構(gòu)建3個類之間的關(guān)系屬性完成本體的構(gòu)建。本體構(gòu)建完成后以RDF/XML形式存儲,用于OWL或規(guī)則推理。Jena是一個開源的Java語義網(wǎng)框架,可構(gòu)建語義網(wǎng)和鏈接數(shù)據(jù)應(yīng)用。Jena利用TDB組件將上述構(gòu)建的RDF形式的高血壓知識本體存儲起來,再通過資源描述框架定義集(Resource Description Framework Schema,RDFS)、OWL以及Jena的Rule Reasoner進行本體推理,進一步自動識別補全數(shù)據(jù),避免數(shù)據(jù)缺失、失真等情況。最后使用Fuseki組件,通過SPARQL語言對RDF數(shù)據(jù)進行查詢,實現(xiàn)高效的知識提取。
圖2 高血壓本體模型
利用Python Web框架構(gòu)建高血壓知識庫。通過Python的Django框架開發(fā)高血壓知識庫的Web端界面[11]。用戶在使用Web端進行查詢時需要將輸入的自然語言轉(zhuǎn)換成計算機識別的SPARQL語句,因此要用Python正則Refo模塊、中文分詞Jieba模塊,實現(xiàn)對高血壓知識中字符串及詞句段切、關(guān)鍵字提取等,將自然語言轉(zhuǎn)化為SPARQL語句,解析返回查詢結(jié)果。
在Python的Jieba模塊中加載自定義字典可實現(xiàn)對自然語言較準確的分詞。以輸入“高血壓癥狀體征有哪些?”為例,利用Python的Jieba模塊分詞的部分代碼和結(jié)果如下:
# jieba自動分詞
words=jieba.cut(hyper_str)
print(′---------------默認分詞效果jieba---------------′)
print(′/′join(words))
# 加載自定義字典
jieba.set_dictionary(′sym.txt′)
words=jieba.cut(hyper_str)
print(″------------加載自定義字典后,分詞效果----------------″)
print(′/′join(words))
------------------jieba默認分詞效果----------------------
高血壓/疾病癥狀/有/哪些/?
---------------加載自定義字典后,分詞效果---------------
高血壓/疾病/癥狀/有/哪些/?
為提高檢索查詢結(jié)果的效果和效率,需要對自然語言進行詞性標(biāo)注[12]。詞性標(biāo)注(Part-of-Speech Tagging)是指為分詞結(jié)果中每個字符串標(biāo)注一個詞性,避免出現(xiàn)漢語歧義問題,進一步提高分詞效率、精確度。對上述例句進行詞性標(biāo)注和關(guān)鍵詞提取的部分代碼和結(jié)果如下:
##詞性標(biāo)注及關(guān)鍵字提取
print(′--------------詞性標(biāo)注及關(guān)鍵字提取--------------′)
import jieba.posseg as pseg
words=pseg.cut(hyper_str)
for word,flag in words:
print(′%s %s′%(word,flag))
--------詞性標(biāo)注及關(guān)鍵字提取結(jié)果--------
高 a
血壓 n
疾病 n
癥狀 n
有 v
哪些
? x
用戶在Web端進行檢索時會輸入某些問題,本文采用正則為每個問題設(shè)定語義模板,主要使用Re和REfO兩種正則模塊,兩者的區(qū)別是REfO適于任意序列的對象,而Re則是匹配字符串。用戶在Web端進行檢索時,平臺首先利用Re模塊將用戶的問題分詞處理后與Jena后端數(shù)據(jù)進行匹配,如果匹配成功則返回相應(yīng)結(jié)果,否則失敗。Re和REfO模塊代碼如下:
class W(Predicate):
def_init_(self,token=″.*″pos=″*)
# 正則表達式
self.token = re.compile(token + ″$″
self.pos = re.compile(pos+″$″
super(W,self)._init_(self.match)
def match(self,word):
m1 = self.token.match(word.token.decode(′utf-8′))
m2 = self.pos.match(word.pos)
return m1 and m2
def apply(self,sentence):
match =[]
for m in finditer(self.condition,sentece):
# m.span() 從頭部匹配
i,j = m.span()
matches.extend(sentence[i:j])
return self.action(matches),self.condition_num
#規(guī)則集合
rules=[
Rule(condition_num=2,condition=disease_entity+Star(Any(),greedy=False)+zhengzhuang_keyword + Star(Any(),greedy=False),action=QuestionSet.has_zhengzhuang_question),
Rule(condition_num=2,condition=disease_entity+Star(Any(),greedy=False)+bingfazheng_keyword + Star(Any(),greedy=False),action=QuestionSet.has_bingfazheng_question),
Rule(condition_num=2,condition=disease_entity+Star(Any(),greedy=False)+yufang_keyword+Star(Any(),greedy=False),action=QuestionSet.has_yufang_question),
Rule(condition_num=2,condition=disease_entity+Star(Any(),greedy=False)+gaishu_keyword+Star(Any(),greedy=False),action=QuestionSet.has_gaishu_question),
Rule(condition_num=2,condition=disease_entity+Star(Any(), greedy=False)+zhiliao_keyword,action=QuestionSet.has_zhiiao_question),
Rule(condition_num=2,condition=Star(Any(),greedy=False)+yufang_keyword+disease_entity,action=QuestionSet.has_yufang_question),
.....
]
for rule in self.rules:
# print(rule)#
word_objects是一個列表,元素是包含詞語和詞語對應(yīng)詞性的對象query,num = rule.apply(word_objects)
最后利用Pycharm平臺的Django項目來進行高血壓知識庫平臺Web端界面的開發(fā)。利用騰訊云服務(wù)器部署LNMP環(huán)境。將所有項目數(shù)據(jù)上傳,成功后啟動Apache Jena Fuseki服務(wù),在Python項目中啟動manage.py,界面成功運行。
本文利用本體技術(shù)構(gòu)建高血壓知識圖譜,人工智能大數(shù)據(jù)技術(shù)處理自然語言,Python語言實現(xiàn)基于本體的高血壓知識庫平臺開發(fā)。此平臺可以輔助醫(yī)生進行醫(yī)療活動,對公眾進行高血壓知識的普及,減緩就醫(yī)難和醫(yī)療資源緊張等問題?;诒倔w的高血壓知庫平臺構(gòu)建為其他慢病(糖尿病等)知識庫平臺構(gòu)建提供借鑒。后續(xù)的研究將對重慶市某醫(yī)院的電子病歷數(shù)據(jù)進行采集,進一步獲取高血壓的相關(guān)資料以對高血壓本體進行完善。