Нужно разбить строку 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%.

Другие вопросы по тегам