區(qū)卓越,覃姜維,趙 峰,孫曉翠,4*
(1.廣東藥科大學(xué)醫(yī)藥信息工程學(xué)院,廣州 510006;2. 廣東工業(yè)大學(xué)數(shù)學(xué)與統(tǒng)計學(xué)院,廣州 510520;3. 中鐵工程設(shè)計咨詢集團(tuán)有限公司,北京 100071;4. 廣東普通高校工程技術(shù)研究中心-醫(yī)藥信息真實世界工程技術(shù)研究中心,廣州 510006)
2000 年以來,隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展以及數(shù)據(jù)之間高度交叉的發(fā)展趨勢,再加上民眾對健康意識、醫(yī)藥意識的逐步增強(qiáng),民眾對于中醫(yī)藥信息的需求日益增加,鑒于此,中醫(yī)藥信息融合的相關(guān)應(yīng)用研究推陳出新。其中,設(shè)計以中醫(yī)藥信息為導(dǎo)向的搜索引擎是滿足信息搜尋需求的好方法。分析國內(nèi)外現(xiàn)有的信息檢索系統(tǒng),存在以下問題,一是缺乏針對性,如今市面上搜索引擎的檢索對象過于寬泛,并不是面向某一特定領(lǐng)域的垂直搜索引擎[1],沒有對中醫(yī)藥信息做出針對性的歸納、關(guān)聯(lián)處理與融合[2],用戶需花費(fèi)大量時間在無關(guān)數(shù)據(jù)中獲取所需的中醫(yī)藥信息。隨著數(shù)據(jù)采集量的增多與數(shù)據(jù)更新頻率的增高,加之缺乏必要的數(shù)據(jù)過濾與篩選[3],搜索引擎的檢索信息有效率與使用率會逐步下降,難以實現(xiàn)對中醫(yī)藥信息的針對性搜索服務(wù);二是欠缺共享性,由于中醫(yī)藥信息來源分散,數(shù)據(jù)呈現(xiàn)形式多樣化,數(shù)據(jù)結(jié)構(gòu)形式不盡相同,傳統(tǒng)的基于SQL 語句的信息檢索系統(tǒng)難以實現(xiàn)對中醫(yī)藥信息的精確搜索。即便是使用非關(guān)系型的數(shù)據(jù)庫對數(shù)據(jù)進(jìn)行存儲,也難以根據(jù)數(shù)據(jù)的重要性做出預(yù)測性的結(jié)果排序返回至用戶[4],造成存儲空間、算力資源和數(shù)據(jù)價值的浪費(fèi)。隨著國家“互聯(lián)網(wǎng)+”戰(zhàn)略的實施與“大健康”理念的提出,在大數(shù)據(jù)時代下[5],信息化能有效推動經(jīng)濟(jì)社會發(fā)展,有效推進(jìn)以國內(nèi)大循環(huán)為主體的新發(fā)展格局的構(gòu)建。就中醫(yī)藥現(xiàn)代化、中醫(yī)藥信息化來講,亟需構(gòu)建以信息技術(shù)為中心的醫(yī)藥數(shù)據(jù)處理分析[6]、數(shù)據(jù)挖掘[7-9]、知識發(fā)現(xiàn)[10]等服務(wù)建設(shè)面向中醫(yī)藥信息的搜索引擎,提供大眾的醫(yī)藥信息獲取途徑,喚醒民眾的醫(yī)藥健康意識,并為衛(wèi)生部門提供中醫(yī)藥信息普及宣傳的輿論口,為監(jiān)管部門把握醫(yī)藥信息化發(fā)展現(xiàn)狀、制定政策、定制惠民服務(wù)等提供輔助決策支持[11],也可搭配其他內(nèi)容管理系統(tǒng)平臺如Drupal[12]、WordPress[13]或Joomla[14]進(jìn)行中醫(yī)藥信息的深度利用與挖掘。
本文從現(xiàn)實出發(fā),充分考慮當(dāng)今數(shù)字時代尤其是疫情時代下的實際情況,秉承中醫(yī)藥現(xiàn)代化與中醫(yī)藥信息融合應(yīng)用的發(fā)展理念,設(shè)計并實現(xiàn)一款“中醫(yī)藥信息搜索引擎”。該搜索引擎以開源軟件Nutch 為基礎(chǔ),結(jié)合其“網(wǎng)絡(luò)爬蟲”與“全文搜索”兩大功能,解決了漢字識別與搜索的改進(jìn)、以用戶友好性為導(dǎo)向的網(wǎng)頁UI 優(yōu)化等問題,實現(xiàn)了類似百度、必應(yīng)、Yandex 等搜索引擎的功能,減少了無關(guān)信息如廣告商、營銷號的干擾,使獲取中醫(yī)藥信息的過程更加便捷、精確,更有針對性地、高效地向民眾提供實用的中醫(yī)藥信息。
經(jīng)過比較后[15],決定使用Nutch進(jìn)行項目搭建。Nutch 是Apach Lucene 下屬的一個高度可擴(kuò)展、成熟的Web 爬蟲程序,用于處理各種數(shù)據(jù)采集任務(wù),包括“網(wǎng)絡(luò)爬蟲”和“全文搜索”兩大部分,是一個優(yōu)秀的、基于Java 的開源爬蟲軟件,在城市交通[16]、社交情報[17]、電商貿(mào)易[18]、就業(yè)招聘[19]等領(lǐng)域有廣泛應(yīng)用前例。本項目將會基于Nutch設(shè)計與實現(xiàn)中醫(yī)藥信息搜索引擎。Nutch的工作流程如圖1所示。
圖1 Nutch工作流程
其步驟可總結(jié)如下:
(1)注入(inject)初試URL:將管理員提供的URL 進(jìn)行統(tǒng)一化及過濾非法URL、重復(fù)URL后,將剩余的可用URL 及其最新狀態(tài)存入Crawldb數(shù)據(jù)庫。
(2)生成(generate)新的segment:按照Crawldb中的URL生成抓取列表并存入segments目錄中。
(3)網(wǎng)絡(luò)抓?。╢etch):按照上一步在segments目錄中生成的抓取列表進(jìn)行抓取,同時對抓取內(nèi)容解析。
(4)內(nèi)容解析(parse):將抓取的內(nèi)容解析為兩大部分:URL與數(shù)據(jù)內(nèi)容。
(5)更新(update)Crawldb:更新存儲URL的Crawldb,為下一輪的抓取做好新的URL準(zhǔn)備。
(6)建索引(index):由于Nutch 是Apache Lucene的子項目,Nutch使用Lucene完成數(shù)據(jù)索引,通過索引庫完成用戶搜索的功能。
(7)用戶搜索:用戶鍵入關(guān)鍵字進(jìn)行檢索,Nutch 檢索到內(nèi)容后,將結(jié)果按照一定的算法打分后排序并返回至用戶。
上述過程中的步驟(1)~(6)即“網(wǎng)絡(luò)爬蟲”部分,步驟(7)即為“全文搜索”部分。
概括來講,Nutch 是以管理員給定的網(wǎng)站作為入口進(jìn)行爬取,將所爬取的內(nèi)容進(jìn)行解析,并建立相應(yīng)的爬取結(jié)果索引,再通過一定的算法對搜索結(jié)果進(jìn)行評分、排序以響應(yīng)用戶的搜索需求,以實現(xiàn)爬取、建索引、搜索的高度統(tǒng)一。
在1.1 的工作流程步驟(7)中,Nutch 使用評分機(jī)制對搜索結(jié)果進(jìn)行評分,按照分?jǐn)?shù)排序后返回至用戶。
Nutch 構(gòu)建于Apach Lucene 之上,在Lucene中,文檔的分?jǐn)?shù)受用戶查詢語句影響,在用戶進(jìn)行搜索時實時返回排序結(jié)果。而Lucene 的評分機(jī)制在Lucene的Similarity類中,用公式表示,即:
公式(1)基于TF-IDF 算法進(jìn)行評分(具體解釋見表1),通過查詢詞項在文檔中出現(xiàn)的頻率TF 與詞項在整個文檔集合中的逆文檔頻率IDF進(jìn)行計算[20]。TF-IDF算法公式如下:
表1 Lucene得分計算公式解釋
基于Nutch進(jìn)行開發(fā)后的中醫(yī)藥信息搜索引擎如圖2所示,此時輸入英文或數(shù)字才能正常搜索;若輸入中文搜索,則會出現(xiàn)亂碼,搜索失敗,如圖3所示。
圖2 輸入“Ginseng(人參)”搜索
圖3 搜索中文出現(xiàn)亂碼
仍然面臨的難題,一是Nutch本身不支持對中文的識別與搜索,鍵入漢字進(jìn)行檢索時,頁面會發(fā)生亂碼現(xiàn)象;二是Nutch的頁面對檢索結(jié)果的呈現(xiàn)過于簡陋,效率低下,缺乏用戶友好性。下面介紹漢字識別與搜索的改進(jìn)、以用戶友好性為導(dǎo)向的網(wǎng)頁UI優(yōu)化等問題的實現(xiàn)方法。
長久以來,漢字的識別與搜索一直是國內(nèi)研究的重點(diǎn)課題之一。為了解決漢字的識別與劃分,涌現(xiàn)了許多優(yōu)秀的漢字分詞組件,如北京理工大學(xué)張華平博士團(tuán)隊研發(fā)的NLPIRICTCLAS 分詞系統(tǒng)[21]、清華大學(xué)自然語言處理與社會人文計算實驗室研發(fā)的THULAC 分詞包[22]、盤古分詞等,也有學(xué)者使用詞典進(jìn)行中文分詞。由于Nutch源于外國,故其對漢字的搜索與識別能力低,甚至?xí)霈F(xiàn)無法搜索、亂碼等情況,故需要對其進(jìn)行優(yōu)化與改進(jìn),使其支持漢字的識別與搜索。Tan 等[23]曾探索過Nutch處理中文索引的優(yōu)化方案。綜合比較各種方案[24-26],本項目將使用漢字分詞組件IKAnalyzer對Nutch 進(jìn)行優(yōu)化和改進(jìn)。
同Nutch 一樣,IKAnalyzer 也基于Java 語言開發(fā),是一個輕量級的漢字分詞組件工具包。IKAnalyzer 使用“正向迭代最細(xì)粒度切分算法”進(jìn)行漢字分詞,主要包含“細(xì)粒度”和“智能分詞”兩種切分模式,不僅可實現(xiàn)中文分詞處理,還兼容日文、朝鮮文字符等[27]。
為使Nutch 實現(xiàn)基于IKAnalyzer 的中文分詞,具體來講,即是修改Nutch 相關(guān)代碼接口、xml 文件,將分詞軟件嵌入Nutch 后,使用javacc 再次進(jìn)行編譯,即可使其支持中文的識別與搜索功能。
首先,改寫安裝目錄/src/java/org/apache/nutch/searcher 下的Query.java,為其導(dǎo)入一個org.apache.nutch.analysis 包下的異常類ParseException,同時改寫line 456附近的parse函數(shù),使它拋出一個異常ParseException,用以處理解析特點(diǎn)語言(中文)時發(fā)生的異常事件。
接著,修改上方目錄中/analysis 路徑下的NutchAnalysis.jj,將其從按字劃分修改為按詞劃分。具體來講,就是將該文件中l(wèi)ine 130 附近的“|
在新生成的java 文件中,找到NutchAnalysis.java,所有用于解析文本的分詞插件都需要重寫實現(xiàn)NutchAnalyzer 類中的tokenStream 抽象方法,首先為其導(dǎo)入包org.wltea.analyzer.lucene.IKTokenizer,同時重新編寫line 51 附近的兩個parseQuery 函數(shù),具體地,即分別讓它們拋出異常ParseException,處理解析字符串時發(fā)生的異常事件。接下來繼續(xù)修改繼承自NutchAnalyzer的NutchDocumentAnalyzer類。
修改同一目錄下的NutchDocumentAnalyzer.java,為其添加分詞組件IKAnalyzer,使用IKAnalyzer 的分詞方法替換實現(xiàn)Nutch 原來的分詞方法。具體方法是,在該文件中導(dǎo)入包org.wltea.analyzer.lucene.IKAnalyzer 和org.apache.lucene.analysis.tokenattributes.*,同時重新編寫line 110 附近處的函數(shù),為其加入IKAnalyzer 實例。具體地,即將原代碼的analyzer 對象賦值為IKAnalyzer實例并返回。
上述各類的繼承關(guān)系如圖4所示。
圖4 類間繼承關(guān)系的UML
其中的Analyzer 抽象類用作Nutch 的底層分析器,其來自于2.2 小節(jié)提到的Lucene。陰影部分則是經(jīng)過優(yōu)化的部分。
接下來按Nutch 安裝目錄下的配置文件build.xml 添加分詞包的信息。在Nutch 目錄下執(zhí)行ant 編譯命令,它自動找到build.xml 并開始執(zhí)行。
執(zhí)行成功后,繼續(xù)用“ant war”編譯,可以在build目錄下得到以“nutch-1.2”為名的“.job”“.war”以及“.jar”文件,將上述三個文件覆蓋Nutch目錄下的同名文件。
此時需要更改tomcat 服務(wù)器的設(shè)置,將上述的“nutch-1.2.war”復(fù)制至tomcat 安裝目錄中的webapp 目錄,待其自動解壓。并在解壓后目錄中的/WEB-INF/classes 中修改nutch-site.xml,添加屬性“plugin.includes”,賦值為“protocolhttp”“urlfilter-regex”“analysis-(zh)”等,否則無法顯示搜索結(jié)果而顯示空白。
然后修改tomcat/conf 下的server.xml,找到下列屬性并修改:
然后重啟tomcat。此時可以使用中文查詢,如以“頭痛”為關(guān)鍵字搜索,結(jié)果見圖5,可見此時Nutch已支持漢字的識別與搜索。
圖5 優(yōu)化后支持漢字的中醫(yī)藥信息搜索引擎
加入中文分詞插件優(yōu)化后的Nutch工作流程如圖6所示,對比圖1,陰影部分則為優(yōu)化部分。
圖6 優(yōu)化后的Nutch工作流程
Nutch 本身的搜索結(jié)果呈現(xiàn)頁面較簡單,極度缺少用戶友好性。故需對頁面UI 進(jìn)行優(yōu)化改進(jìn),使其搜索結(jié)果更加突出,對用戶更友好。
首先,找出index.jsp 頁面,這個是Nutch 默認(rèn)的首頁,需要根據(jù)中醫(yī)藥特色重寫該頁面,刪除其語言選擇、幫助、Nutch 介紹等無關(guān)緊要的功能,加入面向中醫(yī)藥信息的內(nèi)容。
其次,核心是對search.jsp 頁面的重寫。如刪除“
同時,將“”>”改為“”,增加可讀性;同時可刪除下兩行的queryLang 和anchors,項目不需要該額外搜索結(jié)果。
其中標(biāo)簽有“i18n”字眼的靜態(tài)代碼用以自動生成搜索結(jié)果數(shù)值統(tǒng)計,被寫死以至于無法顯示成中文,故將其刪除,并將搜索結(jié)果數(shù)值統(tǒng)計改成:
為使搜索結(jié)果的關(guān)鍵字在頁面中高亮顯示、更加突出,修改./include/style.html的CSS配置文件,譬如將.highlight 的樣式屬性修改為紅色、加粗等,符合用戶閱讀習(xí)慣,更具用戶友好性。
優(yōu)化完成后,重啟tomcat 服務(wù)器,打開搜索頁面,可見美觀許多(見圖7)。輸入文字搜索,搜索結(jié)果加粗、標(biāo)紅,更加突出(圖8)。
圖7 頁面UI優(yōu)化后效果
圖8 以用戶友好性為導(dǎo)向的搜索結(jié)果頁面
基于Nutch的中醫(yī)藥信息搜索引擎優(yōu)化改進(jìn)前后,發(fā)生的改變具體見表2。
表2 優(yōu)化前后對比
本文首先對Nutch的組成、工作流程等特點(diǎn)進(jìn)行了描述與介紹,提出了疫情時代下民眾獲取中醫(yī)藥信息的新穎解決方法,即基于Nutch構(gòu)建中醫(yī)藥信息搜索引擎。鑒于Nutch不支持漢字的識別與搜索,使用漢字分詞組件IKAnalyzer對Nutch 進(jìn)行優(yōu)化改造,提高了中文醫(yī)藥信息識別與搜索的準(zhǔn)確性;并優(yōu)化網(wǎng)頁UI 使搜索結(jié)果更加突出?;贜utch的中醫(yī)藥信息搜索引擎契合當(dāng)今“互聯(lián)網(wǎng)+”的時代發(fā)展潮流,符合醫(yī)藥信息化的發(fā)展趨勢,是中醫(yī)藥現(xiàn)代化的一個應(yīng)用嘗試,能有效地處理、存儲、分享醫(yī)藥數(shù)據(jù),相信在中醫(yī)藥信息資源處理的未來發(fā)展中會受到越來越多的重視。