Talk:ReTraTos
Jump to navigation
Jump to search
Giza → LIHLA
$ cat giza_to_lihla.pl #!/usr/bin/perl # Programa GIZA_to_LIHLA # Entrada: arquivo alinhado lexicalmente retornado por GIZA++ # Saida: Arquivos alinhados por GIZA no formato de LIHLA # Funcao: Converte a saida de GIZA no padrao de LIHLA use strict; use locale; if ($#ARGV < 2) { print "Uso: $0 <entrada> <dir_fonte> <dir_alvo>\n"; exit 1; }; my ($entrada,$fonte,$alvo,@tfonte,@talvo,$t,$al,@ali,$i,$sent,$dirfonte,$diralvo,$ci); $entrada = shift(@ARGV); $dirfonte = shift(@ARGV); $diralvo = shift(@ARGV); if ($dirfonte !~ /\/$/) { $dirfonte .= '/'; } if ($diralvo !~ /\/$/) { $diralvo .= '/'; } mkdir($dirfonte); mkdir($diralvo); print STDERR "Dir fonte: $dirfonte\n"; print STDERR "Dir alvo: $diralvo\n"; # Sentence pair (1) source length 1 target length 1 alignment score : 0.977598 # etiquetados_pos/es/ES-ci-abr03_01 # NULL ({ }) etiquetados_pos/pt/ParC-PB-o_RE-IF-F-ci-abr03_01 ({ 1 }) $ci = 0; $fonte = $alvo = ""; $sent = -1; open(ARQ,$entrada) or die "Nao eh possivel abrir o arquivo $entrada\n"; while (<ARQ>) { s/\n//g; #if (/^([^\s]+\/)+([^\/]+)$/) { if ($ci == 0) { if (($fonte ne "") && ($alvo ne "")) { close OUTF; close OUTA; } $sent = 0; $alvo = $diralvo.$entrada.$2; #print "$alvo\n"; #$alvo =~ s/\.\w+[\n\s]*$//g; # remove a extensao original $alvo .= '.al'; # e poe .al #print STDERR "Formatando arquivos $1 e "; #$t = <ARQ>; #if ($t =~ /^.+\/([^\/]+)\s+\(\{.+\}\).*$/) { $fonte = $dirfonte.$entrada.$1; #$fonte =~ s/\.\w+[\n\s]*$//g; # remove a extensao original $fonte .= '.al'; # e poe .al #} #print STDERR "$1\n"; #print STDERR "fonte: $fonte\n"; #print STDERR "alvo: $alvo\n"; open(OUTF,">$fonte") or die "Nao eh possivel abrir o arquivo $fonte\n"; open(OUTA,">$alvo") or die "Nao eh possivel abrir o arquivo $alvo\n"; $ci = 1; } elsif (/^\#/) { $sent++; next; } else { s/\n//; @talvo = split(/ /,$_); $_ = <ARQ>; s/\n//; # NULL ({ 3 }) balão ({ 1 }) analisar ({ 2 }) atmosfera ({ 4 }) tropical ({ 5 }) @tfonte = split(/\s+\}\)\s*/,$_); # NULL ({ 3,balão ({ 1,analisar ({ 2,atmosfera ({ 4,tropical ({ 5, ($t,$al) = split(/\s\(\{\s*/,shift(@tfonte)); @ali = split(/\s/,$al); while ($#ali >= 0) { $talvo[shift(@ali)-1] .= ":0"; } $i = 0; while ($i <= $#tfonte) { ($t,$al) = split(/\s\(\{\s*/,$tfonte[$i]); if ($al =~ /\d+/) { @ali = split(/\s/,$al); $tfonte[$i] = $t.":".join("_",@ali); while ($#ali >= 0) { if (($talvo[$ali[0]-1] !~ /:/) || ($talvo[$ali[0]-1] eq ":")) { $talvo[$ali[0]-1] .= ":".($i+1); } else { $talvo[$ali[0]-1] .= "_".($i+1); } shift(@ali); } } else { $tfonte[$i] =~ s/\s*\(\{/:0/g; } $i++; } map($_ !~ /\:\d+(\_\d+)*$/ ? $_ .= ":0" : (),@talvo); print OUTF "<s snum=$sent>",join(" ",@tfonte),"</s>\n"; print OUTA "<s snum=$sent>",join(" ",@talvo),"</s>\n"; } } close OUTF; close OUTA;
Feature requests
- Ability to specify constraints -- e.g. only allow nouns to be translated by nouns
- Ability to turn off multiword generation altogether
- Script to select "high quality" sentences from an aligned corpora -- e.g. strip out those with excess punctuation or numbers
- Something to take into account an existing bilingual dictionary -- either as a bootstrap or something like this.