spln2016:diario5
SPLN
Diário de Bordo - Aula 5 - 2016-03-14
Sumário
- Exercícios com Análise Morfológica
Notas
- Link para submissão de TPCs: http://natura.di.uminho.pt/jjbin/spln-exe
Deteção Tempos Compostos
Revisões da ultima aula:
- Lingua::Jspell
- tempos compostos: ex: tenho passado
- → 'tenho': rad = ter
- → 'passado': cat = v, tempo = participio passado
Exercício: nlgrep
Permitir usar expressões com informação morfológica:
nlgrep rad=ter CAT=v,T=ppa
Implementação
#!usr/bin/perl use warnings; use strict; use utf8::all; use Data::Dumper; use Lingua::Jspell; use Memoize; use Data::Dumper; #cada padrão será um par chave:valor my (@patterns); my $dic = Lingua::Jspell->new("pt"); if(!@ARGV){ die "No arguments provided\n"; # sem o '\n' diz em que linha é que o die ocorre } @patterns = map{argparse($_)} @ARGV; print Dumper(\@patterns); #para 'debug' @ARGV = (); while (<>) { # @l = $dic->fea($word,{...att. value pair restriction}) while (/\w+(-\w+)*|[.,;:!?]/g) { my $w = $&; #calcular as features if($dic->fea($w, $patterns[0])){ print "$. $_"; #numero da linha } } } sub argparse { my ($a) = @_; my %f = split(/[:,]/, $a); # construção de lista com pares chave:valor return \%f; #retorna um apontador para %f }
Exemplo:
perl ex1.pl rad:ter cat:v,t:pp
Resultado
$VAR1 = [ { 'rad' => 'ter' }, { 'cat' => 'v', 't' => 'pp' } ];
Implementação Completa (nlgrep)
#!usr/bin/perl use warnings; use strict; use utf8::all; use Data::Dumper; use Lingua::Jspell; use Memoize; use Data::Dumper; #cada padrão será um par chave:valor my (@patterns); my $dic = Lingua::Jspell->new("pt"); if(!@ARGV){ die "No arguments provided\n"; # sem o '\n' diz em que linha é que o die ocorre } @patterns = map{argparse($_)} @ARGV; my $len = @patterns; #comprimento da lista @patterns print Dumper(\@patterns); #para 'debug' @ARGV = (); while (<>) { my @window = map{""} @patterns; # my @window = ("") x @len; # ("") -> lista vazia vezes o tamanho de patterns while (/\w+(-\w+)*|[.,;:!?]/g) { my $w = $&; push @window, $w; shift @window; # tirar um elemento my $line = $.; if(multi_word_match(\@window)) { print "($line @window) $_\n"; } } } sub argparse { my ($a) = @_; my %f = split(/[:,]/, $a); # construção de lista com pares chave:valor return \%f; #retorna um apontador para %f } sub multi_word_match { my ($window) = @_; for my $i (0..$len-1) { if(!$dic->fea($window->[$i], $patterns[$i])) { return 0; } } return 1; }
Com o input
eu tenho fome 5 eu tenho fome eu tinha um gato 11 eu tinha um gato eu tenho passado bem
e executando
perl ex1.pl rad:ter CAT:v,T:ppa < file.txt
obtem-se
$VAR1 = [ { 'rad' => 'ter' }, { 'CAT' => 'v', 'T' => 'ppa' } ];
(5 tenho passado) Eu tenho passado bem.
TPC Páscoa
* Instalar freeling 3.1
- Mac: brew install freeling
- Linux: ver pacotes em http://nlp.lsi.upc.edu/freeling/ ou source
- Windows: ver pacotes em http://nlp.lsi.upc.edu/freeling/
* Instalar Lingua::FreeLing3
- Com cpan
* instalar VISL.CG3/CG3
- mac: brew vislcg3
- Linux: procurar pacotes
spln2016/diario5.txt · Last modified: 2016/03/19 15:30 by ambs