Нужно разбить строку Unicode
Я использую набор инструментов Моисея для моей системы перевода. Я использую ассамский и английский параллельный корпус и обучаю их. Но некоторые собственные существительные не переводятся. Это потому, что у меня очень маленький корпус (параллельный набор данных). Поэтому я хочу использовать процесс транслитерации в моей системе перевода.
Я использую эту команду для моего перевода: echo 'কানাদা এখন বিশাল দেশ ।'| ~/mymoses/bin/moses -f ~/work/mert-work/moses.ini
Это дало мне вывод "a огромная страна".
Это потому, что слово "কানাদা" не в моем параллельном корпусе.
Поэтому я взял параллельный список слов на ассамском и английском языках и разбил каждое слово по буквам. Таким образом, каждая строка двух файлов будет содержать отдельные слова с пробелом между каждым символом (или каждым слогом). я использовал эти 2 файла, чтобы обучить систему как нормальную задачу перевода
Затем я использовал следующую команду echo 'কানাদা এখন বিশাল দেশ ।'| ~/mymoses/bin/moses -f ~/work/mert-work/moses.ini | ./space.pl
Это дало мне вывод "ক া ন া দ া - огромная страна"
Я должен был сломать слово, потому что я тренировал систему по характеру..
Затем я использовал систему транслитерации, которую я обучил с помощью команды:
эхо 'কানাদা এখন বিশাল দেশ ।'| ~/mymoses/bin/moses -f ~/work/mert-work/moses.ini | ./space.pl | ~/mymoses/bin/moses -f ~/work1/train/model/moses.ini
Это дало мне вывод "Канада огромная страна"
Символы транслитерированы... но единственная проблема - это пробелы между словом. Так что я хочу использовать файл perl, который присоединится к слову. Моя последняя команда будет
эхо 'কানাদা এখন বিশাল দেশ ।'| ~/mymoses/bin/moses -f ~/work/mert-work/moses.ini | ./space.pl | ~/mymoses/bin/moses -f ~/work1/train/model/moses.ini | ./join.pl
Помогите мне с этим файлом "join.pl".
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: Вам решать создать настоящий соответствующий хэш. Я ничего не знаю об ассамских персонажах.
Ты можешь использовать \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
Единственная проблема заключается в том, что двойной пробел после ত
,
Он делает именно то, что вы говорите. @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";
}
Добавить что-то вроде
$str =~ s/([\w]) (?<=[\w.,;:!?])/$1/g;
который намеревается убрать пробел между латинским словом chars. С прогнозом. Не 100%.