賀偉雄,汪穎,黃曉夏
(武警部隊研究院,北京 100012)
指標作為一種可持續(xù)的評估工具,通過將復雜數(shù)據(jù)總結(jié)和濃縮為有意義的信息,可以方便地跟蹤一個時間段的進展情況,并能幫助用戶發(fā)現(xiàn)可能存在的問題和關(guān)聯(lián)因素[1]。指標廣泛用于各類研究報告,以確定政策方向并回應(yīng)公眾關(guān)切[2]。由于單一指標只能反映研究對象某方面的情況,難以捕捉多維現(xiàn)象,因此指標體系的使用頻率越來越高[3]。一般來說,指標體系是匯聚各維度的指標并基于特定公式進行構(gòu)建,因此能夠更好地總結(jié)復雜現(xiàn)象,著名的指標體系包括聯(lián)合國可持續(xù)發(fā)展目標[4]和千年生態(tài)系統(tǒng)評估報告[5]等。
在構(gòu)建指標體系的過程中,指標項通常分為若干個層級,上層指標項依賴多個下層指標項,而下層指標項還需要通過數(shù)據(jù)項計算得到結(jié)果,指標項和數(shù)據(jù)項之間復雜的依賴關(guān)系,使得每一次修改都會引起指標聯(lián)動,使得改動成本迅速增加。為了全面評價社會經(jīng)濟體的建設(shè)發(fā)展水平,需要構(gòu)建數(shù)以千計的指標,極大地推高了構(gòu)建與修改成本。因此,在構(gòu)建大規(guī)模指標體系的過程中,如何使用軟件自動化方法讓指標自動聯(lián)動,從而保證指標體系的一致性,是亟待解決的難題。目前學者們對指標體系的研究重點主要集中在如何構(gòu)建某一領(lǐng)域的指標體系,例如網(wǎng)絡(luò)輿情指標體系[6]、指揮信息系統(tǒng)指標體系[7]、城市生態(tài)文明建設(shè)指標體系[8]等,但很少涉及到指標體系的一致性問題。
針對以上問題,本文在分析指標體系通用結(jié)構(gòu)的基礎(chǔ)上,從數(shù)據(jù)關(guān)系一致性和文本語義一致性兩方面提出指標體系整體一致性的概念。為構(gòu)建實用的指標構(gòu)建系統(tǒng),分析系統(tǒng)功能需求,比較常用的跨平臺技術(shù),設(shè)計系統(tǒng)框架和數(shù)據(jù)庫結(jié)構(gòu),并采用Electron和React.js結(jié)合實現(xiàn)跨平臺指標體系構(gòu)建系統(tǒng)的各個功能模塊。
指標體系通常包括指標項和數(shù)據(jù)項兩部分[9]。指標項由名稱、釋義、算法和所需數(shù)據(jù)等構(gòu)成,數(shù)據(jù)則由數(shù)據(jù)項名稱、來源、量綱、取值范圍等構(gòu)成。指標根據(jù)所處層級的不同分為一級指標、二級指標等,上層指標項依賴于下層指標項,所有的指標項都包含若干數(shù)據(jù)項,各組成部分的關(guān)系如圖1所示,圖中箭頭表示依賴關(guān)系。
圖1 指標體系結(jié)構(gòu)圖
在構(gòu)建指標體系的過程中,為保證體系的科學性、可測性、導向性[6],需要經(jīng)常修改指標項和數(shù)據(jù)項。例如,數(shù)據(jù)項如果難以獲取,則需要刪除該數(shù)據(jù)項。如此一來,所有使用該數(shù)據(jù)項的指標均不可用,并且所有依賴這些指標項的上級指標也要進行修改,以保證依賴的正確性。為了構(gòu)建科學完備的指標體系,將指標體系“整體一致性”定義為:指標體系中所有指標項之間,以及指標項與數(shù)據(jù)項之間正確的依賴關(guān)系。
定義中所指的依賴關(guān)系包含兩層意思:①數(shù)據(jù)關(guān)系一致性約束,即所有使用到的指標和數(shù)據(jù)必須都存在,不能存在已刪除的數(shù)據(jù)項還被某一指標項使用的情況,并且同一指標和數(shù)據(jù)項在指標體系顯示和使用時,它的名稱、含義、計量單位等屬性必須一致。②文本語義一致性約束,即所有指標和數(shù)據(jù)項修改前和修改后的含義要基本一致。因為如果含義完全改變,那么所有依賴這些項目的指標也會變得不可靠。
指標體系構(gòu)建系統(tǒng)需要完成的主要功能有兩項,分別是數(shù)據(jù)項和指標項功能。
(1)數(shù)據(jù)項功能。主要完成數(shù)據(jù)的“CRUD”(Create/Retrieve/Update/Delete,即創(chuàng)建、讀取、修改、刪除),刪除時激活數(shù)據(jù)關(guān)系一致性約束,修改時激活文本語義一致性約束。
(2)指標項功能。主要進行指標的“CRUD”,與數(shù)據(jù)項類似,刪除和修改指標時都會激活一致性檢查。由于指標體系設(shè)計完畢后,最終還要形成文檔進行展示,因此指標項功能需要以Word的形式導出為指標文檔。
功能性需求只是系統(tǒng)的一部分。設(shè)計和實現(xiàn)系統(tǒng)時,還需要考慮用戶體驗、平臺兼容性等非功能性需求。
(1)良好的用戶體驗。在設(shè)計用戶界面時,需要把握最基本的“對齊”和“對比”原則。在此基礎(chǔ)上,各界面組件的距離按照“親密性”原則進行把握,即如果信息之間關(guān)聯(lián)性越高,它們之間的距離就應(yīng)該越接近,也越像一個視覺單元。同時,相似的功能盡量采用相同的元素、顏色、格式進行實現(xiàn),以減少用戶的學習成本[10]。
(2)跨平臺兼容性。就目前桌面系統(tǒng)情況來看,微軟的Windows受眾最廣,而國產(chǎn)操作系統(tǒng)都是基于Linux系統(tǒng)進行開發(fā)??紤]到很多指標體系的構(gòu)建事關(guān)國民經(jīng)濟情況,在國產(chǎn)操作系統(tǒng)中使用的可能性很大,因此軟件需要具備跨平臺功能。
從需求分析可知,客戶端軟件需要跨平臺運行。目前常用的跨平臺軟件方案主要有Qt框架(C++語言),Swing(Java語言)和Electron框架(Ja?vaScript語言)。比較而言,Qt框架生成的界面和業(yè)務(wù)邏輯耦合度太強,維護成本高;Swing原生的用戶界面(user interface,UI)控件十分有限,難以開發(fā)用戶友好的軟件,而Electron采用HTML和CSS構(gòu)建用戶界面,可以與React.js等前端框架結(jié)合,實現(xiàn)用戶界面和業(yè)務(wù)邏輯的分離,方便后期維護??紤]到指標體系構(gòu)建系統(tǒng)的業(yè)務(wù)邏輯并不復雜,但其交互界面繁復、各類圖表需動態(tài)生成,對前端展現(xiàn)要求很高?;谝陨峡紤],選用Electron和React.js技術(shù)相結(jié)合進行開發(fā)。
系統(tǒng)的整體結(jié)構(gòu)如圖2所示,共分為視圖UI層,業(yè)務(wù)邏輯層和數(shù)據(jù)持久化層。其中視圖UI層使用前端框架React.js,該層運行在Electron內(nèi)置的Chrome瀏覽器中;業(yè)務(wù)邏輯層則使用Node.js編寫,負責轉(zhuǎn)發(fā)頁面請求,視圖層和業(yè)務(wù)層封裝成React.js組件(Component)進行通信;數(shù)據(jù)持久化層采用JavaScript實現(xiàn)的NeDB數(shù)據(jù)庫,該數(shù)據(jù)庫利用異步功能實現(xiàn)非阻塞式數(shù)據(jù)訪問。在此基礎(chǔ)上,系統(tǒng)還有三項通用模塊,分別是一致性檢查模塊、文本相似度計算模塊和指標文檔導出模塊,為所有業(yè)務(wù)提供支持。
圖2 指標體系構(gòu)建系統(tǒng)整體框架
由需求分析可知,系統(tǒng)核心功能主要是指標項和數(shù)據(jù)項,因此各需要一張數(shù)據(jù)表存儲相關(guān)數(shù)據(jù)。由于指標項與數(shù)據(jù)項是多對多的關(guān)系,為了進行關(guān)聯(lián),還需要單獨設(shè)計一張關(guān)聯(lián)表。因此,核心數(shù)據(jù)表主要包括指標項表、數(shù)據(jù)項表和指標數(shù)據(jù)關(guān)系表。核心數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系如圖3所示。
圖3 數(shù)據(jù)庫實體聯(lián)系圖
指標項和數(shù)據(jù)項實現(xiàn)的功能類似,都以CRUD為主。由于指標項屬性較多,這里主要以指標項功能為例進行探討。在設(shè)計UI時,首先實現(xiàn)下層組件,包括指標控制欄組件IndicatorCon?trol,數(shù)據(jù)表格組件IndicatorTable和指標表單組件IndicatorForm,每個組件都繼承React.Component類,以支持JSX語法。JSX是一種JavaScript的語法擴展,與傳統(tǒng)的JavaScript相比,它的語法簡單,與HTML類似,更適合編寫UI界面。下層組件完成后利用頂層的Indicator組件將所有組件進行組合,形成整個指標項頁面,指標頁面的JSX結(jié)構(gòu)如代碼段1所示。
代碼段1指標頁面的JSX結(jié)構(gòu)
從代碼段1中可以看出,通過JSX,可以把回調(diào)函數(shù)利用組件屬性進行傳遞,例如re?freshTable就是一個刷新頁面的回調(diào)函數(shù)。通過綁定回調(diào)函數(shù),有利于反轉(zhuǎn)控制邏輯,將所有的信息流匯集到Indicator組件統(tǒng)一進行控制,方便維護與擴展。
保存數(shù)據(jù)時,由于NeDB采用的是回調(diào)函數(shù)進行非阻塞式調(diào)用,為了避免進入“回調(diào)地獄”[11],將其包裝為Promise實現(xiàn),即返回值為Promise對象,該對象由resolve和reject兩個回調(diào)函數(shù)構(gòu)成,如果數(shù)據(jù)庫查找操作時出現(xiàn)錯誤,則調(diào)用reject,反之則調(diào)用resolve。利用Async/Await關(guān)鍵字可以近似于同步方式使用數(shù)據(jù)庫功能,提高代碼質(zhì)量。最終實現(xiàn)的頁面樣式如圖4所示。
圖4 指標項頁面樣式
文本相似度主要依據(jù)“詞袋模型”[12]進行計算,主要依據(jù)不同文本中出現(xiàn)相同詞的數(shù)量來計算相似度,相似度定義為:
其中,A和B分別代表需要計算相似度的文本分詞以后的詞語集合,size(?)運算符代表計算集合大小,simA,B代表A和B的相似度。例如,考慮下面兩個文本:
指標1:公眾號是否開通支付功能
指標2:移動支付總筆數(shù)
分詞之后,指標1的詞語集合為{公眾,號,是否,開通,支付,功能},size為6;指標2的詞語集合為{移動,支付,總,筆,數(shù)},size為5。兩者的交集為{支付},size為1,根據(jù)公式1可以計算相似度為0.19。
從文本相似度的定義可以看出,相似度計算核心功能在于文本分詞。目前,Node.js提供了開源的中文分詞模塊node-segment,經(jīng)過分詞之后的文本可利用公式1計算相似度。系統(tǒng)在實現(xiàn)時,將其包裝為TextUtil工具類以方便使用,并且采用單例設(shè)計模式以提高多次調(diào)用的性能。
系統(tǒng)采用“事件”驅(qū)動模式,用戶在修改或刪除指標數(shù)據(jù)項時會觸發(fā)“一致性”檢查。刪除時,會查找所有依賴項,因為數(shù)據(jù)庫中所有的依賴關(guān)系均存儲在IndicatorRelation表中,因此只需要在該表中搜索相應(yīng)所需數(shù)據(jù)Id,如果存在搜索結(jié)果,證明還有依賴,則不允許刪除。修改時,需要調(diào)用文本相似度檢查模塊,如果相似度小于某個閾值,則提示與原有項目不一致,建議進行新增。
指標體系構(gòu)建完成后,需要將設(shè)計好的指標體系形成文檔以方便說明和展示。系統(tǒng)主要實現(xiàn)了根據(jù)已有Word模板生成對應(yīng)的指標文檔,生成原理是高版本W(wǎng)ord軟件使用的.docx文件,其本質(zhì)是一個zip格式的壓縮包,文檔內(nèi)容和格式在壓縮包中使用xml文件進行存儲。因此,在已有.docx文件模板的基礎(chǔ)上,只需要解析其中的XML文件并替換內(nèi)部的文字即可形成所需要的文檔。
本文重點探討了基于整體一致性的跨平臺指標體系構(gòu)建系統(tǒng)的設(shè)計與實現(xiàn)。根據(jù)對指標體系通用結(jié)構(gòu)的分析,從數(shù)據(jù)關(guān)系和文本語義兩方面定義了指標體系整體一致性概念。在此基礎(chǔ)上,分析了指標體系構(gòu)建系統(tǒng)需求,從技術(shù)選型、框架設(shè)計和數(shù)據(jù)庫設(shè)計三個方面進行了詳細設(shè)計,最后實現(xiàn)了系統(tǒng)功能,主要包括指標項功能和文本相似度、一致性檢查和文檔導出模塊。從最終效果來看,無論是新增、修改還是刪除,均能有效地保證體系的整體一致性,并通過可視化方法幫助研究人員更好地開發(fā)大規(guī)模指標體系。