程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 基於統計機器翻譯的文白對譯,統計機器翻譯文白

基於統計機器翻譯的文白對譯,統計機器翻譯文白

編輯:C++入門知識

基於統計機器翻譯的文白對譯,統計機器翻譯文白


本文介紹利用NiuTrans工具進行文白對譯的步驟,默認用戶已經安裝NiuTrans,安裝目錄為NiuTrans/,以下相對路徑基於此目錄。

文白對譯模型訓練步驟分為語料預處理、對齊、翻譯模型訓練、語言模型訓練、參數調整四個階段。

一、語料預處理

我們拿到的原始數據格式比較雜亂,需要做預處理,最終形成規則的平行語料數據。

語 料預處理包括統一標點符號,刪除無關符號,刪除段前段後,句前句後空格,分詞等階段。最終形成兩個平行文件,暫稱為src.txt和tgt.txt兩個文 件(若是文白翻譯src為文,tgt為白,反之src為白,tgt為文),這兩個文件每行一句話(自然句),每句話已經分好詞,詞語以空格分割開,兩個文 件中每行一一對應,因此行數相等。

考慮到文白詞語的異意性,句句對齊後的句子分詞策略為:白話文為平常的中文分詞,文言文為一元分詞。

二、對齊

NiuTrans采用第三方工具giza++進行詞匯對齊,由於giza++只能進行單向對齊,為了保證對齊結果的准確性,NiuTrans合並了兩個方向上的對齊結果,生成了最終的對齊結果供後續步驟使用。

具 體來說,若src==》tgt對齊,giza++會生成一個名為src2tgt.A3.final的結果文件;若tgt==》src對齊,giza++會 生成一個名為tgt2src.A3.final的結果文件;NiuTrans對這兩個方向的A3文件進行合並,生成最終的對齊文件 alignment.txt。

以上的對齊步驟可參看腳本代碼scripts/NiuTrans-running-GIZA++.pl。

需要特別注意的是,giza++ 進行單向對齊時,如果源/目標句對的長度(分詞後詞匯個數)相差太大,giza++會對長的一方進行剪切,而在另一個方向目標/源對齊時,並不一定進行剪 切。這樣就造成了在兩個對齊結果文件src2tgt.A3.final和tgt2src.A3.final的不一致。這個不一致將會造成NiuTrans 在合並生成alignment.txt時發生錯誤直接退出。這種錯誤只跟源/目標的長度比有關,與具體哪種語言無關。因此本文題目雖然是《文白對譯步驟》,其實是所有語言通用的步驟。因此,直接運行腳本scripts/NiuTrans-running-GIZA++.pl,在第八步之後會出現錯誤退出,導致訓練失敗。

解決方法為:在第七步之後,第八步之前,遍歷src2tgt.A3.final和tgt2src.A3.final兩個文件,將不一致的句對從兩個A3文件中剔除,同時也從兩個平行語料文件中剔除。

遍歷算法很簡單,首先看下A3文件的格式:

# Sentence pair (20) source length 11 target length 13 alignment score : 1.14927e-38
智果 便 向 太史 請求 脫離 智族 姓氏 , 另 立 為輔 氏
NULL ({ 2 }) 智 ({ }) 果 ({ 1 5 6 7 8 }) 別 ({ 10 }) 族 ({ }) 於 ({ 3 }) 太 ({ 4 }) 史 ({ }) , ({ 9 }) 為 ({ }) 輔 ({ 11 12 }) 氏 ({ 13 })

上面摘錄的是一個句子對的對齊結果。第一行為句對描述,第二行為目標句子內容,第三行為對齊結果。【Sentence pair (20)】表示為第20個句對,source length 11表示源句長度為11,target length 13表示目標句子長度為13。遍歷兩個A3文件中的每個pair(三行),檢查若第一個文件中的source length與第二個文件中的target length相等,且第一個文件中的target length和第二個文件中的source length 相等,說明該句對是一致的,否則不一致,把該句對從兩個A3文件和平行文件中剔除。

處理代碼粘貼如下:

check.py
# -*- coding: utf-8 -*-
'''
Created on 2014年8月25日
@author: wuseguang
'''
import sys
import re
print "腳本名:", sys.argv[0]
if(len(sys.argv)!=5):
    print "參數不對"
    sys.exit()
src=sys.argv[1]
tgt=sys.argv[2]
srcs=sys.argv[3]
tgts=sys.argv[4]
errPairs=[]
with open(src,'r') as srcFile,open(tgt,'r')as tgtFile,open(src+'.check','w')as srcw,open(tgt+'.check','w')as tgtw:
    index=-1
    pair=0
    flag=True
    while True:
        index+=1
        print index
        srcLine=srcFile.readline()
        tgtLine=tgtFile.readline()
        if not srcLine or not tgtLine:
            break
         
        if index%3!=0 or not srcLine.startswith("# Sentence pair"):
            if flag:
                srcw.write(srcLine)
                tgtw.write(tgtLine)
            continue
        srcData=re.split('\D+',srcLine)
        tgtData=re.split('\D+',tgtLine)
        #print srcData
        #print tgtData
        if srcData[2]!=tgtData[3] or srcData[3]!=tgtData[2]:
            errPairs.append(index/3+1)
            flag=False
            continue
        pair+=1
        flag=True
        oldtitle="# Sentence pair ("+srcData[1]+")"
        newtitle='# Sentence pair ('+str(pair)+')'
        print oldtitle
        print newtitle
        srcw.write(srcLine.replace(oldtitle,newtitle))
        tgtw.write(tgtLine.replace(oldtitle,newtitle))
         
