* Revisão do estado dos TPC * Analisador Morfológico
Palavra:
Análise Morfológica: palavra → análise*
análise -> lema
categoria
Jspell * Instalação do módulo:
cpan Lingua::Jspell
* Instalar dicionário português:
jspell-installdic pt
* Entrar no modo de fazer queries ao dicionário português (A flag `-d` serve para indicar o dicionário a ser utilizado):
ujspell -d pt
* Exemplos de utilização:
a
>> *
para
>> * para 0 :lex(para, [CAT=prep], [], [], []), lex(parar, [CAT=v,T=inf,TR=_], [], [P=3,N=s,T=p], []), lex(parar, [CAT=v,T=inf,TR=_], [], [P=2,N=s,T=i], []), lex(parir, [CAT=v,T=inf,TR=_], [], [P=1,N=s,T=pc], []), lex(parir, [CAT=v,T=inf,TR=_], [], [P=3,N=s,T=pc], []), lex(parir, [CAT=v,T=inf,TR=_], [], [P=3,N=s,T=i], [])
gere
>> * gere 0 :lex(gerar, [CAT=v,T=inf,TR=t], [], [P=1_3,N=s,T=pc], []), lex(gerar, [CAT=v,T=inf,TR=t], [], [P=3,N=s,T=i], []), lex(gerir, [CAT=v,T=inf,TR=_], [], [P=3,N=s,T=p], []), lex(gerir, [CAT=v,T=inf,TR=_], [], [P=2,N=s,T=i], [])
quatro
>> * quatro 0 :lex(quatro, [CAT=card,N=p], [], [], [])
Começamos por criar um exemplo básico do uso da biblioteca Jspell dentro do perl.
$ cat jspell.pl
#!/usr/bin/env perl
use warnings;
use strict;
use Lingua::Jspell;
use Data::Dumper;
my $dic = Lingua::Jspell -> new("pt");
my @analysis = $dic -> fea("era");
use Data::Dumper;
print Dumper(\@analysis);
Resultdo:
$ perl jspell.pl
$VAR1 = [
{
'rad' => 'era',
'G' => 'f',
'CAT' => 'nc',
'N' => 's'
},
{
'P' => '1',
'TR' => '_',
'rad' => 'ser',
'T' => 'pi',
'N' => 's',
'CAT' => 'v'
},
{
'CAT' => 'v',
'N' => 's',
'TR' => '_',
'rad' => 'ser',
'P' => '3',
'T' => 'pi'
}
];
Agora que já conseguimos dar uso à biblioteca, vamos agora usá-la para descobrir os radicais das palavras no dicionário português e contar a frequência de cada radical.
$ cat jspell2.pl
Contagem de lemas…
#!/usr/bin/env perl
use warnings;
use strict;
use Lingua::Jspell;
use Data::Dumper;
use Memoize;
memoize('radicais');
my $dic = Lingua::Jspell -> new("pt");
my (%oco, $c);
while (<>) {
next if /^</;
while ( /\w+(-\w+)*/g ) {
my $word = $&;
my @rad = radicais($word);
for my $rad (@rad) {
$oco{$rad}++;
}
}
}
for my $rad (sort { $oco{$b} <=> $oco{$a}} keys %oco){
print "$rad\t$oco{$rad}\n"
}
sub radicais {
my $word = shift;
return $dic -> rad($word);
}
Resultado:
$ perl jspell.pl | head o 121406 de 45603 do 44633 a 39908 que 24364 e 22731 um 17779 no 17707 ser 12245 em 11686