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