彭紅波,陳衍,張銘,葛煦,蔡宏偉,韓晟
1.第四軍醫(yī)大學(xué)口腔醫(yī)院 a.信息科;b.醫(yī)教部;2.第四軍醫(yī)大學(xué)西京醫(yī)院腫瘤科, 陜西 西安 710032
隨著信息技術(shù)的普及與發(fā)展,紙質(zhì)病歷早已不能適應(yīng)現(xiàn)代醫(yī)學(xué)的需求,電子病歷開始在醫(yī)院管理和醫(yī)療工作中出現(xiàn)[1]。初期,由于缺乏臨床信息系統(tǒng)支持,我國電子病歷[2]首先是從病程記錄編輯器開始發(fā)展的,期間經(jīng)歷了Word、半結(jié)構(gòu)化或結(jié)構(gòu)化等編輯器的演變過程。近年來,檢查、檢驗(yàn)、心電、手術(shù)麻醉等各類臨床信息系統(tǒng)的大力應(yīng)用,完整的臨床數(shù)據(jù)集成、展現(xiàn)及智能化應(yīng)用已成為電子病歷發(fā)展的方向[3]。不過,早期日積月累形成的大量非結(jié)構(gòu)化電子病歷文檔(Word格式)卻給醫(yī)生檢索帶來了不便。雖然他們可以通過數(shù)據(jù)庫指定一些查詢條件來進(jìn)行,但受限的檢索詞匯根本無法滿足醫(yī)療科研[4]的需要,因?yàn)檫@些條件都是事先定義好的信息。設(shè)想一下,如果有一種工具,它可以根據(jù)醫(yī)生輸入的任意條件對(duì)電子病歷內(nèi)容進(jìn)行全文檢索,這樣就可滿足醫(yī)生查詢的需求。Lucene為我們提供了一種實(shí)現(xiàn)途徑。
Lucene是一款以Java實(shí)現(xiàn)的成熟、自由、開源的軟件項(xiàng)目,也是Apache軟件基金(Apache Software Foundation)中的一個(gè)項(xiàng)目,并且基于Apache軟件許可協(xié)議授權(quán)。它是一類強(qiáng)大的Java搜索庫,是一類高性能的、可擴(kuò)展的信息檢索(IR)工具,目的是為軟件開發(fā)人員提供簡單、易用的索引和搜索API,使之很方便地為應(yīng)用程序添加搜索功能[5]。
Lucene專注于文本索引和搜索,它并不關(guān)心數(shù)據(jù)來源、格式,甚至不關(guān)心數(shù)據(jù)的語種,只要能把它轉(zhuǎn)換為文本格式即可。也就是說,它可以索引和搜索存儲(chǔ)在文件中的如下數(shù)據(jù):遠(yuǎn)程Web服務(wù)器上的網(wǎng)頁、本地文件系統(tǒng)中的文檔、簡單的文本文件、Word文檔、XML文檔、HTML文檔或者PDF文檔,或者其他能夠從中提取文本信息的數(shù)據(jù)格式。同樣,也可以利用Lucene來索引存儲(chǔ)在數(shù)據(jù)庫中的數(shù)據(jù),以提供一些其他數(shù)據(jù)庫所不具備的全文搜索功能[5]。
Lucene的API接口設(shè)計(jì)得比較通用,輸入、輸出結(jié)構(gòu)都很像數(shù)據(jù)庫的表→ 記錄 → 字段。很多傳統(tǒng)的應(yīng)用文件、數(shù)據(jù)庫都可以很方便地映射到 Lucene 的存儲(chǔ)結(jié)構(gòu)和接口中。總體上可以認(rèn)為Lucene 是一個(gè)支持全文索引的數(shù)據(jù)庫系統(tǒng),其索引/檢索原理,見圖1。在Lucene 中,待索引的文件對(duì)應(yīng)一個(gè)文檔 (Document)數(shù)據(jù)結(jié)構(gòu),每個(gè)Document包含多個(gè)字段 ( Field)。Lucene 根據(jù) Document 對(duì)象中的字段屬性和數(shù)據(jù)輸出的要求,為字段選擇不同的索引/存儲(chǔ)字段規(guī)則[6]。
非結(jié)構(gòu)化文本通常具有一定的格式,其格式化文件一般結(jié)構(gòu)較復(fù)雜,通常由多家廠商的不同系統(tǒng)生成,這些格式化文件使得普通程序讀取時(shí)無從下手,如電子病歷文檔保存的Word格式。不過,開源代碼卻為開發(fā)者處理格式化的非結(jié)構(gòu)化文本處理提供了可能,當(dāng)正確解析了文檔格式之后,開發(fā)者就可以像解析其他普通純文本文件一樣來索引和檢索文檔。
面對(duì)豐富的非結(jié)構(gòu)化文本,用戶要求能通過關(guān)鍵詞檢索的方式快速獲得相關(guān)資料,再根據(jù)文檔的格式處理。搜索引擎或者全文檢索系統(tǒng)需要針對(duì)文本內(nèi)容進(jìn)行處理,必須提前解析文本格式、然后分析文本、最后將分析好的文本保存至索引中,只有這樣才能在其基礎(chǔ)上實(shí)現(xiàn)搜索功能[7]。其處理過程,見圖2。
Microsoft的Office格式非常復(fù)雜,包含了各種文檔屬性信息、文檔內(nèi)的格式信息,甚至包含了復(fù)合文檔。文檔屬性信息主要包括文檔的標(biāo)題、主題、摘要、類別、關(guān)鍵詞等;文檔內(nèi)部的格式信息包括了文檔的字體、字號(hào)、表格、圖表,其他對(duì)象嵌入與鏈接(OLE2)的正文元素等。
POI(Office文檔的Java處理包)項(xiàng)目就是通過OLE2模式訪問Office文檔的,可讀取和修改Office的復(fù)雜文檔格式。POI提供的編程接口比較簡單,開發(fā)者可以使用POIFS以流的形式創(chuàng)建或打開文檔,然后將其連接到適當(dāng)?shù)臄?shù)據(jù)訪問API,交互訪問文檔內(nèi)容,而HWPF是針對(duì)Microsoft Word格式文件的讀取接口,包括用來提取簡單文本內(nèi)容的WordExtractor、提取復(fù)雜文本內(nèi)容的HWPFDocument以及針對(duì)文檔的修改方法接口。
2.3.1 使用HWPFDocument提取電子病歷文檔內(nèi)容
HWPFDocument訪問Word文檔非常靈活,可以非常方便地訪問文檔內(nèi)容的各個(gè)部分,包括段落、內(nèi)部的表格等。本系統(tǒng)是通過FileInputStream對(duì)象,獲得對(duì)電子病歷文檔的流式訪問接口。進(jìn)一步調(diào)用getRange()方法得到文檔內(nèi)的Range對(duì)象名柄。Range對(duì)象提供了直接獲取所有文檔內(nèi)容的text()方法,也提供了進(jìn)一步訪問每一段落的getParagraph()后分別獲得文檔內(nèi)容的方法。其實(shí)現(xiàn)代碼如下:
public static void GetWordDetail(String filename) throws Exception
{
FileInputStream in = new FileInputStream(new File(filename)) ;
HWPFDocument doc = new HWPFDocument(in) ;//獲得HWPFDocument對(duì)象
Range = range = doc.getRange() ;//取得Range對(duì)象
String text = range.text() ;
for(int i=0;i Paragraph p = range.getParagraph(i) ;//取得每個(gè)段落 text = p.text() ; text.trim(); System.out.println(text);} } 2.3.2 建立電子病歷文檔的索引 使用POI對(duì)電子病歷文檔分析后的結(jié)果,進(jìn)一步分析處理可以非常方便地完成Lucene索引的創(chuàng)建和檢索。每個(gè)文檔的內(nèi)容可以整體作為一個(gè)索引域添加到Lucene中,也可以把標(biāo)題、屬性等信息分別建立索引域,完成整個(gè)索引,其實(shí)現(xiàn)代碼如下: 名稱:DocIndexBuilder 功能:構(gòu)造電子病歷磁盤索引,添加內(nèi)容到指定目錄,為后續(xù)檢索查詢做好準(zhǔn)備。 public static void DocIndexBuilder(){ try{Analyzer TextAnalyzer = new ChineseAnalyzer() ; IndexWriter TextIndex = new IndexWriter(Dest_Index_Path,TextAnalyzer,true) ;//生成索引器 TextIndex.setUseCompoundFile(true) ; Document document = new Document() ;//由word文件生成文檔對(duì)像 FileInputStream in = new FileInputStream(new File(docfileToBeRead)) ; HWPFDocument doc = new HWPFDocument(in); Range range = doc.getRange() ; String text = range.text() ; Field field_doc = new Field("doc",text,Field.Store.YES,Field.Index.TOKENIZED) ; document.add(field_doc) ; System.out.println("-----創(chuàng)建索引:電子病歷文件內(nèi)容-----") ; TextIndex.addDocument(document) ;//添加文檔到索引 TextIndex.optimize() ; TextIndex.close() ;//索引完畢 }catch (IOException e){ e.printStackTrace() ; } System.out.println("-----創(chuàng)建索引:電子病歷文件索 引完成-----") ; } 從建立電子病歷文檔索引過程可以看出,如果電子病歷文檔還存在著其他的數(shù)據(jù)格式,只要我們能夠?qū)ζ溥M(jìn)行解析,從中提取文本信息,就可通過Lucene搜索引擎實(shí)現(xiàn)全文檢索功能。如:PDF格式,可以利用PDFBox開發(fā)包完成PDF文檔到純文本的轉(zhuǎn)換;XML[8]格式,其經(jīng)常使用的開源分析器就有5種之多,包括DOM、SAX、JDOM、Xerces和DOM4J等。 本文對(duì)基于Lucene的非結(jié)構(gòu)化電子病歷文檔的解析方法進(jìn)行了探討,并編程實(shí)現(xiàn)了對(duì)Word格式電子病歷文檔文本數(shù)據(jù)的提取與索引[9]。程序的不足之處在于,還未對(duì)索引后的電子病歷文檔如何進(jìn)行檢索加以描述,下一步將設(shè)計(jì)實(shí)現(xiàn)非結(jié)構(gòu)化電子病歷文檔的全文檢索功能,以方便臨床醫(yī)生查詢[10]。 [1]王曉,羅二平,張健.基于語義的電子病歷智能全文檢索[J].醫(yī)療衛(wèi)生裝備,2008,29(4):45-46. [2]尤麗玨.區(qū)域性電子病歷信息共享的探索和研究[J].中國醫(yī)療設(shè)備,2009,24(2):84-85. [3]陳金雄.電子病歷建設(shè)與發(fā)展[J].中國數(shù)字醫(yī)學(xué),2011,6(5):53-55. [4]于建國,毛玉明.基于因特網(wǎng)的電子病歷系統(tǒng)的設(shè)計(jì)與安全技術(shù)[J].中國醫(yī)療設(shè)備, 2009,24(2):48-50. [5]Michael McCandless,Erik Hatcher,Otis Gospodnetic.Lucene實(shí)戰(zhàn)[M].2版.北京:人民郵電出版社,2011:6-7. [6]孫西全,馬瑞芳,李燕靈.基于Lucene的信息檢索的研究與應(yīng)用[J].情報(bào)理論與實(shí)踐,2006,29(1):125-128. [7]王學(xué)松.Lucene+nutch搜索引擎開發(fā)[M].牛長流,譯.北京:人民郵電出版社,2008:185-186. [8]夏立新,王忠義.基于XML的全文檢索原型系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代圖書情報(bào)技術(shù),2007,(8):67-70. [9]申兵一,鞏青歌.基于Lucene的PDF文檔文本解析的實(shí)現(xiàn)[J].信息與電腦,2009,(11):66. [10]范開洲,楊鵬飛.基于ASP技術(shù)的通用電子病歷的研究[J].中國醫(yī)療設(shè)備,2008,23(3):30-32.3 討論
4 結(jié)束語