喬長兵
(江蘇省郵電規(guī)劃設(shè)計院有限責任公司,南京210006)
在中文信息處理中進行一些相關(guān)的研究,比如信息抽取,指代消解等,首要進行的工作就是分詞。而分詞過程又是非常耗時的,執(zhí)行時間過長導(dǎo)致效率低下。
利用條件隨機場(Conditional Random Field:CRF)[1]模型來進行分詞處理是最近研究的熱點。它沒有馬爾可夫模型那樣嚴格的獨立假設(shè),同時克服了最大熵馬爾可夫模型的標記偏置的缺點;但卻存在訓(xùn)練速度比較慢的缺點。
為了更加方便的進行分詞研究和自然語言處理,提高分詞處理的執(zhí)行效率,作者將工作流引入到具體的分詞處理中,設(shè)計實現(xiàn)了基于CRF模型的分詞工作流。通過將分詞流程分解成若干個執(zhí)行過程,并將這些執(zhí)行過程包裝成網(wǎng)格服務(wù),最終將服務(wù)部署到網(wǎng)格中的資源節(jié)點上。
條件隨機場是一種條件概率模型,它定義了整個標簽序列的聯(lián)合概率,而不是為每一個狀態(tài)都規(guī)定一個概率分布,各狀態(tài)是非獨立的,彼此之間可以交互,因此可以更好的模擬現(xiàn)實世界的數(shù)據(jù)。
為了便于構(gòu)建CRF模型,首先必須使用一個標準化過程,將原始語料轉(zhuǎn)換成標準的形式。這里使用的標準語料形式規(guī)定語料庫中每行只包含一個字,與這個字相關(guān)的信息用制表符間隔依次標在字的后面。其次再進行特征提取,使之生成CRF模型工具所能識別的訓(xùn)練語料和測試語料,其格式為:每行包括一個字以及與字相關(guān)的一些特征和標記,字與特征之間、特征與特征之間與特征與標記之間都用制表符間隔開。然后對訓(xùn)練語料進行訓(xùn)練,訓(xùn)練生成一個CRF模型,其訓(xùn)練過程中加入了一些如迭代次數(shù)等的訓(xùn)練參數(shù)。利用訓(xùn)練所生成的CRF模型,對測試語料進行測試,獲得一個預(yù)測結(jié)果。
根據(jù)上面的分析,可以得出基于CRF模型的分詞處理流程圖。如圖1所示。分詞處理大約由四個步驟組成,每個步驟具體描述如下:
預(yù)處理主要負責的工作有:將原始語料文本的編碼方式統(tǒng)一轉(zhuǎn)換成GBK編碼;加入特征并使之生成特定格式的文本文件,作為整個處理流程的中間文件;然后標準化該中間文件,使得CRF模型識別,即生成Train.tagged作為訓(xùn)練語料,Test.tagged作為測試語料。
訓(xùn)練模型:即CRF模型,它接收預(yù)處理生成的訓(xùn)練語料文件Train.tagged文件以及系統(tǒng)的參數(shù)文件option.txt。Train.tagged文件的大小一般有幾十到幾百兆,造成執(zhí)行時間特別長,一般需要幾個小時的時間,效率非常低,option.txt參數(shù)文件為CRF模型提供相關(guān)的參數(shù)信息,用來決定迭代次數(shù),迭代次數(shù)越多,執(zhí)行時間也越長。訓(xùn)練之后會生成相應(yīng)的Model文件。
測試模型:它接收測試文件Test.tagged、系統(tǒng)參數(shù)文件option.txt和訓(xùn)練模型生成的Model文件。處理之后生成相應(yīng)的初步分詞結(jié)果。
后處理:它負責將經(jīng)過CRF模型處理的初步分詞結(jié)果進行篩選,篩選的過程就是根據(jù)自己定義的特征將一些明顯不符合特征的分詞結(jié)果去除,使分詞結(jié)果更加合理。經(jīng)過后處理過程,將獲得最終的分詞結(jié)果。
借助參考文獻[2]提出的一種可擴展的網(wǎng)格服務(wù)工作流語言——GSWL(Grid Service Workflow Language),描述CRF分詞工作流,借助強大的標簽功能來描述各成員服務(wù)之間的數(shù)據(jù)依賴關(guān)系和控制依賴關(guān)系。具體的描述文檔片段如下所示。
<!--定義工作流的名字-->
<definitions name="GSWLforSegWord"scope="session">
<!--列出工作流的服務(wù)提供者列表 -->
<serviceProvider name="PreTxt"type="PreService"/>
<serviceProvider name="CRFTrain"type="CRFTrainService"/>
<serviceProvider name="CRF"type="CRFService"/>
<serviceProvider name="Opt"type="OptService"/>
<!--列出工作流中包含的活動 -->
……
<!--數(shù)據(jù)流模型 -->
<dataModel dataInTo="OutputDataA"dataOut-From="OutputDataD">
……
</dataModel>
……
一方面,訓(xùn)練模型中用到的算法時間復(fù)雜度高,隨著迭代次數(shù)和特征數(shù)目的增加,執(zhí)行時間也相應(yīng)增加;另一方面,訓(xùn)練模型需要處理幾百兆的數(shù)據(jù)信息,執(zhí)行時間將變得十分漫長。同樣的,測試模塊和后處理模塊都需要處理大型的數(shù)據(jù)文件。
數(shù)據(jù)流模型中 <dataLink label=”link1”>和<dataLink label=”link2”>的Self_Sched屬性設(shè)定為true。因此,在調(diào)度執(zhí)行 CRFTrainServie服務(wù)和CRFService服務(wù)時要執(zhí)行GSPSS算法,將大的文本文件分解成若干個小的文本文件,并協(xié)調(diào)網(wǎng)格中所有可用的功能相同的服務(wù)資源來并行執(zhí)行。
根據(jù)上面的分析,將分詞處理過程描述成一個網(wǎng)格服務(wù)工作流應(yīng)用。CRF分詞工作流的設(shè)計如圖2所示。
圖2 分詞工作流設(shè)計圖
其中,PreService服務(wù)對應(yīng)于流程中的預(yù)處理過程,CRFTrainServie服務(wù)對應(yīng)于訓(xùn)練模型,CRFSer-vice服務(wù)則對應(yīng)測試模型,獲得基于CRF模型的粗分詞結(jié)果;OptService服務(wù)對應(yīng)流程中的后處理過程,對前面獲取的分詞結(jié)果進行一定的篩選和優(yōu)化,獲得最終的分詞結(jié)果。
在具體實現(xiàn)服務(wù)的過程中,使用的開發(fā)工具是Magic C++.NET+Eclipse+GT4軟件開發(fā)包。算法實現(xiàn)使用C++作為編程語言,服務(wù)封裝使用Java編程語言。集成開發(fā)環(huán)境Magic C++.NET支持遠程基于Unix/Linux/BSD服務(wù)器的開發(fā)以及本地基于Windows的開發(fā),通過它就可以獲得Linux和Windows下的可執(zhí)行命令或程序;借助Eclipse+GT4軟件包將命令和程序封裝成網(wǎng)格服務(wù),并最終利用GT4提供的命令將網(wǎng)格服務(wù)部署在各個網(wǎng)格節(jié)點上。下面以PreService服務(wù)為例來說明具體的實現(xiàn)過程。
在Magic C++.NET中,新建工程Preprocess,建立Preprocess.cpp文件,給出該文件的代碼片段,如下所示:
……
//特征化文本
void replace(char*r,char*w)
{
……
}
//轉(zhuǎn)換成GBK字符編碼
void convert(char*r,char*w)
{
……
}
fclose(rf);
fclose(wf);
}
……
void main()
{
……
}
代碼片段給出了函數(shù)convert(char*r,char*w)和函數(shù)replace(char*r,char*w)實現(xiàn)的部分代碼,前者用來將原始語料文本的編碼方式統(tǒng)一轉(zhuǎn)換成GBK編碼,后者用來標準化加入特征后的中間文件。
為了使程序既能在Linux上執(zhí)行,又能在Windows上執(zhí)行,通過Magic C++.NET可以很方便的在Linux上生成可執(zhí)行的 shell命令:../usr/seg/Preprocess,在 Windows 平臺上生成 Preprocess.exe作為可執(zhí)行文件。
算法實現(xiàn)之后,下一步就是利用Java和GT4提供的API來封裝成網(wǎng)格服務(wù)PreService。在Eclipse新建一個GT4工程PreService,實現(xiàn)的關(guān)鍵代碼如下所示。
package org.zhhz.gt4.example.impl;
……
import org.globus.wsrf.ResourcePropertySet;
importorg.globus.wsrf.impl.SimpleResourcePropertySet;
……
public class PreService implements Resource,ResourceProperties{
……
/* Constructor.Initializes RPs*/
public PreService()throws RemoteException{
this.propSet=new SimpleResourcePropertySet
(PreServiceQNames.RESOURCE_PROPERTIES);
……
}
……
//判斷操作系統(tǒng)的類別
private boolean checkosversion(){
……
}
//進行預(yù)處理
public TxtnameResponse preservice(Txtname tname){
}
return null;
}
……
}
實驗搭建的網(wǎng)格環(huán)境為:1個主機作為調(diào)度節(jié)點,12個性能不同的主機作為資源節(jié)點,并且每個節(jié)點上都部署了PreService服務(wù)、CRFTrainServie服務(wù)、CRFService服務(wù)和OptSevice服務(wù)。其中8個資源節(jié)點的性能列表見表1,其他4個節(jié)點的操作系統(tǒng)是Linux,CPU 頻率為3.0GHz,內(nèi)存大小是512兆。
分詞處理采用的語料有兩個,一個是PKU訓(xùn)練語料和測試語料,該語料來自北京大學(xué)語料庫,其規(guī)模為110萬詞,編碼方式采用國標碼,語料庫內(nèi)容主要來源于報紙新聞,其語料格式由被空格標記的詞組成的句子段落構(gòu)成。另一個語料是SIGHAN的MSRA語料,該語料同樣采用國標碼編碼,且語料格式跟PKU一樣,但語料庫相對大一些。因為分詞處理執(zhí)行效率比較低,在實驗過程中通常利用高性能的集群環(huán)境來處理。
為了證明調(diào)度模型的有效性和實用性。作者對分詞處理程序在集群環(huán)境中的運行時間與分詞處理工作流在網(wǎng)格中的執(zhí)行時間進行了比較分析,如圖3所示。
表1 資源節(jié)點性能表
圖3 分詞處理程序執(zhí)行時間與分詞工作流執(zhí)行時間比較圖
從圖3可以看出,分詞處理程序處理MSRA語料的執(zhí)行時間略高于處理PKU語料的時間。分詞處理程序的執(zhí)行時間比分詞工作流的執(zhí)行時間高很多,工作流的引入,大大提高了分詞應(yīng)用的執(zhí)行效率;另一方面執(zhí)行時間并沒有因為多個節(jié)點并行執(zhí)行而成倍的縮短。
通過結(jié)合分詞的應(yīng)用,作者針對基于條件隨機場分詞程序訓(xùn)練速度比較慢的缺點,通過在分詞處理應(yīng)用中引入工作流機制,提出了基于條件隨機場的分詞工作模型。最后實驗結(jié)果表明,該模型能有效地提高分詞處理的執(zhí)行效率,分詞工作流的執(zhí)行時間遠低于分詞處理程序的執(zhí)行時間。
[1]Lafferty J,McCallum A,Pereira F.Conditional random fields:probabilistic models for segmenting and labeling sequence data[A].Processing of the International Conference on Machine Learning(ICML -2001)[C].Williams MA,2001:282 -289.
[2]郭文彩.面向服務(wù)的網(wǎng)格工作流關(guān)鍵技術(shù)研究[D].北京:北京科技大學(xué),2005.
[3]XueNW.Chinese word segmentation as character tagging[J].Computational Linguistics and Chinese Language Processing,2003,8(1):29 -48.
[4]John Lafferty,Andrew McCallum,F(xiàn)ernando Pereira.Conditional random fields:Probabilistic models for segmenting and labeling sequence data[C].Proc of ICML,2001:282-289.