梁建飛,王軍元,劉 敏
(61243部隊,新疆 830006)
音譯通常用于命名實體的翻譯,如地名、人名等,是指利用源語言及目標(biāo)語言發(fā)音規(guī)則的異同將源語言形式翻譯成目標(biāo)語言形式[1].由于音譯從讀音角度處理翻譯問題,在處理未登錄詞翻譯問題上有著良好的效果[2],因此在很多跨語言任務(wù)如機器翻譯[3]、雙語地圖[4]中有著廣泛的應(yīng)用,其中雙語地圖對音譯的要求非常高,必須遵循嚴(yán)格的音譯規(guī)則才能得到可供使用的雙語注記[4].
目前有大量音譯規(guī)則可供使用,如聯(lián)合國地名標(biāo)準(zhǔn)化會議要求:世界各國的地名,要實行單一羅馬化拼寫,即以羅馬語為官方語言的國家,應(yīng)提供標(biāo)準(zhǔn)的地名拼寫形式;使用非羅馬語的國家,要制定出非羅馬字母轉(zhuǎn)寫為羅馬字母的轉(zhuǎn)寫規(guī)則,經(jīng)聯(lián)合國標(biāo)準(zhǔn)化會議通過在國際上推廣使用.在此基礎(chǔ)上,我國國家質(zhì)量技術(shù)監(jiān)督局最新發(fā)布了《外國地名漢字譯寫導(dǎo)則》,包括英語、法語、德語、俄語、西班牙語、阿拉伯語、葡萄牙語、蒙古語共八種.除此之外,中國地名委員會制定了50個語種的音譯規(guī)則表,這些規(guī)則表依據(jù)原語種字母羅馬化后的不同發(fā)音所對應(yīng)的國際音標(biāo),分為元音字母和輔音字母,由元音字母和輔音字母單獨發(fā)音或組合發(fā)音進(jìn)行譯寫.
針對音譯的研究一般分為音譯等價對挖掘的研究和音譯模型構(gòu)建的研究兩大類,前者是指從平行或可比較語料庫中挖掘雙語音譯等價對,構(gòu)建一個更大更新的音譯詞典,后者是指使用平行雙語語料庫進(jìn)行訓(xùn)練,根據(jù)其本身信息及上下文信息自動建立一個音譯模型.
根據(jù)音譯的方式不同,音譯方法可分為基于發(fā)音的方法和基于字形的方法[5].前者如文獻(xiàn)[6],利用源語言發(fā)音規(guī)則將源語言轉(zhuǎn)換為發(fā)音中間體,然后根據(jù)目標(biāo)語言的發(fā)音規(guī)則將中間體轉(zhuǎn)換為目標(biāo)語言;后者如文獻(xiàn)[7],直接由源語言不經(jīng)過任何中間體轉(zhuǎn)換為目標(biāo)語言,這類方法信息丟失最少,音譯效果最優(yōu).文獻(xiàn)[8]綜合上述兩種方法的優(yōu)點,提出將音節(jié)和字形特征相融合的方法.
根據(jù)音節(jié)劃分的粒度,音譯方法可分為以音素為粒度的方法和以字母為粒度的方法.如Knight和Graeh[6]在日英人名音譯中,提出以英文音素為粒度,通過發(fā)音相似性尋求轉(zhuǎn)換的方法,而Knight[9]和Sherif[10]提出以字母為單位,不考慮發(fā)音過程,直接進(jìn)行翻譯.
除上述方法外,文獻(xiàn)[11]使用音節(jié)相似度模型進(jìn)行人名翻譯;文獻(xiàn)[12]通過人工定義規(guī)則的方法進(jìn)行翻譯,將英文字母劃分為元音字母和輔音字母,切分時則遵循元音字母和輔音字母配對的原則;文獻(xiàn)[13]將音節(jié)切分問題轉(zhuǎn)換為序列標(biāo)注問題,把機器學(xué)習(xí)和統(tǒng)計機器翻譯模型用于音譯.
現(xiàn)有的研究音譯效果還不夠理想,主要原因在于音節(jié)劃分規(guī)則不夠完善,音節(jié)劃分錯誤較多,因此無法滿足雙語地圖對注記的要求.本文提出一種音節(jié)劃分方法,能夠有效避免音節(jié)劃分錯誤,從而獲得比較理想的音譯結(jié)果;設(shè)計了基于規(guī)則的多語種音譯軟件,利用現(xiàn)有的規(guī)則表資源,獲得了大量高質(zhì)量的音譯成果.
音譯的第一步是選擇合適的音譯規(guī)則表(不同的音譯規(guī)則表對應(yīng)不同的通用名詞庫、專有名詞庫和特殊規(guī)則表),然后查詢通用名詞庫和專有名詞庫,如果輸入的單詞出現(xiàn)在這兩個庫中,直接輸出該單詞對應(yīng)的翻譯結(jié)果,否則進(jìn)入單詞音譯模塊.由于規(guī)則表無法覆蓋所有音譯規(guī)則,因此需要根據(jù)特殊規(guī)則表對輸入的單詞進(jìn)行預(yù)處理,然后經(jīng)過單詞拆分、拆分結(jié)果優(yōu)化、單詞重組和規(guī)則表查詢等環(huán)節(jié)就可得到音譯結(jié)果.詳細(xì)流程如圖1所示.
圖1 音譯流程圖
圖1中通用名詞庫、專有名詞庫、規(guī)則表和特殊規(guī)則表應(yīng)按軟件要求的格式對數(shù)據(jù)進(jìn)行組織.就某個具體領(lǐng)域而言,通用名詞的數(shù)量是非常有限的,如地圖制圖領(lǐng)域,涉及到的通用名詞如“山”、“河”、“村”、“湖”等.專有名詞庫的數(shù)據(jù)源可以是相關(guān)語言的雙語資源,如人名資源、地名資源等,也可以是經(jīng)過審核認(rèn)可的音譯成果.規(guī)則表和特殊規(guī)則表的設(shè)計應(yīng)以權(quán)威部門發(fā)布的成果為依據(jù),在使用過程中可適當(dāng)進(jìn)行修改和完善.基于上述的設(shè)計,利用軟件能快速獲得高質(zhì)量的音譯成果,避免了人工查找規(guī)則費時費力、容易出錯的可能性.
單詞預(yù)處理是依據(jù)特殊規(guī)則表對源語言單詞進(jìn)行處理,以便新單詞利用規(guī)則表中的規(guī)則獲得可信的音譯結(jié)果.通過對大量數(shù)據(jù)進(jìn)行分析總結(jié),制定特殊規(guī)則表(以羅馬語-漢語為例)格式如表1所示.
表1 特殊規(guī)則表
表1中的例子包含羅馬化的普什圖語和印地語的部分特殊規(guī)則,從中可以看出按替換位置劃分,特殊規(guī)則可以分為詞首、詞尾和替換三類,分別表示用新字符串替換單詞中詞首、詞尾和任意位置的原字符串,其中“-”為單詞分隔符,“null”表示空字符串.單詞預(yù)處理的過程比較簡單,輸入的單詞與特殊規(guī)則表逐行進(jìn)行匹配,如果相應(yīng)的位置上出現(xiàn)原字符串,則用新字符串替換并記錄對應(yīng)的說明信息,用于在最終成果中輸出.
單詞拆分的第一步是字母識別,即單詞與所有元音字母和輔音字母進(jìn)行匹配,每個字母的匹配結(jié)果用四個參數(shù)表示:字母、位置、長度、類型.以羅馬語單詞“taisar”為例,字母識別的結(jié)果為:t 0 1 f;a 1 1 y;i 2 1 y;ai 1 2 y;s 3 1 f;a 4 1 y;r 5 1 f,其中每行的第一列表示單詞中的字母,第二列表示該字母在單詞中的索引位置,第三列表示字母的長度,第四列表示字母的類型,“f”為輔音字母,“y”為元音字母.根據(jù)字母識別結(jié)果對單詞進(jìn)行拆分,就是從位置為0的字母開始,搜索位置等于前一個字母位置和長度之和的字母,從而得到一個連續(xù)的、不重疊的字母序列,詳細(xì)算法用偽碼表示如算法1.
算法1.單詞拆分算法1.Hashtable chash;//存儲單詞拆分結(jié)果的哈希表2.Hashtable thash ←(“”,0);//存儲過程數(shù)據(jù)的哈希表3.begin while(End(thash,wlen)!=true)//判斷是否結(jié)束循環(huán)4.chash.clear();//清空哈希表5.begin foreach(object obj in thash)//遍歷哈希表6.int s ← obj.value;//搜索位置賦值7.begin for(int r ← 0;r 上述算法中,函數(shù)End(thash,wlen)用于判斷循環(huán)是否結(jié)束,其中參數(shù)wlen表示待翻譯單詞的字符串長度,循環(huán)結(jié)束的條件是哈希表thash中各項的value值均等于wlen.以單詞“taisar”為例,單詞拆分的結(jié)果包含兩項:t|a!i!s|a!r|和t|ai!s|a!r|.接下來對這兩個拆分結(jié)果分別進(jìn)行字母編組并篩選出最優(yōu)拆分方案. 單詞重組的目的是實現(xiàn)字母編組,方法是用字符“!”對單詞拆分結(jié)果進(jìn)行分割,對不同類型的分割結(jié)果分別進(jìn)行處理,原則是盡可能多的出現(xiàn)“輔音字母+元音字母”組合,盡可能少的出現(xiàn)單個元音字母或單個輔音字母組合,詳細(xì)算法用偽碼表示如算法2. 算法2.單詞重組算法1.string itext;//單詞重組結(jié)果2.int gps ← 0;//組合數(shù)3.int fys ← 0;//輔音元音組合數(shù)4.string[] strs ← split(ctext,”!”);//用字符“!”分割 ctext 5.begin foreach(string str in strs)6.int c ← count(str);//計算 str中字符”|”的個數(shù)7.begin switch(c)8.begin case 0:9.itext ←itext+”|”+str+space;//space 表示空格10.gps ← gps+1;11.break; 12.end case 13.begin case 1:14.itext ←itext+str+space;15.gps ← gps+1;16.begin if(!EndWith(str,”|”))//判斷 str是否以字符”|”結(jié)尾17.fys ← fys+1;18.end if 19.break;20.end case 21.begin default:22.begin if(EndWith(str,”|”))23.string[] ss ← split(str,”|”);24.begin foreach(string s in ss)25.itext ← itext+s+”|”+space;26.gps ← gps+1;27.end foreach 28.end if 29.begin else 30.string[] ss ← split(str,”|”);31.begin for(int i←0;i 上述算法中,針對不同類型的拆分結(jié)果分別進(jìn)行了處理,結(jié)果包含重組字符串以及對應(yīng)的組合數(shù)和輔音元音組合數(shù)兩個參數(shù),用于篩選單詞的最佳音節(jié)劃分.對字符串t|a!i!s|a!r|和t|ai!s|a!r|進(jìn)行單詞重組,得到的重組字符串分別是“t|a |i s|a r|”和“t|ai s|a r|”,對應(yīng)的組合數(shù)分別是4和3,輔音元音組合數(shù)均為2. 排除極少數(shù)有歧義的情況,對于多個拆分結(jié)果,只有一個是正確的,即最佳音節(jié)劃分.通過對大量音譯成果進(jìn)行分析發(fā)現(xiàn),最佳音節(jié)劃分具備兩個特點:a.組合數(shù)最小;b.輔音元音組合數(shù)最大,這也符合自然語言的發(fā)音規(guī)則.因此,單詞taisar的最優(yōu)拆分方案是t|ai!s|a!r|,對應(yīng)的重組結(jié)果即音節(jié)劃分結(jié)果是“t|ai s|a r|”.采用這種策略不僅能獲得正確的結(jié)果,還能保證結(jié)果的唯一性. 根據(jù)重組結(jié)果確定音譯結(jié)果,其核心是確定每個組合中輔音字母和元音字母在規(guī)則表中的列號和行號,從而定位目標(biāo)語言項,詳細(xì)算法用偽碼表示如算法3. 算法3.規(guī)則表定位算法1.int[][] parrs;//規(guī)則表定位結(jié)果2.int pf,py;//輔音、元音字母索引位置3.string[] strs ← split(itext,space);//用空格符分割itext 4.begin foreach(string str in strs)5.begin if(EndWith(str,”|”)||StartWith(str,”|”))6.begin if(EndWith(str,”|”)7.int len ← length(str);8.string subf ← str.substring(0,len–1);//去掉 str中最后一個字符”|”9.pf ← pos(subf,flist);//在輔音字母列表flist中定位字母subf 10.parrs ←(pf,1);//將定位信息追加到數(shù)組中11.end if 12.begin else 13.string suby← str.substring(1);//去掉 str中第一個字符”|”14.py ← pos(suby,ylist);//在元音字母列表ylist中定位字母suby 15.parrs ←(1,py);16.end else 17.end if 18.begin else 19.int idx ← index(str,”|”);//返回字符”|”在 str中的索引位置20.string subf ← str.substring(0,idx);21.string suby ← str.substring(idx+1);22.pf ← pos(subf,flist);23.py ← pos(suby,ylist);24.parrs ←(pf,py);25.end else 26.end foreach 上述算法中,輔音字母列表和元音字母列表中前兩位存儲空字符串,輔音字母或元音字母從第三位開始存儲,單獨輔音字母組合或單獨元音字母組合對應(yīng)規(guī)則表的行號或列號為1.根據(jù)二維數(shù)組parrs中存儲的值,可以很方便地在規(guī)則表中查找到對應(yīng)的音譯結(jié)果.如字符串“t|ai s|a r|”中各個組合對應(yīng)的定位值分別為(4,7)、(5,2)和(13,1),對應(yīng)的音譯結(jié)果分別為“泰”、“薩”和“爾”,因此羅馬語單詞 taisar的音譯結(jié)果為“泰薩爾”. 本文提出的算法是在Win7操作系統(tǒng)上用C#語言編程實現(xiàn)的,軟件使用到的通用名詞庫、專有名詞庫、特殊規(guī)則表和音譯規(guī)則表均獨立于軟件本身,使用者可根據(jù)實際情況單獨進(jìn)行編輯,以滿足不同語種音譯的需要. 對英語地名單詞、羅馬化的普什圖語地名單詞、羅馬化的印地語地名單詞和俄語地名單詞進(jìn)行實驗,分別隨機抽取3000個單詞,分為5組,每組600個單詞,人工檢查音譯結(jié)果并統(tǒng)計正確率,實驗結(jié)果如表2所示. 表2 正確率統(tǒng)計結(jié)果(單位:%) 從實驗結(jié)果可以看出,音譯正確率可達(dá)91%以上,通過對音譯結(jié)果錯誤的單詞進(jìn)行分析發(fā)現(xiàn),導(dǎo)致錯誤的原因是:1)個別特殊規(guī)則未加入到特殊規(guī)則表中;2)未設(shè)置好特殊規(guī)則的優(yōu)先級;3)少量單詞的最佳音節(jié)劃分結(jié)果不唯一.在接下來的實驗中,本文將“連續(xù)兩個輔音字母按一個輔音字母發(fā)音”這一規(guī)則加入到特殊規(guī)則表中并在單詞預(yù)處理階段優(yōu)先使用,實驗結(jié)果如表3所示. 表3 本文方法的正確率統(tǒng)計結(jié)果(單位:%) 從實驗結(jié)果可以看出,完善規(guī)則表可有效提高音譯正確率.現(xiàn)有的音譯規(guī)則研究成果是音譯的重要基礎(chǔ),隨著任務(wù)的不斷拓展和深入,需要不斷完善和充實音譯規(guī)則表,確保音譯成果正確可靠.最佳音節(jié)劃分結(jié)果不唯一的單詞數(shù)量很少,但需人工干預(yù)以確定正確的音譯結(jié)果. 實驗結(jié)果表明,本文提出的算法能有效解決多語種音譯問題,在實際使用中只要設(shè)計好通用名詞庫、專有名詞庫、規(guī)則表和特殊規(guī)則表就能獲得良好的音譯效果.由于本文提出的算法較好地解決了音節(jié)劃分問題,有效避免了音節(jié)劃分錯誤,因此進(jìn)一步提高了音譯正確率,可以滿足雙語地圖、機器翻譯對雙語資源的需要.2.3 單詞重組
2.4 規(guī)則表定位
3 實驗結(jié)果與評價
3.1 算法實現(xiàn)
3.2 實驗結(jié)果與分析
4 結(jié)論與展望