本文是在Niutrans論壇中的系列教程中總結出來的。
1、語料預處理
預處理的結果是生成雙語分詞之后的文件,該步需要注意的是對規則短語,比如數字、日期、網址等,進行泛化處理。可以用正則方法或者其它方法。注意日期中的點和外文人名中的點和網址中的點和句末標點要區分開來,數字和日期也要區分開來。
其中變化比較大的,比較難處理的,應該是中文的日期,因為它的格式比較多變。從文本中抽取出來中文日期時間(或者更進一步的轉化成標准的時間格式),有一個辦法,就是用trie樹進行抽取,相較於寫一大堆翻亂的正則表達式而言,它具有邏輯清晰,擴展簡單,代碼復雜度低的優點。具體算法過程會在后續的文章中詳細解說。就SMT的具體功能而言,在這一步其實只要把稍微規則的時間格式,比如2014-11-7,13:15這類的格式泛化出來就可以了;像諸如【三月8號下午6點半】【后天晚上7點】這類的,沒必要也泛化出來,其中包含的數字泛化出來即可,對結果的准確性影響不大。
在泛化之后的雙語中(特指不同種語言,比如中英文),最好檢查一下泛化的一致性,比如在中文中有多少個數字,英文中也要有對應的數目,時間日期網址等的個數也要相等。
而在文白雙語中,因為古文的語法語義跟現在有出入,可以不做處理。這一步可以弱化甚至不做。即只需要簡單的分詞即可,古文的分詞方法也需要斟酌,在實踐中我們采取的是一元分詞,即一字一詞。
2、詞對齊
詞對齊階段使用GIZA++進行單向對齊(實現了IBM model 1~5,具體算法我也在學習中),然后結合兩個單向對齊結果,利用對稱算法生成最終的對齊結果。
對稱算法大概是這樣的,先根據兩個結果生成一個矩陣。$M_{ij}$保存對齊結果:1)i與j雙向對齊;2)i對齊j;3)j對齊i;4)i與j沒有對齊。
1,把所有的1)節點加入結果集;
2,檢查結果集的每個節點的前后左右鄰居,有孤立無主的(即只與它相鄰的2或者3情況),吸附過去;
3,剩下的孤立的2)或者3)也加入結果集。
完畢。圖就不畫了。
3、短語抽取
第二步詞對齊結果生成一個bit矩陣,1代表對齊,2代表不對齊,其基本單位是第一步分詞后的單個詞。
該步可算是廣義的詞對齊,其單位是第二步的對此詞對,基於生成的bit矩陣。目標是抽取出雙語中的短語對。
短語對需要滿足一致性要求。所謂一致性,可簡單概括為封閉性和非空性。封閉性指的是短語中包含的詞匯的對齊方必在另一個短語中,不外漏;非空性指短語對中至少含有一對單詞是對齊了的。
在滿足一致性要求下,給出短語對大長度,即可找出所有滿足一致性要求的短語對。算法如下:
若要找出長度為len的短語對,對bit矩陣以len為窗口大小水平滑動,逐個check窗口中的短語對是否滿足一致性要求,check的標准是窗口框定的集合中沒有外部鄰居即可。若遇到某列全0,以上列非零列所在行為行。
4、計算短語概率
上一步抽取出來滿足一致性的短語對,這一步對短語對的概率進行估計,用極大似然估計,公式大概如下(第一次用mathjax書寫公式,看看效果):
\[ p\left(f|e\right)=\frac{count\left(e,f\right)}{count\left(e\right)}\]
這是短語翻譯概率,出來兩個概率。另外還有雙向詞匯化翻譯概率,再出來兩個概率。共4個概率。
5、最大熵調序
這一步根據上一步的結果對短語進行調序,用到了語言模型。