Revisões da ultima aula:
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'
}
];
#!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.
* Instalar freeling 3.1
* Instalar Lingua::FreeLing3
* instalar VISL.CG3/CG3