37. kasu praktikoa: bigrama-ereduak

     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

Utzi erantzuna

Zure e-posta helbidea ez da argitaratuko. Beharrezko eremuak * markatuta daude