with open(srcs,'r') as srcsfile,open(tgts,'r') as tgtsfile,open(srcs+'.check','w')as srcw,open(tgts+'.check','w')as tgtw:
    pair=0
    errSet=set(errPairs)
    #print srcs+'\n'
    #print tgts+'\n'
    while True:
        pair+=1
        #print 'pair:',pair
        srcline=srcsfile.readline()
        tgtline=tgtsfile.readline()
        if not srcline or not tgtline:
            break
        if pair in errSet:
            continue
        srcw.write(srcline)
        tgtw.write(tgtline)
print errPairs
print len(errPairs)

 

請將該文件放置於scripts目錄下。後續腳本會自助調用。

然後,注釋掉scripts/NiuTrans-running-GIZA++.pl腳本中的第八步的代碼。在調用scripts/NiuTrans-running-GIZA++.pl腳本之後,調用check.py進行一致性檢查,最後調用NiuTrans的合並對齊命令../bin/NiuTrans.SymAlignment。

三、翻譯模型訓練

在上一步對齊的結果alignment.txt上,進行翻譯模型的訓練,訓練命令為:

perl NiuTrans-phrase-train-model.pl -tmdir $workDir/model.phrase/ -s $srcFile -t $tgtFile -a $aligFile

-s指向源平行語料文件,-t指向目標平行語料文件,-a指向alignment.txt文件。

 

四、語言模型訓練

語言模型檢查目標語言的合法度,因此訓練語料只需用目標語言語料即可,格式跟平行語料格式一樣,即每行一句,沒句以空格分詞。訓練命令如下:

perl NiuTrans-training-ngram-LM.pl -corpus $lmodelFile -ngram 3 -vocab $workDir/lm/lm.vocab -lmbin $workDir/lm/lm.trie.data
lmodelFile即為訓練語料文件,慣例以lm.txt命名。

 

五、參數調整

參數調整階段,對上面訓練的兩個模型(翻譯模型和語言模型)進行權重的調整,其實質是把這兩個模型作為兩個feature,然後套如特征模型。

訓練命令如下:

perl NiuTrans-phrase-generate-mert-config.pl -tmdir $workDir/model.phrase/ -lmdir $workDir/lm/ -ngram 3 -o $workDir/NiuTrans.phrase.user.config

 

六、總流程小結

為了操作方便,以上的所有流程我寫成到了一個總腳本中,名為train.sh放置在script目錄下。內容如下:

 1 #!/bin/sh
 2 scriptDir=$(realpath $PWD)
 3 workDir=$(realpath $1)
 4 srcFile=${workDir}/preprocessing/$2
 5 tgtFile=${workDir}/preprocessing/$3
 6 lmodelFile=${workDir}/preprocessing/$4
 7 aligFile=$workDir/wordalignment/alignment.txt
 8 src2tgtA3File=$workDir/wordalignment/src2tgt.A3.final
 9 tgt2srcA3File=$workDir/wordalignment/tgt2src.A3.final
10 echo "script_dir is ${scriptDir}"
11 echo "work_dir is $workDir"
12 echo "src_file is ${srcFile}"
13 echo "tgt_file is ${tgtFile}"
14 echo "alignFile is $aligFile"
15 #exit
16 mkdir $workDir/wordalignment -p
17 mkdir $workDir/lm -p
18 mkdir $workDir/model.phrase -p
19 #exit
20 cd $scriptDir
21 perl NiuTrans-running-GIZA++.pl -src $srcFile -tgt $tgtFile -out $aligFile -tmpdir $workDir/wordalignment/
22 cd $scriptDir
23 python $scriptDir/check.py $src2tgtA3File $tgt2srcA3File $srcFile $tgtFile
24 src2tgtA3File=${src2tgtA3File}.check
25 tgt2srcA3File=${tgt2srcA3File}.check
26 srcFile=${srcFile}.check
27 tgtFile=${tgtFile}.check
28 cd $scriptDir
29 ../bin/NiuTrans.SymAlignment  $tgt2srcA3File $src2tgtA3File $aligFile
30 cd $scriptDir
31 perl NiuTrans-phrase-train-model.pl -tmdir $workDir/model.phrase/ -s $srcFile -t $tgtFile -a $aligFile
32 cd $scriptDir
33 perl NiuTrans-training-ngram-LM.pl -corpus $lmodelFile -ngram 3 -vocab $workDir/lm/lm.vocab -lmbin $workDir/lm/lm.trie.data
34 cd $scriptDir
35 perl NiuTrans-phrase-generate-mert-config.pl -tmdir $workDir/model.phrase/ -lmdir $workDir/lm/ -ngram 3 -o $workDir/NiuTrans.phrase.user.config

