彭紅波,陳衍,張銘,葛煦,蔡宏偉,韓晟
1.第四軍醫大學口腔醫院 a.信息科;b.醫教部;2.第四軍醫大學西京醫院腫瘤科, 陜西 西安 710032
隨著信息技術的普及與發展,紙質病歷早已不能適應現代醫學的需求,電子病歷開始在醫院管理和醫療工作中出現[1]。初期,由于缺乏臨床信息系統支持,我國電子病歷[2]首先是從病程記錄編輯器開始發展的,期間經歷了Word、半結構化或結構化等編輯器的演變過程。近年來,檢查、檢驗、心電、手術麻醉等各類臨床信息系統的大力應用,完整的臨床數據集成、展現及智能化應用已成為電子病歷發展的方向[3]。不過,早期日積月累形成的大量非結構化電子病歷文檔(Word格式)卻給醫生檢索帶來了不便。雖然他們可以通過數據庫指定一些查詢條件來進行,但受限的檢索詞匯根本無法滿足醫療科研[4]的需要,因為這些條件都是事先定義好的信息。設想一下,如果有一種工具,它可以根據醫生輸入的任意條件對電子病歷內容進行全文檢索,這樣就可滿足醫生查詢的需求。Lucene為我們提供了一種實現途徑。
Lucene是一款以Java實現的成熟、自由、開源的軟件項目,也是Apache軟件基金(Apache Software Foundation)中的一個項目,并且基于Apache軟件許可協議授權。它是一類強大的Java搜索庫,是一類高性能的、可擴展的信息檢索(IR)工具,目的是為軟件開發人員提供簡單、易用的索引和搜索API,使之很方便地為應用程序添加搜索功能[5]。
Lucene專注于文本索引和搜索,它并不關心數據來源、格式,甚至不關心數據的語種,只要能把它轉換為文本格式即可。也就是說,它可以索引和搜索存儲在文件中的如下數據:遠程Web服務器上的網頁、本地文件系統中的文檔、簡單的文本文件、Word文檔、XML文檔、HTML文檔或者PDF文檔,或者其他能夠從中提取文本信息的數據格式。同樣,也可以利用Lucene來索引存儲在數據庫中的數據,以提供一些其他數據庫所不具備的全文搜索功能[5]。
Lucene的API接口設計得比較通用,輸入、輸出結構都很像數據庫的表→ 記錄 → 字段。很多傳統的應用文件、數據庫都可以很方便地映射到 Lucene 的存儲結構和接口中。總體上可以認為Lucene 是一個支持全文索引的數據庫系統,其索引/檢索原理,見圖1。在Lucene 中,待索引的文件對應一個文檔 (Document)數據結構,每個Document包含多個字段 ( Field)。Lucene 根據 Document 對象中的字段屬性和數據輸出的要求,為字段選擇不同的索引/存儲字段規則[6]。

非結構化文本通常具有一定的格式,其格式化文件一般結構較復雜,通常由多家廠商的不同系統生成,這些格式化文件使得普通程序讀取時無從下手,如電子病歷文檔保存的Word格式。不過,開源代碼卻為開發者處理格式化的非結構化文本處理提供了可能,當正確解析了文檔格式之后,開發者就可以像解析其他普通純文本文件一樣來索引和檢索文檔。
面對豐富的非結構化文本,用戶要求能通過關鍵詞檢索的方式快速獲得相關資料,再根據文檔的格式處理。搜索引擎或者全文檢索系統需要針對文本內容進行處理,必須提前解析文本格式、然后分析文本、最后將分析好的文本保存至索引中,只有這樣才能在其基礎上實現搜索功能[7]。其處理過程,見圖2。

