陳順強
(西南民族大學(xué) 現(xiàn)代教育技術(shù)中心,四川 成都 610041)
彝文信息處理是一項龐大的系統(tǒng)工程,其中涵蓋了從字、詞、短語、句子、語篇等多層面的信息加工處理任務(wù)。彝文本是大字符集的字串,因此,彝文信息處理就增加了大字符集處理和字串到詞串處理這兩大塊任務(wù)。而詞是最小的、能獨立活動的、有意義的語言成分。彝文處理應(yīng)用系統(tǒng)只要涉及語法語義(如檢索、翻譯、文摘、校對等),就需要以詞為基本單位。隨著對語言文字信息處理研究工作的不斷深入,在過去的十幾年里,彝文信息處理在編碼和輸入法方面做了大量卓有成效的工作,彝文字處理技術(shù)趨于成熟,并已逐步在普遍推廣中,彝文信息處理技術(shù)也從字信息處理逐步轉(zhuǎn)向語言信息處理,與漢語、英語和蒙、藏、維語等語種的信息處理一樣,彝文自動分詞是彝文信息處理中一項不可缺少的基礎(chǔ)性工作[1]。從應(yīng)用需求來看,彝文分詞的主要目的是確定彝語自然語言處理的基本分析單位,為進一步開展彝語自動分析,彝文文字識別、文本校對、詞匯獲取,進而為實現(xiàn)機器翻譯、篇章理解、自動文摘、文本校對、自動索引等應(yīng)用處理系統(tǒng)做好前期準(zhǔn)備工作[2]。這里所研究的彝文指的是1980年國務(wù)院規(guī)定頒布使用的規(guī)范彝文。
所謂的自動分詞,就是利用計算機把一個句子按照其中詞的含義、語法意義進行切分。分詞單位指的是一個詞它具有獨立的語義或語法功能,以彝文分詞規(guī)范為依據(jù),有二字、三字詞或四字、五字的成語、諺語、格言等[3]。
國家技術(shù)監(jiān)督局1992年10月4日發(fā)布了中華人民共和國國家標(biāo)注《信息處理用現(xiàn)代漢語分詞規(guī)范》,為現(xiàn)代漢語信息處理進一步發(fā)展制定了規(guī)范。中國臺灣“計算機語言學(xué)會”也為了適應(yīng)中文信息處理的需求,于1995年制定了《資訊處理用中文分詞規(guī)范》。國家標(biāo)準(zhǔn)的制定為少數(shù)民族文字分詞規(guī)范的研究提供技術(shù)支撐,在制定《彝文分詞規(guī)范》的基本原則時,可以借鑒以上兩個分詞規(guī)范中的適合彝文特點的比較成熟的分詞技術(shù)。根據(jù)彝語的特點和規(guī)律,《彝文分詞規(guī)范》基于適用、實用、科學(xué)的角度從彝文信息處理的實際出發(fā),確定了彝文的分詞原則并制定了一系列具體的規(guī)則,該規(guī)范不僅適用于彝語自動分詞、彝語詞性標(biāo)注、詞法分析、句法分析等彝語自動分析,而且適用于以后的彝文自動識別、機器翻譯等彝文信息處理研究[4]。
2.1.1 語義上無法由組合成分直接相加而得到的字串應(yīng)該合為一個分詞單位
2.1.2 單純詞的分詞單位
2.1.3 合成詞的分詞單位
2.1.4 駢儷詞的分詞單位
2.1.5 有明顯的分詞標(biāo)記的分詞單位
這里所說的有明顯的分詞標(biāo)記指的是: 空格或標(biāo)點符號。比如,“/”符號,逗號、句號、分號、頓號、冒號、問號、嘆號、引號、書名號、括號、破折號、省略號、間隔號、連接號等,標(biāo)點符號為結(jié)尾的具有很明顯的分隔標(biāo)記,就將它切分為一分詞單位。
2.1.6 二字、三字、四字或五字以上的諺語和格言的詞分詞單位
2.1.7 術(shù)語、熟語、外來詞、音譯詞及非彝文字其他詞的分詞單位
隨著社會的不斷進步,在日常生活中不斷出現(xiàn)許多術(shù)語、熟語、外來詞及音譯詞,在分詞中遇到科學(xué)術(shù)語、外來詞、音譯詞的時候應(yīng)視作為分詞單位。例如:
在彝文文本中出現(xiàn)的非彝文字符號,應(yīng)該保留其原有的形式一律視作為一分詞單位。如: NBA CEO OTC 1234 3.14等等。
根據(jù)彝語的特點彝文信息處理的發(fā)展及以上所述的分詞原則,這些原則都不是一成不變的死規(guī)定,而是隨著時代和語境的變化,可增可減。
對于英語來說一個字就是一個詞,而且詞與詞之間有空格,所以計算機分析的時候不需要再做分詞,而在計算機中分析彝語就必須對彝語進行分詞。彝語屬于漢藏語系藏緬語族彝語支,和漢字一樣都是方塊字。目前中文的分詞技術(shù)發(fā)展迅速,其算法也千姿百態(tài)都有利有弊。目前比較流行的中文分詞算法有: (1)基于字符串匹配的分詞;(2)基于理解的分詞;(3)基于統(tǒng)計的分詞[5]。
根據(jù)彝文分詞實現(xiàn)目標(biāo),分詞程序運行的硬件平臺確定為普通PC 機,運行的軟件平臺是流行的Windows ,根據(jù)不同模塊實現(xiàn)的具體情況,選擇利用Java作為系統(tǒng)開發(fā)語言,利用Eclipse3.2+jdk1.6+Access平臺來實現(xiàn)彝文分詞設(shè)計開發(fā)。用Java語言中的TreeMap的結(jié)構(gòu)特性和HashMap儲存方式。TreeMap[6]是一個可以將包含的鍵根據(jù)鍵名自動按升序排列的Map 集合,排列順序可以是默認(rèn)也可以根據(jù)實際情況自己設(shè)定,用它來存儲詞的字頭,可以自動排成順序,在分詞的時候直接判斷輸入的內(nèi)容在TreeMap 中是否存在,有就進行下一步,沒有就輸入下一段內(nèi)容,大大節(jié)省時間。HashMap 是一個二元數(shù)據(jù)存儲集合,可以存儲鍵名和鍵值,最適合用來統(tǒng)計某些對象出現(xiàn)的次數(shù),其訪問速度非???基于計算機自動分詞的研究.李瑞芳,孫健,李娜.沈陽化工學(xué)院學(xué)報.2008年3期.255。。
圖1 彝文自動分詞處理流程圖
從圖1中可以看出彝文分詞要經(jīng)過以下幾個步驟:
(1) 導(dǎo)入文本。導(dǎo)入用于分詞的文本,在導(dǎo)入工程中可以選擇文本的格式,而目前本系統(tǒng)只支持純文本文件的導(dǎo)入。
(2) 對文本進行預(yù)處理。為了提高分詞的準(zhǔn)確性和速度,文本在進入分詞階段前都要先進行處理,做好相應(yīng)的工序,如將長篇文本分成段落式,將段落文本再處理成以標(biāo)點符號為單位的句子形式,盡量把句子斷得小一些。分詞時候系統(tǒng)一旦遇見以標(biāo)點符號為首尾的就將預(yù)處理成分詞單位。
(3) 將詞存儲到TreeMap中,并建立HashMap數(shù)組。利用Java中的數(shù)據(jù)鏈接方法,將彝文分詞詞典中的詞逐一給予讀取出來,按照上面分詞原則里的條件設(shè)置成長度為2字、3字、4字或者5字以上來區(qū)分詞,將其分別存儲到4個HashMap數(shù)組中,然后將獲取的所有詞的第一個字存儲到TreeMap結(jié)構(gòu)中,以待下一步操作。
(4) 對TreeMap結(jié)構(gòu)和HashMap數(shù)組中彝文詞進行判斷。在這一步里,首先系統(tǒng)判斷輸入的字是否已經(jīng)在HashMap數(shù)組中存在,如果不存在那就繼續(xù)匹配,再進行判斷。而如果輸入的字已經(jīng)在HashMap數(shù)組中存在,那就將其送到臨時數(shù)組中進行判斷看TreeMap結(jié)構(gòu)中是否有這個詞,如果沒有就返回HashMap中再進行判斷,如有該詞已經(jīng)在HashMap數(shù)組中存在,而且跟設(shè)置的長度相匹配,就得出分詞的結(jié)果,否則將返回,繼續(xù)匹配判斷。
(5) 得出分詞結(jié)果。一個詞已經(jīng)過以上幾個步驟,順利到達終點,就成功結(jié)束,得出分詞結(jié)果。
文本進行預(yù)處理步驟的核心代碼:
Out; //輸出流
In;//輸入流
StringBuffer s1=new StringBuffer(); //緩沖
char a=in.read();
while (a !=-1) //判斷是否已到流的終點
{
if ((a==,‖a==?!琣==;‖a==、‖a==:‖ a==/‖a==?
‖ a==!‖a==“”‖a==《》‖a==()‖a==——‖a==……
‖ a== )) //一句結(jié)束
{
String s2=new String(s1);
out.write(""); //在句子前加
out.write(s2);
out.write(""); //在句子末尾加
out.write(/n); //換行
s1=new StringBuffer();
}
else if ( a==/)
s1=s1.append((char)32); //分詞位置空格
else if (a > 256 )
s1=s1.append((char)a);
a=in.read();
}
out.close();
in.close();
文本在預(yù)處理后,以字符數(shù)組的形式存儲起來,對TreeMap結(jié)構(gòu)和HashMap數(shù)組中彝文詞進行判斷核心代碼:
//first為前一個詞,second為緊隨其后的詞
public static void add(String first, String currwd){
String key=first;
String sec=second;
boolean bb=HMap.containsKey(key); //Hmap是一個已存在的HashMap,用來存儲數(shù)組。在這里判斷 first 是否在 主map 中
if (bb==false) { //若 主map 中無,則添加
HashMap hm=new HashMap(); //首先,新構(gòu)造一個 子MAP
hm.put(key, new Integer(1));//存儲主KEY 的頻率hm.put(sec, new Integer(1)); //存儲 主KEY 后面緊接著的那個詞頻率
HMap.put(key,hm); //將 主KEY 和對應(yīng)的 子MAP 放入 主MAP 中
}
else //若 主map 中含有該詞
{
HashMap temp=(HashMap)HMap.get(key); //返回 主KEY 所對應(yīng)的 子MAP ,進行值的修改
int count=((Integer)temp.get(key)).intValue()+1; //在子map中將主key次數(shù)加 1
temp.put(key, new Integer(count));
if (temp.containsKey(sec)) //判斷 子map 中是否含有該詞
{
int value=((Integer)temp.get(sec)).intValue()+1; temp.put(sec, new Integer(value));
}
else
temp.put(sec, new Integer(1)); //若無,則將其存入子map
HMap.put(key, temp); //子map 修改完畢 ,將其重新放入 主map
通過對一段文本的切分測試如下:
切分前的文本:
切分后的文本:
Java支持多國語言編碼,其內(nèi)核是Unicode編碼。在Java中,字符都是以Unicode進行存儲的,由于Java的String類里的char都是Unicode編碼,所以我們可以直接用字符的機內(nèi)碼來判斷和識別字符。
彝文字與英文甚至和漢字的編碼體系都是不一樣的,所以在程序中就應(yīng)該讓程序來判斷我們導(dǎo)入的是彝文文本還是英文或者是漢文,判斷是根據(jù)文字的內(nèi)碼來進行的,漢字是用GBK編碼的內(nèi)碼,GBK是為了推進Unicode的實施,同時也是為了向下與我國一直沿用的字符集標(biāo)注GB2312完全兼容,電子工業(yè)部與國家技術(shù)監(jiān)督局聯(lián)合頒布的一個新的漢字內(nèi)碼擴展規(guī)范。微軟從Windows95簡體中文版就開始就在系統(tǒng)中采用了GBK編碼。GBK中漢字的編碼范圍為4E00~9FA5(十進制為19 968~40 869),其中有漢字(包括部首和構(gòu)件)20 902個。西南民族大學(xué)和北大方正集團公司合作研制的Unicode彝文系統(tǒng),其在Unicode中的編碼范圍0xA000~0xA4C6[7]。
在程序中文字編碼的判斷方法如下:
/*str導(dǎo)入文本里的文字*/
Int num=str.charAt(0);//求出字符的內(nèi)碼
If(num <=128)//英文
else if(num >=19 968&&num <=40 869)//漢字,GBK編碼范圍
else if(num >=57 344&&num <=58 565)//EUDC彝文編碼范圍
else if(num >=40 960&&num <=41 282)//方正Unicode彝文編碼范圍
是不是有了分詞算法就能比較容易地解決分詞的精度和速度呢?事實遠非如此。彝文的語法和句法結(jié)構(gòu)都比較復(fù)雜,不像英文那么簡單。一個句子在不同的場景或不同的語境下,可以理解成不同的詞串、詞組串等,并有著不同的意義。所以彝文句子中存在這很多歧義和多義的現(xiàn)象。
分詞中處理歧義字段的方法很多有: 基于規(guī)則的分詞消歧,基于統(tǒng)計方法的分詞消歧等等。文本在預(yù)處理階段就用雙向掃描的方法來發(fā)現(xiàn)歧義字段,就是對同一個字段分別用正向匹配和逆向匹配方法掃描切分,如果正反掃描的結(jié)果都一樣就不存在歧義,反之則有歧義需要消歧。字段的歧義有交叉歧義和組合歧義,所以在分詞中最困難的還是消歧的技術(shù)[8]。如果能處理好消歧的問題,分詞的精度也會相應(yīng)提高。
分詞中另一個難題還數(shù)新詞的識別,也就是未登錄詞的識別。在大規(guī)模真實文本處理中,會遇到許多在字典中都沒有收錄過,但又確實能稱為詞的那些詞。最典型的是人名、地名、機構(gòu)名、術(shù)語等都是很難處理的問題,而且這些又正好是人們經(jīng)常使用的詞,對這些詞語的識別是件非常困難的事。分詞系統(tǒng)中的新詞識別十分重要。現(xiàn)今新詞識別準(zhǔn)確率已經(jīng)成為評價一個分詞系統(tǒng)好壞的重要標(biāo)志之一[9]。
目前彝文信息處理對未登錄詞識別這領(lǐng)域,還沒有專項地去做研究,只是在彝文分詞中遇到時候簡單解決下,這里采用是遇到新詞就在詞典中隨時加入新詞匯來解決。相信在信息處理技術(shù)的不段深入發(fā)展后會有所突破的。
彝文分詞技術(shù)前幾年西南民族大學(xué)有老師用C語言做過研究,但是,用Java語言研究開發(fā)的本文還尚屬首例。本文經(jīng)過研究設(shè)計得出的彝文自動分詞軟件,在對彝文真實文本分詞的時候得到的分詞結(jié)果還是比較準(zhǔn)確的,驗證了本文初始的研究方案,將為后面的詞性標(biāo)注、彝文文字識別、文本校對、詞匯獲取,進而為實現(xiàn)彝語自動分析、機器翻譯、篇章理解、自動文摘、文本校對、自動索引等應(yīng)用處理系統(tǒng)做好前期理論基礎(chǔ)和技術(shù)支撐。誠然,彝文自動分詞技術(shù)現(xiàn)在還完全沒有達到國際國內(nèi)其他語言自動分詞的水平,本軟件目前還沒有大量的推廣使用,僅在實驗室,不過其彝文分詞理論是比較成熟的。但相信在彝文信息處理技術(shù)的不段深入發(fā)展以后將會有所突破的。
[1] 沙馬拉毅.計算機彝文信息處理[M] .北京:電子工業(yè)出版社,2000:21-67.
[2] 陳順強.規(guī)范彝文字詞頻統(tǒng)計系統(tǒng)設(shè)計語實現(xiàn)[J].西南民族大學(xué)學(xué)報(自然科學(xué)版),2010,4:644-648.
[3] 陳小荷.現(xiàn)代漢語自動分析[M] .北京:北京語言文化大學(xué)出版社,2000:35-80.
[4] 劉開瑛.中文文本自動分詞和標(biāo)注[M] .北京:商務(wù)印書館,2000:1-249.
[5] 李月倫,常寶寶.基于最大間隔馬爾可夫網(wǎng)模型的漢語分詞方法[J].中文信息學(xué)報,2010,24(1):8-14.
[6] 龐永慶,龐麗娟.21天學(xué)通Java[M] .北京:電子工業(yè)出版社,2008:20-300.
[7] 李金發(fā).彝語真人發(fā)音詞典的開發(fā)[J].西南民族大學(xué)學(xué)報(自然科學(xué)版),2005,10:34-37.
[8] 傅永和.中文信息處理[M] .廣州:廣東教育出版社,1999:3-120.
[9] 石民,李斌,陳小荷.基于CRF的先秦漢語分詞標(biāo)注一體化研究[J].中文信息學(xué)報,2010,24(2):39-45.