#!/usr/bin/perl -s our($ns,$d,$best,$n); ## no siglas; debug; best; names-base use strict; use utf8::all; if(@ARGV){ full_name({debug=>$d, ns=>$ns, best => $best}, @ARGV); } else{ while(<>){ chomp; next unless /\w/; if(/(.*):(.*)/){ ### FIXME: rewind missing my ($a1,$a2)=($1,$2); print "---$a1=$a2\n"; full_name({debug=>$d, ns=>$ns, best => $best}, "jj"); } } } sub full_name{ if($n){ open(DATA,"<",$n) or die("cant open $n"); } my %opt =(debug => 0, ns => 0 , best => 0 ); if(ref($_[0]) eq "HASH") {%opt = (%opt , %{shift(@_)}) } ; my @pat= n2regexp(norm(join(" ",@_))); my @r; my $section; my $m=0; my $active = 1; if($opt{debug}){ print "##Debug ($_->[0],$_->[1])\n" for(@pat)} while(){ last if /__END__/; chomp; if(/^#\s*(\S+)/){ $section = $1; next } for my $p (@pat){ if (m/$p->[1]/){push(@r,[$p->[0],$_]); last} } } for (sort {$a->[0] <=> $b->[0]} @r ){ last if ($opt{best} and $m and $m != $_->[0]); print "$_->[0] $_->[1]\n"; $m = $_->[0]; } } sub n2regexp{ ## alg1 -- attach left and right my $n=shift; my @p; my $n1; $n =~ s/^(\w)\. (?=\w)/$1#w#s1/; ## first two words: toghether if possible $n =~ s/^(\w{2,}) (?=\w)/$1#s1/; ## #w : abreviation (A. => A#W $n =~ s/\. /#w /g; $n =~ s/\.$/#w/g; $n =~ s/#w /.*\\b/g; $n =~ s/#w/\\w*\\b/g; $n =~ s/ /\\b.*\\b/g; if($n =~ m/#s1/){ $n1 = $n; $n1 =~ s/#s1/ \\s /g; $n =~ s/#s1/ \\b.*\\b /g; } $n =~ s/\\b\s*\\b/\\b/g; ## final simplification of the RE $n =~ s/\\b\s*$//g; push(@p, ## ($n1 ? [1, qr{^ $n1 $ }xi]:()), ## ^ n1 n2 ... nf $ atach l r [2, qr{^ $n $ }xi], ## ^ n1 ... nf $ atach l r [3, qr{\b $n $ }xi], ## n1 ... nf $ atach r ($n1 ? [4, qr{^ $n1 \b}xi]:()), ## ^ n1 n2 ... atach l [5, qr{^ $n \b}xi], ## ^ n1 ... atach 2 [6, qr{\b $n \b}xi]); ## n1 ... atach none if(length($n) >=4 and $n !~ /[. ]/){ ## obelo => o. belo if($n =~ /(\w)(\w+)/) { push(@p,[10,qr{^ $1.* \b $2 $}xi], [11,qr{\b $1.* \b $2 $}xi], [12,qr{^ $1.* \b $2 \b}xi], [13,qr{\b $1.* \b $2 \b}xi]) } } return @p; } sub norm{ my $n = shift; $n =~ s/(.*?)\s*,\s*(.*)/$2 $1/; ## Almeida, J.J. => J.J. Almeida $n =~ s/\b(\w)\.(\S)/$1. $2/; ## J.J. => J. J. $n =~ s/(\w\w)\.(\w)/$1 $2/; ## Jose.campos => Jose campos if(not $ns){ ## UMinho => U. Minho $n =~ s/([A-Z])(?=[A-Z])/$1. /g; $n =~ s/([A-Z])$/$1./; } if(length($n) < 5 and not $ns){ ## jbb => j. b. b. $n =~ s/(\w)(?=\w)/$1. /g; $n .= "."} $n =~ s/\b(\w) /$1. /g; ## J J Almeida => J. J. Almeida $n =~ s/\b(\w)$/$1./g; ## José A => José A. $n; } __DATA__ #people Albano José Dias Serrano Alberto José Gonçalves Carvalho Proença Alexandre Júlio Teixeira Santos António Carlos Silva Abelha António Joaquim André Esteves António José Borba Ramires Fernandes António Luís Duarte Costa António Luís Pinto Ferreira Sousa António Manuel Nestor Ribeiro António Manuel Silva Pina António Pedro Sarmento Coelho Carneiro Aragão Bruno Alexandre Fernandes Dias Carla Cecília Ferreira Amado Araújo Carlos Miguel Ferraz Baquero Moreno César Analide Freitas Silva Costa Rodrigues Cristina Paula Sousa Martins Ferreira Fernando Mário Junqueira Martins Francisco António Ferraz Martins Almeida Maia Francisco Coelho Soares Moura Jaime Ferreira Gomes João Alexandre Baptista Vieira Saraiva João Luís Ferreira Sobral João Manuel Campos Gonçalves João Miguel Lobo Fernandes Joaquim Melo Henriques Macedo Jorge Gustavo Pereira Bastos Rocha Jorge Miguel Matos Sousa Pinto José Bernardo Santos Monteiro Vieira Barros José Carlos Bacelar Ferreira Junqueira Almeida José Carlos Ferreira Maia Neves José Carlos Leite Ramalho José Francisco Creissac Freitas Campos José João Antunes Guimarães Dias de Almeida José Luís Oliveira Faria José Manuel Esgalhado Valença José Manuel Ferreira Machado José Nuno Fonseca Oliveira José Orlando Roque Nascimento Pereira José Paulo Several Other Names Leal Luís Manuel Dias Coelho Soares Barbosa Luís Paulo Peixoto Santos Manuel Alcino Pereira Cunha Manuel Bernardo Martins Barbosa Maria Conceição Sousa Barbosa Maria Goreti Dantas Pereira Maria Helena Ferreira Dias Maria João Gomes Frade Maria Solange Pires Ferreira Rito Lima Miguel Francisco Almeida Pereira Rocha Nuno Ernesto Salgado Oliveira Nuno Filipe Moreira Macedo Olga Maria Gomes Martins Pacheco Orlando Manuel Oliveira Belo Paulo Jorge Freitas Oliveira Novais Paulo Jorge Sousa Azevedo Paulo Manuel Martins Carvalho Paulo Sérgio Soares Almeida Pedro Manuel Rangel Santos Henriques Pedro Nuno Miranda Sousa Rafael Castro Carreira Rui Carlos Mendes Oliveira Rui Manuel Ribeiro Castro Mendes Vitor Francisco Mendes Freitas Gomes Fonte Vítor Manuel Rodrigues Alves Vasco Luís Freitas Nuno Alexandre Ramos Carvalho Alberto Manuel Brandão Simões Nuno Oliveira Maria João Varanda Pareira # institution Universidade do Minho Universidade do Porto Universidade Nova de Lisboa Universidade clássica de Lisboa Universidade de Trás-os-Montes e Alto Douto Instituto Superior Técnico Faculdade de Engenharia Universidade do Porto Instituto Letras e Ciências Humanas Biblioteca Lúcio Craveiro Universidade de Aveiro Universidade da Beira Interior # journal Lecture Notes in Computer Science Association of Computer Machienery Springer Verlag Theoretical Computer Science Language Resources and Evaluation conference Procesamiento del Lenguaje Natural __END__ =encoding utf8 =head1 NAME names - expand full names =head1 SYNOPSIS names -best jja = J. J. A. UMinho = U. Minho Almeida, J J = J. J. Almeida =head1 DESCRIPTION =head2 EXPORT =head1 AUTHOR J.Joao Almeida, jj@di.uminho.pt =head1 SEE ALSO perl(1). =cut