#!/usr/bin/perl -s use jspell; jspell_dict("port"); select(STDIN); $| =1; select(STDOUT); $| =1; %cache = qw( ! ! " " ( ( ) ) , , . . ... ... : : ; ; ? ? que QUE se SE o DADMS os DADMP as DADFP uns DAIMP umas DAIFP dois DNCMP duas DNCFP no &MS do &MS dos &MP nos &MP da &FS na &FS das &FP nas &FP ); $cache{ a } = "DADFS"; # PREP"; $cache{ um } = "DAIMS"; # DNCMS"; $cache{ uma }= "DAIFS"; # DNCFS"; while () { chop; if (exists $cache{lc($_)}) { print STDOUT "$cache{lc($_)}\n" } else { @a = &fea($_); @a = ($a[0]) unless $k ; for (@a) { %b = %{$_}; # Confusão: # determinantes: if ($b{'CAT'} eq 'art'){ # Artigos: o léxico já prevê todos... print STDOUT "\UART\n";# por isso, NUNCA SE DEVE CHEGAR AQUI!!! # 16 tags } elsif ($b{'CAT'} eq 'card'){ # Numerais cardinais: print STDOUT "\UDNCNP\n"; } # o léxico já prevê os que flectem (1 e 2); o resto é tudo neutro plural. elsif ($b{'CAT'} eq 'nord'){ # Numerais ordinais: print STDOUT "\UDNO$b{'G'}$b{'N'}\n"; } # Pronomes: elsif ($b{'CAT'} eq 'ppes' || $b{'CAT'} eq 'prel' || $b{'CAT'} eq 'ppos' || $b{'CAT'} eq 'pdem' || $b{'CAT'} eq 'pind' || $b{'CAT'} eq 'pint'){ if ($b{'CAT'} eq 'ppes'){ $b{'CAT'} = 'PS';} # Pronomes pessoais elsif ($b{'CAT'} eq 'prel'){ $b{'CAT'} = 'PR';} # Pronomes relativos elsif ($b{'CAT'} eq 'ppos'){ $b{'CAT'} = 'PP';} # Pronomes possessivos elsif ($b{'CAT'} eq 'pdem'){ $b{'CAT'} = 'PD';} # Pronomes demonstrativos elsif ($b{'CAT'} eq 'pint'){ $b{'CAT'} = 'PI';} # Pronomes interrogativos elsif ($b{'CAT'} eq 'pind'){ $b{'CAT'} = 'PF';} # Pronomes indefinidos if ($b{'G'} eq '_'){ $b{'G'} = 'N';} if ($b{'N'} eq '_'){ $b{'N'} = 'N';} print STDOUT "\U$b{'CAT'}$b{'C'}$b{'G'}$b{'P'}$b{'N'}\n"; # $b{'C'}: caso latino. } # Nomes: elsif ($b{'CAT'} eq 'nc'){ # Nomes comuns: if ($b{'G'} eq '_' || $b{'G'} eq ''){ $b{'G'} = 'N';} if ($b{'N'} eq '_' || $b{'N'} eq ''){ $b{'N'} = 'N';} print STDOUT "\U$b{'CAT'}$b{'G'}$b{'N'}\n"; } elsif ($b{'CAT'} eq 'np'){ # Nomes próprios: if ($b{'G'} eq '_' || $b{'G'} eq ''){ $b{'G'} = 'N';} if ($b{'N'} eq '_' || $b{'N'} eq ''){ $b{'N'} = 'N';} print STDOUT "\U$b{'CAT'}$b{'G'}$b{'N'}\n"; } # Adjectivos: elsif ($b{'CAT'} eq 'adj'){ if ($b{'G'} eq '_'){ $b{'G'} = 'N';} if ($b{'G'} eq '2'){ $b{'G'} = 'N';} if ($b{'N'} eq '_'){ $b{'N'} = 'N';} # elsif ($b{'N'} eq ''){ # $b{'N'} = 'N'; # } print STDOUT "\UJ$b{'G'}$b{'N'}\n"; } # Adjectivos que podem funcionar como nomes comuns: elsif ($b{'CAT'} eq 'a_nc'){ if ($b{'G'} eq '_'){ $b{'G'} = 'N';} if ($b{'G'} eq '2'){ $b{'G'} = 'N';} if ($b{'N'} eq '_'){ $b{'N'} = 'N';} # elsif ($b{'N'} eq ''){ # $b{'N'} = 'N'; # } print STDOUT "\UX$b{'G'}$b{'N'}\n"; } # Verbos: elsif ($b{'CAT'} eq 'v'){ # formas nominais: if ($b{'T'} eq 'inf'){ $b{'T'} = 'N';} # infinitivo impessoal # (Nome do verbo) elsif ($b{'T'} eq 'ppa'){ $b{'T'} = 'PP';} # Particípio Passado elsif ($b{'T'} eq 'g') { $b{'T'} = 'G';} # Gerúndio # modo indicativo: elsif ($b{'T'} eq 'p') { $b{'T'} = 'IH';} # presente (Hoje) elsif ($b{'T'} eq 'pp') { $b{'T'} = 'IP';} # pretérito Perfeito elsif ($b{'T'} eq 'pi') { $b{'T'} = 'II';} # pretérito Imperfeito elsif ($b{'T'} eq 'pmp'){ $b{'T'} = 'IM';} # pretérito Mais-que-perfeito elsif ($b{'T'} eq 'f') { $b{'T'} = 'IF';} # Futuro # modo conjuntivo (Se): elsif ($b{'T'} eq 'pc') { $b{'T'} = 'SH';} # presente (Hoje) elsif ($b{'T'} eq 'pic'){ $b{'T'} = 'SI';} # pretérito Imperfeito elsif ($b{'T'} eq 'fc') { $b{'T'} = 'PI';} # Futuro # (ver Infinitivo (Pessoal ou Presente) abaixo. # modo iMperativo: elsif ($b{'T'} eq 'i') { $b{'T'} = 'MH';} # presente (Hoje) # modo Condicional: elsif ($b{'T'} eq 'c') { $b{'T'} = 'CH';} # presente (Hoje) # modo Infinitivo (Pessoal ou Presente): elsif ($b{'T'} eq 'ip'){ $b{'T'} = 'PI';} # Futuro conjuntivo? Só se tiver um "se" antes! -> regras sintácticas... # modo&tempo não previstos ainda... else{ $b{'T'} = '_UNKNOWN';} # converter 'P=1_3' em 'P=_': provisório(?)! if ($b{'P'} eq '1_3'){ $b{'P'} = '_';} # único sítio com '_' como rhs!!! print STDOUT "\U$b{'CAT'}$b{'T'}$b{'G'}$b{'P'}$b{'N'}\n"; # Género, só para VPP. # +/- 70 tags } # Preposições¹: elsif ($b{'CAT'} eq 'prep'){ print STDOUT "\UP\n";} # Advérbios²: elsif ($b{'CAT'} eq 'adv'){ print STDOUT "\UADV\n";} # Conjunções²: elsif ($b{'CAT'} eq 'con'){ print STDOUT "\UC\n";} # Interjeições¹: elsif ($b{'CAT'} eq 'in'){ print STDOUT "\UI\n";} # ¹: não sei se a tag devia ser tão atómica, mas para já não há confusão! # Contracções¹: elsif ($b{'CAT'} eq 'cp'){ if ($b{'G'} eq '_'){ $b{'G'} = 'N';} if ($b{'N'} eq '_'){ $b{'N'} = 'N';} print STDOUT "\U&$b{'G'}$b{'N'}\n"; } # ²: falta estruturar estes no próprio dicionário... # Palavras do dicionário com categoria vazia ou sem categoria, # palavras não existentes ou seqüências aleatórias de caracteres: elsif ($b{'CAT'} eq ''){ print STDOUT "\U¿\n";} # restantes categorias (...?) else { print STDOUT "\UUNTREATED\n";} # else {print "\U$b{'CAT'}\n";} } print "\n" if $k; } } 1; __END__ =head1 NAME ems-guesser - EMS interface to jspell =head1 SYNOPSIS ems-guesser =head1 DESCRIPTION This script is not intended to be used independently. For each word per line on the standard input, runs jspell and returns a compact morphological analysis. =head1 SEE ALSO EMS =head1 COPYRIGHT Copyright (C)2002-2003 Jose Joao Almeida GNU GENERAL PUBLIC LICENSE (LGPL) Version 2 (June 1991) =cut