User Tools

Site Tools


spln2016:diario4

SPLN

Diário de Bordo - Aula 4 - 2016-03-07

Sumário

* Revisão do estado dos TPC * Analisador Morfológico

  • Uso básico de Jspell
  • Criação de scripts perl com recurso ao Jspell

Palavra:

  • Categoria = {verbo,subjetivo,adjetivo…}
  • Substantivo → género, número…
  • Verbo → tempo…
  • Adjetivo → grau, género…

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], [], [], [])

Scripting

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  
spln2016/diario4.txt · Last modified: 2016/03/09 17:51 by ambs