腳本的內容已經非常清晰,不再詳述。

運行此腳本的前提為:1、NiuTrans-running-GIZA++.pl腳本中第八步已經被注釋;2、check.py已經放置在scripts文件夾下。

運行示例:(wenyan.txt baihua.txt位於../work/preprocessing/目錄)

./train.sh ../work/ wenyan.txt baihua.txt lm2.txt

七、測試

在模型訓練完畢後,即可進行測試。首先需要具備測試文件test.txt,測試文件格式與平行文件格式一樣,與訓練語料保持無交集即可。測試命令如下:

perl NiuTrans-phrase-decoder-model.pl -test $workDir/test/test.txt -c $workDir/NiuTrans.phrase.user.config -output $workDir/test/Xbest.out

-test指明測試文件位置,-c指明上一步訓練的模型配置文件位置,-output 指明翻譯結果文件位置。

注意,若需要指明多個翻譯結果,需要修改腳本NiuTrans-phrase-decoder-model.pl第56行的-nbest參數,默認為1。


對於怎翻譯的問題

常見問題解答

概述

什麼是“自動翻譯”?
Google 開發了自己的翻譯軟件嗎?
什麼是基於統計的機器翻譯?
翻譯質量不太理想,能翻得更准確點嗎?
如何向 Google 提供反饋?
Google 如何處理我的反饋意見?
我還有問題。哪裡可以獲得更多信息?
語言對

能翻譯哪些語言?
“檢測語言”的含義是什麼?
翻譯功能何時能夠支持其他語言?
文字和網頁翻譯

搜索結果旁的“翻譯此頁”鏈接是什麼意思?
為什麼不是所有可譯語言的結果都有“翻譯此頁”鏈接?
我不希望自己的網頁被翻譯出來,怎麼辦?
“更好的翻譯建議”鏈接是什麼意思?
經過翻譯的搜索結果

如何搜索使用其他語言的網站?
搜索使用其他語言的網站是如何進行的?
如果我的搜索字詞翻譯得不夠准確,怎麼辦?
是否支持高級搜索操作符?
我不希望搜索字詞被翻譯出來,怎麼辦?
字典翻譯

如何從字典中獲得翻譯?
什麼是相關詞組?
字典翻譯都支持哪些語言?

概述
什麼是“自動翻譯”?

這是在無人為干預的情況下利用最新技術提供的翻譯。自動翻譯通常也稱為“機器翻譯”。

Google 開發了自己的翻譯軟件嗎?

是。Google 的研究小組已針對現在在 Google 翻譯中提供的語言對開發出了自己基於統計的翻譯系統。

什麼是基於統計的機器翻譯?

目前人們所使用的大多數最新商用機器翻譯系統都是采用基於規則的方法開發的,需要投入大量定義詞匯和語法的工作。

我們的系統采用了不同的方法:我們將數十億字詞的文字內容輸入了計算機,其中既包括單一目標語言的文本,也包括由一對對語言間的人工翻譯示例(按翻譯單位對齊)構成的文本。然後,我們應用統計學的學習技術構建了翻譯模型。我們在研究性評估中獲得了很好的效果。

翻譯質量不太理想,能翻譯得更准確點嗎?

我們一直致力於改進翻譯質量。不過,即使當今最先進的軟件也無法達到一個人講母語時的流利程度,也無法與專業譯員的技能相媲美。自動翻譯殊非易事,因為字詞的含義取決於具體的上下文環境。盡管我們在努力解決此問題,但要開發出能提供等同於人工翻譯質量的軟件,恐怕尚需時日。在此期間,我們希望所提供的服務能夠滿足大多數場合的基本要求。

另外,為了提高質量,我們需要大量雙語文本內容。如果您有大量雙語或多語文本內容,並願意提供的話,請告訴我們。

如何向 Google 提供反饋?

您可以通過以下方式提供反饋:翻譯文字時,點擊“更好的翻譯建議”鏈接;翻譯網頁時,將鼠標懸停在翻譯後的文字上(顯示原始文字工具提示)並點擊“更好的翻譯建議”鏈接。

Google 如何使用我的反饋意見?

以後對已開發的語言對進行更新時,我們會利用您的反饋意見來改進翻譯質量。

我還有問題。哪裡可以獲得更多信息?

請浏覽 Google 翻譯論壇。...余下全文>>
 

翻譯一下兩個句子 漢譯英的

1、主要研究方向為自然語言處理
Research interests include natural language processing
2、 實驗語料使用了CWMT2009 漢蒙評測語料,實驗語料規模如表4,在開發集和測試集上的實驗結果如表5所示。其中:baseline系統是基於短語的漢蒙統計機器翻譯系統;QF表示對於訓練語料進行了形態切分; JF:表示進行了句法調序;
Experiments using CWMT2009 Han Mongolian corpus corpus evaluation, experimental corpus size in Table 4, in the development set and test set on the experimental results shown in Table 5. Including: baseline system is based on the phrase of the Han Mongolian statistical machine translation system; QF that had forms for the training data segmentation; JF: that was syntactic reordering;
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved