* 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