楊美潔 張 興 熊相超
(重慶醫科大學醫學信息學院 重慶 400016)
高血壓是最常見的慢性病,也是心腦血管病最主要的危險因素[1]。隨著我國經濟的發展和人口的老齡化,高血壓患病率持續增加,高血壓引起的冠心病、腦卒中等疾病的致殘率、致命率高[2],在我國心腦血管疾病死亡的第1位危險因素是高血壓[3]。目前我國醫療資源緊張導致看病難等問題,在人工智能、大數據時代背景下,將新興信息技術應用到醫療服務中,使患者在家中通過網絡就能得到醫療建議,緩解就醫壓力。
目前關于高血壓本體構建和知識庫平臺的研究主要包括:張宇[4]等構建高血壓非藥物治療知識庫Web端界面,從Web獲取的大量文檔,利用文本分類技術以及詞頻(Term Frequency,TF)和文件頻率(Document Frequency,DF)方法提取文檔和類別特征,通過支持向量機(Support Vector Machine,SVM)方法對文檔分類,最后建立本地高血壓非藥物治療知識庫。吳昊[5]等提出基于本體和案例推理的高血壓診療系統的框架結構。鞏沐歌[6]等將高血壓疾病、知識庫和本體結合起來,構建具有推理功能的高血壓知識庫。張巍[7]等提出基于本體和案例推理的高血壓診療系統模型。構建高血壓領域本體及推理規則,使用Jess推理機進行推理操作,使用Jena實現對本體庫和案例庫并行的查詢。李博[8]等結合本體方法將文本臨床指南轉變成臨床指南知識庫。本文利用Python爬蟲技術爬取網絡高血壓數據,通過本體技術和Protege工具構建高血壓本體庫,描述領域概念及其之間的約束和聯系,將其存儲在Mysql數據庫中,本體構建完成后以RDF/XML形式存儲,用于網絡本體語言(Web Ontology Language,OWL)或規則推理。使用Jieba分詞與正則化技術對用戶輸入的自然語言進行分詞處理,Jena推理引擎返回結果,采用Python Web的Django框架進行構建前臺可視化界面。
高血壓知識庫平臺構建流程,見圖1。Studer等在1998年對本體定義為本體是共享概念明確的形式化規范說明[9]。本文參照《中國高血壓防治指南2017》版,結合Python爬取的高血壓網絡數據、相關文獻圖書等資料,借鑒7步法和骨架法,采用美國斯坦福大學開發的本體編輯軟件Protege 5.0軟件進行本體的構建[10]。主要構建高血壓的癥狀體征、檢查檢驗、藥物等。

圖1 高血壓知識庫平臺構建流程
高血壓本體模型,見圖2。本文構建高血壓的領域本體包括癥狀體征、檢查檢驗和藥物。其中癥狀體征主要表現為:頭暈、惡心、嘔吐、咳嗽、心悸、尿頻、四肢麻木、下肢水腫等。檢驗檢驗主要包括血壓、血尿素氮、肌酐、低高密度脂蛋白、膽固醇、三酰甘油等。抗高血壓藥物主要包括ACE和ARB、α受體阻滯劑、β受體阻滯劑、抗高血壓藥物、拮抗劑、利尿劑等。利用Protege 5.0為高血壓本體構建3大類,分別是檢查檢驗、藥物、癥狀。Protege中有兩個屬性定義,分別是類屬性和關系屬性。檢查檢驗類屬性項目、結果、單位、參考值;藥物類屬性:藥物名、副作用;癥狀類屬性:癥狀名、癥狀概述。構建3個類之間的關系屬性完成本體的構建。本體構建完成后以RDF/XML形式存儲,用于OWL或規則推理。Jena是一個開源的Java語義網框架,可構建語義網和鏈接數據應用。Jena利用TDB組件將上述構建的RDF形式的高血壓知識本體存儲起來,再通過資源描述框架定義集(Resource Description Framework Schema,RDFS)、OWL以及Jena的Rule Reasoner進行本體推理,進一步自動識別補全數據,避免數據缺失、失真等情況。最后使用Fuseki組件,通過SPARQL語言對RDF數據進行查詢,實現高效的知識提取。

圖2 高血壓本體模型
利用Python Web框架構建高血壓知識庫。通過Python的Django框架開發高血壓知識庫的Web端界面[11]。用戶在使用Web端進行查詢時需要將輸入的自然語言轉換成計算機識別的SPARQL語句,因此要用Python正則Refo模塊、中文分詞Jieba模塊,實現對高血壓知識中字符串及詞句段切、關鍵字提取等,將自然語言轉化為SPARQL語句,解析返回查詢結果。
在Python的Jieba模塊中加載自定義字典可實現對自然語言較準確的分詞。以輸入“高血壓癥狀體征有哪些?”為例,利用Python的Jieba模塊分詞的部分代碼和結果如下:
# 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默認分詞效果----------------------
高血壓/疾病癥狀/有/哪些/?
---------------加載自定義字典后,分詞效果---------------
高血壓/疾病/癥狀/有/哪些/?
為提高檢索查詢結果的效果和效率,需要對自然語言進行詞性標注[12]。詞性標注(Part-of-Speech Tagging)是指為分詞結果中每個字符串標注一個詞性,避免出現漢語歧義問題,進一步提高分詞效率、精確度。對上述例句進行詞性標注和關鍵詞提取的部分代碼和結果如下:
##詞性標注及關鍵字提取
print(′--------------詞性標注及關鍵字提取--------------′)
import jieba.posseg as pseg
words=pseg.cut(hyper_str)
for word,flag in words:
print(′%s %s′%(word,flag))
--------詞性標注及關鍵字提取結果--------
高 a
血壓 n
疾病 n
癥狀 n
有 v
哪些
? x
用戶在Web端進行檢索時會輸入某些問題,本文采用正則為每個問題設定語義模板,主要使用Re和REfO兩種正則模塊,兩者的區別是REfO適于任意序列的對象,而Re則是匹配字符串。用戶在Web端進行檢索時,平臺首先利用Re模塊將用戶的問題分詞處理后與Jena后端數據進行匹配,如果匹配成功則返回相應結果,否則失敗。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
#規則集合
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是一個列表,元素是包含詞語和詞語對應詞性的對象query,num = rule.apply(word_objects)
最后利用Pycharm平臺的Django項目來進行高血壓知識庫平臺Web端界面的開發。利用騰訊云服務器部署LNMP環境。將所有項目數據上傳,成功后啟動Apache Jena Fuseki服務,在Python項目中啟動manage.py,界面成功運行。
本文利用本體技術構建高血壓知識圖譜,人工智能大數據技術處理自然語言,Python語言實現基于本體的高血壓知識庫平臺開發。此平臺可以輔助醫生進行醫療活動,對公眾進行高血壓知識的普及,減緩就醫難和醫療資源緊張等問題。基于本體的高血壓知庫平臺構建為其他慢病(糖尿病等)知識庫平臺構建提供借鑒。后續的研究將對重慶市某醫院的電子病歷數據進行采集,進一步獲取高血壓的相關資料以對高血壓本體進行完善。