Microsoft的Office格式非常復雜,包含了各種文檔屬性信息、文檔內的格式信息,甚至包含了復合文檔。文檔屬性信息主要包括文檔的標題、主題、摘要、類別、關鍵詞等;文檔內部的格式信息包括了文檔的字體、字號、表格、圖表,其他對象嵌入與鏈接(OLE2)的正文元素等。
POI(Office文檔的Java處理包)項目就是通過OLE2模式訪問Office文檔的,可讀取和修改Office的復雜文檔格式。POI提供的編程接口比較簡單,開發者可以使用POIFS以流的形式創建或打開文檔,然后將其連接到適當的數據訪問API,交互訪問文檔內容,而HWPF是針對Microsoft Word格式文件的讀取接口,包括用來提取簡單文本內容的WordExtractor、提取復雜文本內容的HWPFDocument以及針對文檔的修改方法接口。
2.3.1 使用HWPFDocument提取電子病歷文檔內容
HWPFDocument訪問Word文檔非常靈活,可以非常方便地訪問文檔內容的各個部分,包括段落、內部的表格等。本系統是通過FileInputStream對象,獲得對電子病歷文檔的流式訪問接口。進一步調用getRange()方法得到文檔內的Range對象名柄。Range對象提供了直接獲取所有文檔內容的text()方法,也提供了進一步訪問每一段落的getParagraph()后分別獲得文檔內容的方法。其實現代碼如下:
public static void GetWordDetail(String filename) throws Exception
{
FileInputStream in = new FileInputStream(new File(filename)) ;
HWPFDocument doc = new HWPFDocument(in) ;//獲得HWPFDocument對象
Range = range = doc.getRange() ;//取得Range對象
String text = range.text() ;
for(int i=0;i Paragraph p = range.getParagraph(i) ;//取得每個段落 text = p.text() ; text.trim(); System.out.println(text);} } 2.3.2 建立電子病歷文檔的索引 使用POI對電子病歷文檔分析后的結果,進一步分析處理可以非常方便地完成Lucene索引的創建和檢索。每個文檔的內容可以整體作為一個索引域添加到Lucene中,也可以把標題、屬性等信息分別建立索引域,完成整個索引,其實現代碼如下: 名稱:DocIndexBuilder 功能:構造電子病歷磁盤索引,添加內容到指定目錄,為后續檢索查詢做好準備。 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文件生成文檔對像 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("-----創建索引:電子病歷文件內容-----") ; TextIndex.addDocument(document) ;//添加文檔到索引 TextIndex.optimize() ; TextIndex.close() ;//索引完畢 }catch (IOException e){ e.printStackTrace() ; } System.out.println("-----創建索引:電子病歷文件索 引完成-----") ; } 從建立電子病歷文檔索引過程可以看出,如果電子病歷文檔還存在著其他的數據格式,只要我們能夠對其進行解析,從中提取文本信息,就可通過Lucene搜索引擎實現全文檢索功能。如:PDF格式,可以利用PDFBox開發包完成PDF文檔到純文本的轉換;XML[8]格式,其經常使用的開源分析器就有5種之多,包括DOM、SAX、JDOM、Xerces和DOM4J等。 本文對基于Lucene的非結構化電子病歷文檔的解析方法進行了探討,并編程實現了對Word格式電子病歷文檔文本數據的提取與索引[9]。程序的不足之處在于,還未對索引后的電子病歷文檔如何進行檢索加以描述,下一步將設計實現非結構化電子病歷文檔的全文檢索功能,以方便臨床醫生查詢[10]。 [1]王曉,羅二平,張健.基于語義的電子病歷智能全文檢索[J].醫療衛生裝備,2008,29(4):45-46. [2]尤麗玨.區域性電子病歷信息共享的探索和研究[J].中國醫療設備,2009,24(2):84-85. [3]陳金雄.電子病歷建設與發展[J].中國數字醫學,2011,6(5):53-55. [4]于建國,毛玉明.基于因特網的電子病歷系統的設計與安全技術[J].中國醫療設備, 2009,24(2):48-50. [5]Michael McCandless,Erik Hatcher,Otis Gospodnetic.Lucene實戰[M].2版.北京:人民郵電出版社,2011:6-7. [6]孫西全,馬瑞芳,李燕靈.基于Lucene的信息檢索的研究與應用[J].情報理論與實踐,2006,29(1):125-128. [7]王學松.Lucene+nutch搜索引擎開發[M].牛長流,譯.北京:人民郵電出版社,2008:185-186. [8]夏立新,王忠義.基于XML的全文檢索原型系統的設計與實現[J].現代圖書情報技術,2007,(8):67-70. [9]申兵一,鞏青歌.基于Lucene的PDF文檔文本解析的實現[J].信息與電腦,2009,(11):66. [10]范開洲,楊鵬飛.基于ASP技術的通用電子病歷的研究[J].中國醫療設備,2008,23(3):30-32.3 討論
4 結束語