Processing math: 0%

User Tools

Site Tools


spln2016:diario8

SPLN

Diário de Bordo - Aula 8 - 2016-04-18

FreeLing

  • suporta várias línguas
  • suporta modo servidor (perguntas feitas por um cliente)
  • freeling capacidade de ser usado em java usando swig (Simplified Wrapper and Interface Generator)

Módulo Lingua::FreeLing3:

  • Lingua::FreeLing3::Bindings - Bindings da Biblioteca FreeLing
  • Lingua::FreeLing3::… interfaces desenvolvidas para tornar bindings mais 'perl-like'
  • FL3 → Módulo shortcut de Lingua::FreeLing3.
  • Para listar documentação: $ perldoc FL3
  • Pode ser usado tokenizador default ou não
  • Métodos retornam sempre objetos com método utilizado
  • Ideia da pipeline de freeling → pegar num texto e dividir em tokens
  • divide em àtomos usando o tokenizer (retorna lista de tokens)
  • splitter - segmentador, pega em àtomos e retorna frases, que é referência para array de frases que referencia para array de tokens
  • freeling morph guarda os vários resultados morfológicos possiveis de um token
  • depois de analisar - etiquetação de (POS (part of speech) tagging) palavras
  • hmm - hidden markov model (método estátística que calcula elementos mais prováveis)
  • relax - etiquetação de POS
  • bibliotecas deste género podem ter métodos que fazem o treino de texto para cálculo de probabilidades para desambíguo de resultados
  • contém conjunto de eurísticas com probabilidades
  • chart→parse - criar arvore de parsing
  • parse de dependências do ponto de vista semântico
  • txala - dependency parser

texto.txt — Exemplo usado inicialmente —-

O gato comeu o rato. O rato tinha sido envenenado. O gato morreu.


/ → 'input record separator' ——- perl script1.pl ——–

$ perl script1.pl #!/usr/bin/perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

print $texto;

—- output —–

O gato comeu o rato. O rato tinha sido envenenado. O gato morreu.

—– $ perl script2.pl —–

#!/usr/bin/perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt';

my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

my tokens = tokenizer->tokenize(texto); #print Dumper($tokens);

foreach my token (@tokens){ print $token→form() . “\n”; }

—- output —— #tokenização feita

O gato comeu o rato . O rato tinha sido envenenado . O gato morreu .

$ perldoc Lingua::FreeLing3::Sentence

*contrutor de frases *frase→totext() devolve string da frase

$ perldoc Lingua::FreeLing3::Word analysis → retorna lista de possíveis análises FeatureStructure retorna hash

—- $ perl script3.pl ——

#!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto2.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#print Dumper($frases); devolve array com elementos 'Lingua::FreeLing3::Sentence'

#analise morfologica frases = morph->analyze(frases);

frases= relax->tag(frases);

for my f (@frases){

my @words = $f->words();
for my $w (@words){  
	my $anal = $w->analysis(FeatureStructure => 1);
	print $w->form,"\n";
	print Dumper($anal);
}

}


retorna analise morfologica de cada palavra tag→ sintatico lemma→ palavra prob→probabilidade Eagles Guidelines →formato para representar estrutura morfo das frases —- output —–

O $VAR1 = [

        {
          'lemma' => 'o',
          'prob' => '0.946533636767318',
          'tag' => 'DA0MS0'
        },
        {
          'lemma' => 'o',
          'tag' => 'PD0MS000',
          'prob' => '0.0337339031971581'
        },
        {
          'lemma' => 'o',
          'tag' => 'PP3MSA00',
          'prob' => '0.0197185834813499'
        },
        {
          'prob' => '1.38765541740675e-05',
          'tag' => 'NCMS000',
          'lemma' => 'o'
        }
      ];

aviso $VAR1 = [

        {
          'tag' => 'NCMS000',
          'prob' => '0.976190476190476',
          'lemma' => 'aviso'
        },
        {
          'lemma' => 'avisar',
          'prob' => '0.0238095238095238',
          'tag' => 'VMIP1S0'
        }
      ];

era $VAR1 = [

        {
          'lemma' => 'ser',
          'prob' => '0.332163369495852',
          'tag' => 'VMII1S0'
        },
        {
          'prob' => '0.332163369495852',
          'tag' => 'VMII2S0',
          'lemma' => 'ser'
        },
        {
          'prob' => '0.332163369495852',
          'tag' => 'VMII3S0',
          'lemma' => 'ser'
        },
        {
          'lemma' => 'era',
          'tag' => 'NCFS000',
          'prob' => '0.00350989151244416'
        }
      ];

