2013-12-19 135 views
3

我正在爲我的翻譯系統使用moses工具包。我使用阿薩姆語和英語平行語料庫並訓練它們。但是一些專有名詞沒有被翻譯。這是因爲我有一個非常小的語料庫(並行數據集)。所以我想在我的翻譯系統中使用音譯過程。需要拆分Unicode字符串

我使用這個命令進行翻譯:echo'কানাদাএখনবিশালদেশ。'| 〜/ mymoses/bin/moses -f〜/ work/mert-work/moses.ini

這給了我輸出「কানাদা是一個廣大的國家」。

這是因爲單詞「কানাদা」不在我的平行語料庫中。

因此,我在阿薩姆語和英語中採用了一些平行的單詞列表,並且逐個字符地打破每個單詞。因此,兩個文件的每一行都會有一個單詞,每個字符(或每個音節)之間留有空格。我已經使用這兩個文件來訓練系統作爲正常的翻譯任務

然後,我使用以下命令echo'কানাদাএখনএখনবিশললদেশ。'| 〜/ mymoses/bin/moses -f〜/ work/mert-work/moses.ini | ./space.pl

這給我的輸出「কানাদা是一個幅員遼闊的國家」

我必須打破這個詞,因爲我已經訓練系統字符明智..

然後我使用了我使用命令訓練過的音譯系統:

echo'কানাদাএখনবিশালদেশ。'| 〜/ mymoses/bin/moses -f〜/ work/mert-work/moses.ini | ./space.pl | 〜/ mymoses /斌/摩西-f〜/ WORK1 /火車/模型/ moses.ini

這給我的輸出 「加拿大是一個幅員遼闊的國家」

的字符爲transliterated..but唯一的問題是單詞之間的空格。因此,我想使用將加入單詞的perl文件。我的最終命令將是

echo'কানাদাএখনবিশালদেশ。'| 〜/ mymoses/bin/moses -f〜/ work/mert-work/moses.ini | ./space.pl | 〜/ mymoses/bin/moses -f〜/ work1/train/model/moses.ini | ./join.pl

幫我看看這個「join.pl」文件。

+0

如果您告訴我們_如果您想分割阿薩姆語單詞,它可能會有所幫助。我懷疑你可能在這裏有[X/Y問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。在下面的評論之一中,你提到你想要音譯音符:如果是這樣,你可能會更好地詢問(在單獨的問題中)做一個方法去做_that_。 –

回答

4

如何:

use utf8; 
my $str = "ভাৰত is a famous country. দিল্লী is the capital of ভাৰত"; 
$str =~ s/([\x{0980}-\x{09FF}])(?=[\x{0980}-\x{09FF}])/$1 /g; 
say $str; 

輸出:

ভ া ৰ ত is a famous country. দ ি ল ্ ল ী is the capital of ভ া ৰ ত 

你可以用它在你的程序,只是改變了while循環:

while(<>) { 
    s/([\x{0980}-\x{09FF}])(?=[\x{0980}-\x{09FF}])/$1 /g; 
    print $_; 
} 

但我認爲你想做什麼:

my %corresp = (
    'ভ' => 'Bh', 
    'া' => 'a', 
    'ৰ' => 'ra', 
    'ত' => 't', 
); 
my $str = "ভাৰত is a famous country. দিল্লী is the capital of ভাৰত"; 
$str =~ s/([\x{0980}-\x{09FF}])/exists($corresp{$1}) ? $corresp{$1} : $1/eg; 
say $str; 

輸出:

Bharat is a famous country. দিল্লী is the capital of Bharat 

注:這是由你來打造真正的相應哈希值。我對阿薩姆人物一無所知。

+0

它的工作..但我想要一個任意字符串..請幫助..並且在翻譯後我得到「bh a r t t是一個着名的國家」。我想重新加入分裂的字符,即我想輸出爲「巴拉特是一個着名的國家」..請幫助我..預先感謝 – user3064729

+0

@ user3064729:我不能做翻譯,但輸出是你想,不是嗎? – Toto

+0

是的..我只想輸出.. – user3064729

1

它正在做你正在告訴它。 @a=split('')將分割整個行,你不告訴它只分裂第一個單詞。首先你需要確定你要拆分的字符串,然後把它分解:

#!/usr/bin/perl 
use utf8; 
use Getopt::Std; 
use IO::Handle; 

binmode(STDIN, ':utf8'); 
binmode(STDOUT, ':utf8'); 
binmode(STDERR, ':utf8'); 

while(<>) 
{ 
    chomp; 
    ## find the first word, capture it as $1 and delete it from the line 
    s/(.+?)\s//; 
    @a=split('',$1); 
    ## Print your joined string and the rest of the line 
    print join(" ",@a) . " $_\n"; 
} 
+0

其實我正在用它來建立一個機器翻譯系統......我現在得到的輸出是「bh a r t t是一個着名的國家」。你能幫我得到這樣的輸出:「巴拉特是着名的國家」。實際上,在分解這個詞之後,它翻譯了它,然後我必須再次加入這些字母。請幫忙 – user3064729

+0

@ user3064729我不知道你是如何實現這個或你的翻譯如何工作的,我怎麼能幫你?你問了如何分割一行的第一個單詞,我的回答告訴你。如果您還有其他問題,請發佈一個單獨的問題,並解釋您正在嘗試做什麼以及如何失敗。 – terdon

+0

我的工作不是分裂第一個詞。其實這個不是英文的詞可能在句子的任何地方。它沒有必要在第一個位置,它可能不止一個詞,我需要分裂。例如,句子可能是「দিল্লী是ভাৰত的首都」你能幫助我一個只會分裂的程序嗎? unicode字符串放在句子的任何位置。 – user3064729

0

添加類似

$str =~ s/([\w]) (?<=[\w.,;:!?])/$1/g; 

它打算刪除拉丁文字符之間的空間。 隨着前瞻。 不是100%。

4

您可以使用\p{...}\P{...},這將允許您匹配或不匹配perluniprops中指定的特定字符類別。

我使用\P{Latin}它選擇非拉丁字符\s爲了不匹配位:

#! /usr/bin/env perl 
# 
use strict; 
use warnings; 
use feature qw(say); 

use utf8; 
binmode(STDOUT, ':utf8'); # Why is this needed when you specify "use utf8;"? 

my $string = "ভাৰত is a famous country"; 
$string =~ s/([^\p{Latin}\s])/$1 /g; # Put a space after all non-latin chars 
say $string; 

這將打印出:

ভ া ৰ ত is a famous country 

唯一的問題是後雙倍空間。