Testuak elementu-sekuentzia gisa har daitezke: karaktereak, hitzak, esaldiak, etab. Elementu-sekuentzia horien azterketa ohiko prozedura da hizkuntzaren tratamendu automatikoan, eta horretarako erabiltzen dira Ngrama-ereduak. Ariketa honetan, bigramak kalkulatuko ditugu, modulurik erabili gabe, guk geuk garatuko dugu osorik karaktere-bikoteen bigrama-eredua itzultzen duen programa (“bigrama” hitzaren bigrama-eredua bi-ig-gr-ra-am-ma da).
Gure programak, komando-lerrotik fitxategi-izena jasoko du sarrera gisa, eta irteeran fitxategi horetan karaktere-bikote bakoitza zenbatetan azaltzen den bistaratuko. Bigrama-maiztasunak bi modutara bistaratuko ditu, lehenbizi testuan agertu diren ordenari jarraituz, eta, ondoren, maiztasunaren arabera ordenatuta.
Hona programaren erabileraren adibidea. Irteera-fitxategi batera birbideratu dugu pantailan osorik ikusteko handiegia zelako:
>perl bigramaMaiz.pl esaeraZaharrak.txt > irteeraBigrama.txt
Fitxategiaren edukia bistaratuz gero:
irteeraBigrama.txt
sp bikotea 2 aldiz agertu da
ne bikotea 161 aldiz agertu da
eb bikotea 11 aldiz agertu da
…
ij bikotea 4 aldiz agertu da
kk bikotea 2 aldiz agertu da
———————————
Maiztasunaren arabera ordenatuta:
———————————
an bikotea 314 aldiz agertu da
ar bikotea 307 aldiz agertu da
en bikotea 278 aldiz agertu da
ak bikotea 272 aldiz agertu da
…
zm bikotea 1 aldiz agertu da
th bikotea 1 aldiz agertu da
>
Hona programaren funtsa: karaktere-bikoteen bigrama-eredua eraiki eta beren agerpen kopurua gordetzeko, hash egitura erabiliko dugu. Bigramak eraikitzeko, sarrerako testua karakterez karaktere zeharkatuko dugu, pauso bakoitzean uneko karakterea t eta bere aurrekoa kateatu eta bigrama osatuz. Adibidez: $kar erabil
dezakegu uneko karakterea gordetzeko, eta $aurrekokar aldagaia bere aurrekoa gordetzeko. Bigrama, biak kateatuz osatuko da: $aurrekokar . $kar
Bigrama eratu berria hash-aren gakoa izango da, eta balioa, berriz, bere agerpen kopurua. Bigrama bakoitzeko, honela eguneratuko dugu balioa:
$frek{$aurrekokar . $kar}++;
Non %frek bigrama-eredua gordetzen duen hash egituraren izena den.
Hona programa bera:
bigramaMaiz.pl
#!/usr/bin/perl
use strict;
use warnings;
my ($lerro, $kar, $aurrekokar, $fIzena, %frek,
$gako, $balio);
$fIzena = $ARGV[0];
open(FITX, $fIzena) ||
die (“Ezin $fIzena fitxategia zabaldun”);
while ($lerro = <FITX>) {
chomp($lerro);
# Letra larriak xehe bihurtu
$lerro =~ tr/A-Z/a-z/;
$kar = ” “;
$aurrekokar = ” “;
while ($lerro =~ /(w)/gi) {
# g globala
# i maiuskula/minuskula ez bereizi
$aurrekokar = $kar;
$kar = $1; # parekatu-berria den karakterea
# Karaktere-bikotearen lehen agerpena bada
# hasieratu, bestela 1 gehitu aurreko balioari
$frek{$aurrekokar . $kar}++;
}
}
close(FITX); # Fitxategia itxi
# Bistaratu testuko ordena jarraituz
while (($gako, $balio) = each(%frek)) {
print “$gako bikotea $balio aldiz agertu dan”;
}
print “——n”;
# Bistaratu agerpen kopuruaren arabera ordenatuta,
# handienetik txikienera.
# Lehenbizi hasharen gakoak ardenatu balioen arabera.
# Zenbakizko ordenazioa, handienetik txikienera
my @gakoOrdenaduak =
sort ({$frek{$b} <=> $frek{$a}} keys(%frek));
my $gk;
foreach $gk (@gakoOrdenaduak) {
print “$gk bikotea $frek{$gk} aldiz agertu dan”;
}
Jaitsi bigramaMaiz.pl fitxategia