curto $VAR1 = [

        {
          'prob' => '0.98780487804878',
          'tag' => 'AQ0MS0',
          'lemma' => 'curto'
        },
        {
          'lemma' => 'curtir',
          'prob' => '0.0121951219512195',
          'tag' => 'VMIP1S0'
        }
      ];

. $VAR1 = [

        {
          'tag' => 'Fp',
          'prob' => '1',
          'lemma' => '.'
        }
      ];

–texto2.txt(última Frase) O gato comeu o rato. O rato tinha sido envenenado. O gato morreu. A era era muito bonita. Eu aviso a turma. O aviso era curto.


Nota: Testar novo texto com script anterior

Métodos de etiquetacao POS (Hidden Markov Model) do FreeLing *retornam análise morfologica de cada palavra

  • retornam apenas um resultado (baseado em probabilidades)
  • falham nalguns casos mas acertam noutros
  • treinado com floresta sintática?
  • demora segundos a carregar, ms a processar (devido a isto, usar um servidor é proveitoso)
  • Análise morfológica pode levar a conclusões erradas

—— Output —–

$ perl script4.pl

#!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#analise morfologica frases = morph->analyze(frases);

#etiquetacao POS (Hidden Markov Model)

frases = relax->tag(frases);

for my $f (@$frases){
	my @words = $f->words();
	for my $w (@words){  
		my $h = $w->as_hash();
		print Dumper($h);
	}
}

—- output —— texto.txt $VAR1 = {

        'form' => 'O',
        'tag' => 'DA0MS0',
        'lc_form' => 'o',
        'lemma' => 'o'
      };

$VAR1 = {

        'form' => 'gato',
        'tag' => 'NCMS000',
        'lc_form' => 'gato',
        'lemma' => 'gato'
      };

$VAR1 = {

        'lemma' => 'comer',
        'lc_form' => 'comeu',
        'tag' => 'VMIS3S0',
        'form' => 'comeu'
      };

$VAR1 = {

        'lemma' => 'o',
        'lc_form' => 'o',
        'form' => 'o',
        'tag' => 'DA0MS0'
      };

$VAR1 = {

        'lc_form' => 'rato',
        'tag' => 'NCMS000',
        'form' => 'rato',
        'lemma' => 'rato'
      };

$VAR1 = {

        'lemma' => '.',
        'form' => '.',
        'tag' => 'Fp',
        'lc_form' => '.'
      };

$VAR1 = {

        'lemma' => 'o',
        'form' => 'O',
        'tag' => 'DA0MS0',
        'lc_form' => 'o'
      };

$VAR1 = {

        'lc_form' => 'rato',
        'tag' => 'NCMS000',
        'form' => 'rato',
        'lemma' => 'rato'
      };

$VAR1 = {

        'lemma' => 'ter',
        'lc_form' => 'tinha',
        'tag' => 'VMII1S0',
        'form' => 'tinha'
      };

$VAR1 = {

        'lemma' => 'ser',
        'lc_form' => 'sido',
        'form' => 'sido',
        'tag' => 'VMP00SM'
      };

$VAR1 = {

        'form' => 'envenenado',
        'tag' => 'VMP00SM',
        'lc_form' => 'envenenado',
        'lemma' => 'envenenar'
      };

$VAR1 = {

        'lemma' => '.',
        'form' => '.',
        'tag' => 'Fp',
        'lc_form' => '.'
      };

$VAR1 = {

        'lemma' => 'o',
        'lc_form' => 'o',
        'tag' => 'DA0MS0',
        'form' => 'O'
      };

$VAR1 = {

        'tag' => 'NCMS000',
        'form' => 'gato',
        'lc_form' => 'gato',
        'lemma' => 'gato'
      };

$VAR1 = {

        'form' => 'morreu',
        'tag' => 'VMIS3S0',
        'lc_form' => 'morreu',
        'lemma' => 'morrer'
      };

$VAR1 = {

        'lemma' => '.',
        'form' => '.',
        'tag' => 'Fp',
        'lc_form' => '.'
      };

—– $ perl script5.pl ——

#!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#analise morfologica frases = morph->analyze(frases);

#etiquetacao POS (HIdden Markov Models)

frases = relax->tag(frases);

