FreeLing
Módulo Lingua::FreeLing3:
$ perldoc FL3
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
—— 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
— $ 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