#!/usr/bin/perl - w #script to extract occurrences of definitions in a File #output: definition candidates sorted by patterns #usage: perl SentEx_patternsF.pl Korpus Patternlist use utf8; binmode STDIN, 'utf8'; binmode STDOUT, 'utf8'; $file = shift(@ARGV); $pat = shift(@ARGV); if ($file=~/\//){ ($filestem) = $file=~ /.*\/(.+)\..../; } else { ($filestem) = $file=~ /(.+)\..../; } print STDERR "F:$filestem\n"; print STDERR "\n\nDo you want to evaluate against recall test set? If yes enter recall test set file else press return!\n"; # $recalltestset=<>; $recalltestset=""; &recalltestset; open(PAT, "<:utf8", "$pat") || die "Cannot open file:$!"; open(OUT, ">:utf8", "ALLPATTERNEVALUATION_$filestem"."\.txt") || die "Cannot open outfile:$!"; push @predefinedpatterns, "0"; #zato da se potem zacne z 1 ne 0 while (){ chomp; if (length>0){ if (m/^\#/){} else { print STDERR "[$_]\n\n"; s/{{{(.*)}}}/$1/; push @predefinedpatterns, "$1"; } } } $k=$#predefinedpatterns; for ($i=1;$i<=$k; $i++){ $count=0; $yes=0; $no=0; $undef=0; $allpozit=0; $allneg=0; $stop=0; $eval=0; @comments=(); print STDERR "PATLIST$i:". $predefinedpatterns[$i]."\n"; #open(OUT1, ">:utf8", "PAT_lema".$i."_$filestem."."xml") || die "Cannot open outfile1:$!"; open(OUT2, ">:utf8", "PAT_".$i."_$filestem."."txt") || die "Cannot open outfile2:$!"; open(FILE, "<:utf8", "$file") || die "Cannot open file:$!"; @positivesbyeachpattern=(); $/ = "\/>\n";#"\n\n";#""; while () { $s = $_; if ($s=~/defvalue=\"Y/){ $allpozit++; } if ($s=~/defvalue=\"N/){ $allneg++; } if ($s =~/.*?().*?\n/){ ($ids)= $s =~/.*?().*?\n/g; } $s =~s/.*?.*?\n//gs; ($sentmeta)= $s =~ /(>>>".$i.":\t"."{{{$predefinedpatterns[$i]}}}"."\n"; $stop=1; } #print OUT1 "$s"."\n"; print OUT2 "$string###$sentmeta"."\n"; $sentmeta=~/S sid_sp=\"(\d+)\"/; $idnb=$1; $union{$idnb}="$string###$sentmeta"."\n"; #print OUT2 "MSD string: $msd_string"."\n"; if ($sentmeta=~/defvalue=\"Y/){ $yes++; $unionYES{$idnb}++; push @positivesbyeachpattern, $idnb; } elsif ($sentmeta=~/defvalue=\"N/){ $no++; $unionNO{$idnb}++; } else { $undef++; $unionUNDEF{$idnb}++; } $count++; } } $eval=$count-$undef; if ($count==0) { $count=0.000001; push @comments, "\$undefWas0"; } if ($allpozit==0) { $allpozit=0.000001; push @comments, "\$allpozitWas0"; } if ($eval==0) { ###print OUT "EVAL IS ".$eval." and changed to=0.00001 \n"; $eval=0.00001; ###print OUT "nEWEVAL IS ".$eval.":::\n"; push @comments, "\$evalWas0"; } print OUT "PATTERN$i:\t{{{$predefinedpatterns[$i]}}}\n"; print OUT "TOTAL EXAMPLES: ".$count."\n"; print OUT "TOTAL EVALUATED: ".$eval."\n"; print OUT "POZITIVES:". $yes."\n"; print OUT "NEGATIVES:". $no."\n"; print OUT "UNDEFINED:". $undef."\n"; print OUT "ALLPOZ:".$allpozit."\n"; print OUT "ALLNEG:".$allneg."\n"; print OUT "PRECISION_eval:". $yes/$eval."\n"; #print OUT "PRECISION_noneval:". $yes/$count."\n"; #print OUT "RECALL:".$yes/$allpozit."\n"; #print OUT "POZ//UNDEF:\t"."$yes//".$undef."\n"; #print OUT "PREC//RECALL:".$yes/$eval."//".$yes/$allpozit; #print OUT "POZITIVESBYPATTER>$i: "."@positivesbyeachpattern"; #presek @recalltestsetids in @positivesbyeachpattern foreach $element (@positivesbyeachpattern, @recalltestsetids) { $count{$element}++ } foreach $element (keys %count) { push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element; } print OUT "INTERSECTION:"."number elements:[".@intersection."]:"."@intersection"."\n"; &computerecall; print OUT "RECALL ON RECALL TEST SET:".@intersection."/". @recalltestsetids."=$divided\n"; print OUT "(recall test set is:$recalltestset)\n"; #print OUT "Ints reason : "."PozByPatt:"."@positivesbyeachpattern"."recallset"." @recalltestsetids"."\n"; #$ints=@intersection."\n"; #print STDERR "\n\nRECALL: $ints"."\\"."$number_recall"."\n"; #print OUT "WorstPrec (if all non eval were ng:".$yes/$count; print OUT "\n\n======\n\n"; #print OUT "COMMENTS:"."@commetns"; %count=(); @intersection=(); } open (OUTUNION, ">:utf8", "outunion.txt"); foreach $key (sort sortAsc keys %union){ print OUTUNION "$union{$key}"; } @unionpositivesbyeachpattern= keys %unionYES; foreach $element (@unionpositivesbyeachpattern, @recalltestsetids) { $count4union{$element}++ } foreach $element (keys %count4union) { push @{ $count4union{$element} > 1 ? \@intersection4union : \@difference4union }, $element; } &computerecall; print OUT "\n\n\nALL PATTERNS, i.e. UNION\n"; print OUT "TOTAL EXAMPLES in UNION: "; print OUT scalar keys %union; $scalarall= scalar keys %union; print OUT "\n"; print OUT "POZITIVES:"; print OUT scalar keys %unionYES; $scalaryes= scalar keys %unionYES; print OUT "\n"; print OUT "NEGATIVES:"; print OUT scalar keys %unionNO; print OUT "\n"; print OUT "UNDEFINED:"; print OUT scalar keys %unionUNDEF; $scalarundefined= scalar keys %unionUNDEF; print OUT "\n"; $scalardefined=$scalarall-$scalarundefined; # print OUT "PRECISION_eval:". $scalaryes/ $scalardefined."\n"; print OUT "INTERSECTION:"."number elements4union:[".@intersection4union."]:"."@intersection4union"."\n"; if ($chosenrecall>0){ $iu=@intersection4union; $rt=@recalltestsetids; $dividedunion=$iu/$rt; print OUT "RECALL ON RECALL TEST SET:".@intersection4union."/". @recalltestsetids."=$dividedunion\n"; print OUT "(recall test set is:$recalltestset)\n"; } sub sortAsc { $a<=>$b; } sub recalltestset { print STDERR "you entered:[".$recalltestset."]\n"; # chomp $recalltestset; $recalltestset=~s/\n*\r*$//g; print STDERR "CHOMPED:: [".$recalltestset."]\n"; if ($recalltestset=~/.../){ $chosenrecall=1; open(RCSET, "<:utf8", "$recalltestset") || die "Cannot open RCSET file:$!"; while (){ if (m/S sid_sp=\"(\d+)\"/){ push @recalltestsetids, $1; } } } else {print STDERR "\nok no test set for recall!\n";} } sub computerecall { if ($chosenrecall>0){ $is=@intersection; $rs=@recalltestsetids; $divided=$is/$rs; } } print STDERR "total number of recall testset: ".@recalltestsetids."\n";