for my $f (@$frases){
	my @words = $f->words();
	for my $w (@words){
		my $h = $w->as_hash();
		print join("\t", map {$h->{$_} } (qw.form lemma tag.)). "\n"; #map - definir elementos que queremos - meter em lista, separar por tab
	}
}

—- output —– # resultados identado

O o DA0MS0 gato gato NCMS000 comeu comer VMIS3S0 o o DA0MS0 rato rato NCMS000 . . Fp O o DA0MS0 rato rato NCMS000 tinha ter VMII1S0 sido ser VMP00SM envenenado envenenar VMP00SM . . Fp O o DA0MS0 gato gato NCMS000 morreu morrer VMIS3S0 . . Fp

$ perldoc Lingua::FreeLing3::DepTree

  • $ptree→info = info do nodo
  • numchildren - número de filhos
  • nth_child - retorna filho que queremos
  • dump - retorna formato textual identado (para debug)

— $ perl script6.pl —–

#!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

}

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#analise morfologica frases = morph->analyze(frases);

#chart parser frases = chart->parse(frases);

for my f (@frases){

print "### ", $f->to_text,"\n";
if($f->is_parsed){
	my $parseTree = $f->parse_tree; # àrvore sintatica textual
	print $parseTree->dump();
}

}

—- output —– # àrvore sintatica textual

### O gato comeu o rato . S

grup-verb
  patons
    paton-ms
      DA0MS0 (O)
  grup-verb
    verb
      NCMS000 (gato)
grup-verb
  verb
    VMIS3S0 (comeu)
  DA0MS0 (o)
grup-verb
  verb
    NCMS000 (rato)
F-term
  Fp (.)

### O rato tinha sido envenenado . S

sn
  espec-ms
    j-ms
      DA0MS0 (O)
  grup-nom-ms
    n-ms
      NCMS000 (rato)
    n-fs
      VMII1S0 (tinha)
s-adj
  s-a-ms
    parti-ms
      VMP00SM (sido)
s-adj
  s-a-ms
    parti-ms
      VMP00SM (envenenado)
F-term
  Fp (.)

### O gato morreu . S

grup-verb
  patons
    paton-ms
      DA0MS0 (O)
  grup-verb
    verb
      NCMS000 (gato)
grup-verb
  verb
    VMIS3S0 (morreu)
F-term
  Fp (.)

—-texto4.txt

O Presidente da República visitou a Guiné Equatorial. O Primeiro Ministro, por sua vez, ficou-se Vila Real de Santo António. Como estava a chover, usou um guarda chuva para que se não molhasse.

—– $ perl script7.pl —–

#!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto4.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

} binmode STDOUT, “:utf8”;

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#analise morfologica frases = morph->analyze(frases);

frases = relax->tag(frases);

for my $f (@$frases){
	my @words = $f->words();
	for my $w (@words){   
		my $h = $w->as_hash();
		print join("\t", map {$h->{$_} } (qw.form lemma tag.)). "\n";#map - definir elementos que queremos - meter em lista, separar por tab
	
	}
}

—– output ——- #nao apanha guarda chuva como entidade # texto4.txt

O o DA0MS0 Presidente_da_República presidente_da_república NP00000 visitou visitar VMIS3S0 a o DA0FS0 Guiné_Equatorial guiné_equatorial NP00000 . . Fp O o DA0MS0 Primeiro_Ministro primeiro_ministro NP00000 , , Fc por por SPS00 sua sua PX3FS0P0 vez vez NCFS000 , , Fc ficou ficar VMIS3S0 se se PP3CN000 Vila_Real_de_Santo_António vila_real_de_santo_antónio NP00000 . . Fp Como como CS estava estar VMII3S0 a a SPS00 chover chover VMN0000 , , Fc usou usar VMIS3S0 um um DI0MS0 guarda guarda NCCS000 chuva chuva NCFS000 para para SPS00 que que PR0CN000 se se PP3CN000 não não RN molhasse molhar VMSI3S0 . . Fp

–texto5.txt

O Presidente da República visitou a Guiné Equatorial. O Primeiro Ministro, por sua vez, ficou-se Vila Real de Santo António. Como estava a chover, usou um guarda chuva para que se não molhasse. O macaco de cauda curta estava todo molhado.

*nao apanha macaco de cauda curta como entidade —– output ——-

