2012-06-23 26 views
1

3天前,我問了一個問題關於建立具有3種語言並行詞典:removing differencies of some text pairs如何建立從雙語詞典一4language字典

的問題是如下: 我有2個文件對由以下特徵:pair1:(File1.txt,File2.txt)pair2:(File3.txt,File4.txt)

這些對中的每個文件之間存在逐行對應關係。說File1.txt和File3.txt是一些英文單詞,File2.txt和File4.txt分別是它們的阿拉伯語和法語翻譯。另外,File1.txt和File3.txt非常相似(在某些情況下也是如此)。


    File1.txt  File2.txt 
    EnWord1   ArTrans1 
    EnWord2   ArTrans2 
    EnWord3   ArTrans3 
    Enword4   ArTrans4 

    File3.txt  File4.txt 
    EnWord1   FrTrans1 
    EnWord3   FrTrans3 
    Enword4   FrTrans4 
    Enword5   FrTrans5 

我想要做的話,是對對英語兩側比較,發現同時出現在文件(EnWord1,EnWord3和EnWord4)的常用詞,並篩選出其相應的翻譯。 簡而言之,我可以說使用兩個雙語英語 - 阿拉伯語和英語法語字典,我正在試圖建立一個3語言的英語 - 阿拉伯語 - 法語字典。

史蒂夫回答我,寫了一個漂亮的代碼,找出重複的英語單詞和刪除他人和自己的翻譯:The answer could be found here

但我還是有一點更復雜的問題: 我應該怎麼做,如果我想補充另一種語言?我的意思是我有另一個英語 - 俄語詞典(說File5.txt包含英文實體,File6.txt包含俄羅斯實體),我想建立一個4語言詞典,而不是3語言詞典。

一種方法是使用當前代碼構建3語言詞典,然後通過在新語言對上重新運行它,構建4語言詞典。但我認爲效率不夠高,這將是解決這個問題的更好辦法。它也可能會在其他語言中引入一些不一致的地方。 我的主要挑戰是檢查重複:只有2個語言對時,檢查重複會很容易。但是如果我想檢查3對中的重複,我該怎麼辦? 如何更改代碼以便能夠在一次傳遞中提取4語言詞典?

+1

請注意,由於語義和使用/搭配差異,更不用說成語,短語動詞,俚語等詞語翻譯不起作用。 –

+0

是的亞歷克斯。你是對的。但正如我在前一個問題中提到的,我不想構建翻譯引擎。我想要做的是用3種雙語詞典(英語 - 阿拉伯語,英語 - 法語和英語 - 俄語)編制4語言詞典。使用3種語言的詞典比較容易,因爲檢查重複是比較容易的,但我不知道要檢查英語單詞是否在所有3對中。我必須補充說,這些字典包含短語,成語,甚至短句。 – Hakim

回答

1

我將描述一個我將在此任務中使用的通用方法。

1)define %dictionary hash。這個散列的每個鍵都是一個英文單詞,而每個值又將是對包含該單詞'translations的另一個散列的引用。就像這樣:

my %dictionary = ( 
    'EnWord1' => { 
    arabic => 'Arabic EnWord1', 
    french => 'French EnWord1', 
    ... 
    }, 
    ... 
); 

(在我們開始處理文件之前,這個哈希將是空的,我只是在這裏顯示一個結構)。

2)同時掃描每一對文件,向該散列添加相應的記錄。有一個簡單的方法:

my %filenames = (
    'arabic' => ['File1.txt', 'File2.txt'], 
    'french' => ['File3.txt', 'File4.txt'], 
    ... 
); 

for my $lang (keys %filenames) { 
    open my $efh, '<', $filenames{$lang}[0] or die $!, "\n"; 
    open my $tfh, '<', $filenames{$lang}[1] or die $!, "\n"; 
    while (<$efh>) { 
    chomp(my $enLine = $_); 
    chomp(my $trLine = <$tfh>); 
    $dictionary{$enLine}{$lang} = $trLine; 
    } 
} 

3)縮小%dictionary:只留下那些元素,它在掃描所有的語言定義的翻譯...

my $proper_translations_count = scalar keys %filenames; 
for my $word (keys %dictionary) { 
    my $translations = $dictionary{$word}; 
    if (scalar keys %$translations != $translations_count) { 
    delete $dictionary{$word}; 
    } 
} 

4)輸出%dictionary合適的任何方式。

0

我不知道Perl,但我會使用哈希映射。 每種語言的2個散列圖。 意義的全局標識符(中間語言),適用於所有字典。所以英文單詞x有id1,而阿拉伯語的id1是單詞y。 所以一個哈希映射將這些單詞映射到全局標識符上,另一個哈希映射將全局標識符映射到實際單詞上。所以,你可以從一種語言的每一個字有2個HashMap的電話(dict1.get(字):ID dict2ID.get(ID))轉換到其他

如果你想要一個簡單的解決方案,使用英語作爲你的中間語言,但是那樣你會在這些字典中出現一些錯誤。

添加新詞典將很容易。您只需獲得一份英文文件,然後使用english2中間散列映射來獲取新語言的標識符。