2013-12-19 2 views
3

번역 시스템에 moses 툴킷을 사용하고 있습니다. 나는 아쌈 어와 영어 병렬 자료를 사용하고 훈련 시켰습니다. 그러나 일부 고유 명사는 번역되지 않습니다. 이것은 내가 아주 작은 코퍼스 (병렬 데이터 세트)를 가지고 있기 때문입니다. 그래서 번역 시스템에서 음역 처리를 사용하고 싶습니다.유니 코드 문자열을 분할해야합니다.

내 번역에이 명령을 사용하고 있습니다 : echo 'কানাদা এখন বিশাল দেশ.'| ~/mymoses/bin/moses -f ~/work/mert-work/moses.ini

이렇게하면 "কানাদা은 광대 한 나라"라는 결과를 얻었습니다.

"কানাদা"이라는 단어가 제 평행 코퍼스에 없기 때문입니다.

그래서 나는 아삼 어와 영어로 몇 가지 평행 한 단어 목록을 취하고 각 단어를 문자별로 분해합니다. 따라서 두 파일의 각 줄에는 각 문자 (또는 각 음절) 사이에 공백이있는 단일 단어가 있습니다. 나는이 2 개의 파일을 사용하여 시스템을 정상적인 번역 작업으로 훈련시켰다.

그런 다음 나는 'কানাদা এখন বিশাল দেশ.' ~/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 ~/근무처/기차/모델/moses.ini

이 나에게 출력을 준

문자가 유일한 문제 transliterated..but있다 "캐나다는 광대 한 나라입니다" 단어 사이에 공백이 있습니다. 그래서 저는 단어에 참여할 펄 파일을 사용하고 싶습니다. 마지막 명령은

입니다. 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) 여기있을 수 있습니다 용의자. 아래 주석 중 하나에서 문자를 음역하고 싶다고 말하면 : 그렇다면, (별개의 질문으로) 문자를 쓰는 것이 더 나을 것입니다. –

답변

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 

NB : 그것은 진정한 해당 해시를 구축하는 당신에게 달려 있습니다. 나는 아삼의 인물에 대해 아무것도 모른다.

+0

그것은 일했다. 그러나 나는 임의의 문자열을 원한다. 도와주세요. 번역 후 나는 "유명한 나라입니다."라고 말합니다. 예를 들어, "bharat은 유명한 나라입니다."라는 출력을 원합니다. 제발 도와주세요 .. 미리 감사드립니다. – 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가 유명한 국가"가되었습니다. "bharat은 유명한 나라입니다." 실제로 단어를 나눈 후에, 그것은 그것을 번역하고, 다시 나는 편지에 가입해야합니다. 제발 도와주세요 – user3064729

+0

@ user3064729 어떻게 구현하고 있는지 또는 번역 작동 방식을 잘 모릅니다. 어떻게 도와 드릴까요? 당신은 어떻게 선의 첫 단어를 나눌 것인지 물었고 나의 대답이 당신에게 알려줍니다. 다른 질문이있는 경우 별도의 질문을 게시하고 정확히 무엇을하려고하고 어떻게 실패하는지 설명하십시오. – terdon

+0

제 일은 첫 단어를 나눠서하는 것이 아닙니다. 실제로 영어가 아닌 단어는 문장의 어느 곳에 나있을 수 있습니다. 그것이 첫 번째 위치에 있어야 할 필요는 없으며 나눌 필요가있는 단어가 두 개 이상일 수 있습니다. 예를 들어 문장은 "দিল্লভ은 ভাৰত의 수도"라고 할 수 있습니다. 유니 코드 문자열은 문장의 어느 곳에 나 배치됩니다. – 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 

유일한 문제는 뒤에 그 두 배 공간.

관련 문제