#!/usr/bin/perl use Data::Dumper; use jspell; use DB_File; my $corpus = shift; my $datafile = shift; require($datafile); $data = $VAR1; jspell_dict("port"); tie %oco, "DB_File", "theDataBase", O_CREAT|O_RDWR, 0666, $DB_HASH ; $| = 1; # Processar cada lema foreach $lema (sort keys %$data) { # Próximo se isto não é uma palavra comum next unless $lema=~/^[A-Za-z-]+$/; print ">$lema< "; # Para cada uma das palavras que pode derivar desse lema foreach $word_data (@{$data->{$lema}}) { # Aceder aos dados da dita palavra; $oco = $word_data->[0]; $word = $word_data->[1]; # Mais uma vez, verificar se é uma palavra comum next unless $word=~/^[A-Za-z-]+$/; # Verificar se temos mais do que uma possível raíz if ($word_data->[2]) { # Obter extratos (classificacoes) @extratos = `./get_samples.pl $corpus $word`; # Pegar em todos os lemas @possible_roots = @{$word_data->[2]}; # para cada um destes lemas for $root (@possible_roots) { # obter o radical...? @tmp = grep {$_->{rad} eq $root} fea($root); # obter a categoria $cat = $tmp[0]->{CAT}; # Converter a categoria para um pequeno identificador $ccat = jspell::cat2small(%{$tmp[0]}); # Para cada um das categorias extraidas... my %zbr = (); for (@extratos) { chomp; # Soma ocorrencia à raíz $zbr{$root}++ if (compara($ccat,$_)); } $oco{$lema} += $oco*($zbr{$root}/10); } } else { $oco{$lema}+=$oco; } } } untie(%oco); sub compara { my ($a,$b) = @_; return 1 if ($a eq $b); return 1 if ($a =~ /^[JX]MS/ && $b=~ /^[JX]MS/); return 1 if ($a =~ /^N[PC]/ && $b=~ /^N[PC]/); return 0; }