O o DA0MS0 Presidente_da_República presidente_da_república NP00000 visitou visitar VMIS3S0 a o DA0FS0 Guiné_Equatorial guiné_equatorial NP00000 . . Fp O o DA0MS0 Primeiro_Ministro primeiro_ministro NP00000 , , Fc por por SPS00 sua sua PX3FS0P0 vez vez NCFS000 , , Fc ficou ficar VMIS3S0 se se PP3CN000 Vila_Real_de_Santo_António vila_real_de_santo_antónio NP00000 . . Fp Como como CS estava estar VMII3S0 a a SPS00 chover chover VMN0000 , , Fc usou usar VMIS3S0 um um DI0MS0 guarda guarda NCCS000 chuva chuva NCFS000 para para SPS00 que que PR0CN000 se se PP3CN000 não não RN molhasse molhar VMSI3S0 . . Fp O o DA0MS0 macaco macaco NCMS000 de de SPS00 cauda cauda NCFS000 curta curto AQ0FS0 estava estar VMII3S0 todo todo DI0MS0 molhado molhar VMP00SM . . Fp

——- $ perl script8.pl —— #!/usr/bin/env perl

use warnings; # Semantic erros are caught by the compiler use strict;

use Data::Dumper; use FL3 'pt'; #use FL3 'en'; -mudar para ingles

my $texto; { #scope para conter código local

 #TOKENIZE funciona sobre string
open my $fh, "<:utf8" ,  "texto4.txt" or die "Can't open file!\n";        
# <:encoding que queremos usar  latin1 seria "<:encoding(iso-8859-1)"
# perl dá erro se houver algo que fuja ao utf8
local $/=undef; #split em \n
			#n é aconselhavel pq $/ é variavel global
			# podemos definir $/ como local
$texto = <$fh>; 
close $fh;

} binmode STDOUT, “:utf8”;

my tokens = tokenizer->tokenize(texto); #segmentação my frases = splitter->split(tokens);

#analise morfologica frases = morph->analyze(frases);

frases = relax->tag(frases); frases = nec->analyze(frases); #nec→ ML-based NE classificator.

for my $f (@$frases){
	my @words = $f->words();
	for my $w (@words){  #mais que uma análise à mesma palavra
		my $h = $w->as_hash();
		print join("\t", map{ $h->{$_}} (qw.form lemma tag.))."\n"; #map - definir elementos que queremos - meter em lista, separar por tab
	
	}
}

——- output ——— #texto4

O o DA0MS0 Presidente_da_República presidente_da_república NP00SP0 visitou visitar VMIS3S0 a o DA0FS0 Guiné_Equatorial guiné_equatorial NP00O00 . . Fp O o DA0MS0 Primeiro_Ministro primeiro_ministro NP00SP0 , , Fc por por SPS00 sua sua PX3FS0P0 vez vez NCFS000 , , Fc ficou ficar VMIS3S0 se se PP3CN000 Vila_Real_de_Santo_António vila_real_de_santo_antónio NP00G00 . . Fp Como como CS estava estar VMII3S0 a a SPS00 chover chover VMN0000 , , Fc usou usar VMIS3S0 um um DI0MS0 guarda guarda NCCS000 chuva chuva NCFS000 para para SPS00 que que PR0CN000 se se PP3CN000 não não RN molhasse molhar VMSI3S0 . . Fp

——–texto6.txt——– New York is holding presidential primaries seen as key for both Republican and Democratic front-runners after their recent defeats.

Democratic hopeful Hillary Clinton, a former senator for New York, is expected to win against Brooklyn-born Vermont Senator Bernie Sanders.

*Em inglês —— output ——–

New new JJ York york NP00G00 is be VBZ holding hold VBG presidential presidential JJ primaries primary NNS seen see VBN as as IN key key JJ for for IN both both DT Republican republican NP00V00 and and CC Democratic democratic NP00V00 front-runners front-runners NNS after after IN their their PRP$ recent recent JJ defeats defeat NNS . . Fp Democratic democratic JJ hopeful hopeful JJ Hillary_Clinton hillary_clinton NP00SP0 , , Fc a 1 Z former former JJ senator senator NN for for IN New_York new_york NP00G00 , , Fc is be VBZ expected expect VBN to to TO win win VB against against IN Brooklyn-born_Vermont_Senator_Bernie_Sanders brooklyn-born_vermont_senator_bernie_sanders NP00O00 . . Fp

spln2016/diario8.txt · Last modified: 2016/05/05 00:28 by ambs