• Publicidad

Problemas con duplicidad de información en la salida

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Problemas con duplicidad de información en la salida

Notapor Katty » 2006-11-06 16:37 @734

hola a todos:

Tengo algunos problemas con el siguiente programa:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# Por cada linea
foreach my $linea ( @lineas )
{       chomp $linea;

        # Se crea eje
        my @eje = 1..4;        

        # Por cada palabra
        foreach my $palabra ( split(" ", $linea) )
        {        # Si la palabra Articulo                  
                  if ($palabra eq "LA")
                   {  push @{$eje[3]}, $palabra;
                   }
                   # Si la palabra es Sustantivo                   
                  if ($palabra eq "CASA")
                   {  push @{$eje[0]}, $palabra;
                   }
                   # Si la palabra es Verbo                
                   if ($palabra eq "ES")
                   {  push @{$eje[2]}, $palabra;
                   }
                   # Si la palabra Adjetivo                
                   if ($palabra eq "BONITA")
                   {  push @{$eje[1]}, $palabra;
                   }
        }
       
        my @reg;
        my $k;

#       print join(",", @{$eje[$_]} ) for 0..3;
       
        for($k = 0; $k < 4; $k++)
        {      
                push @reg , join (" ", @{$eje[$k]});
                print "lo que tiene reg es $k es: @reg \n";
        }

        print "lo que tiene reg es @reg\n";
 
        my @regis = join(",", @reg);

        print "lo que tiene regis es @regis\n";

        foreach my $campo3(@regis)
        {      print "lo que tiene campo3 es $campo3\n";
                print "\n";
        }
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


La idea es que si se ingresa una oración como LA CASA ES BONITA, deje en el arreglo eje (y según la posición indicada) los elementos de dicha oración, sin embargo si en la entrada se tiene 2 o más veces la oración, la salida generada se duplica o triplica (según la cantidad de veces que esté la oración repetida en la entrada).

He intentado inicializar las variables para limpiarlas pero no pasa nada...

Bueno esperando una buena acogida a este problema, me despido...

Katty.
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757

Publicidad

Notapor creating021 » 2006-11-06 17:06 @754

No entiendo cual es la lógica del programa.
¿Qué define la posición de las palabras?
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor explorer » 2006-11-06 17:48 @783

Las palabras se duplican y triplican porque hay líneas que están duplicadas o triplicadas.

No tienes ningún control sobre las líneas repetidas, por eso se repite la información.

Una forma de arreglarlo es recordando las frases que ya hemos procesado.

Supongamos que las frases que leemos están bien construidas. Quiere decir que no habrá diferencias de mayúsculas y signos de puntuación.

La solución pasa por hacer un
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $vista{$linea}++;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
después del chomp $linea;. De esa forma no procesaremos las frases ya procesadas antes.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Katty » 2006-11-06 19:43 @863

Primero, sorry por no explicarme bien...
Segundo, gracias por las respuestas...
Y tercero, aca trato de explicarme mejor... espero lo logre...

Lo que quiero es generar la salida (aunque sea la misma) de manera correcta, es decir que si por ejemplo de entrada tenemos:

LA CASA ES BONITA
LA CASA BONITA ES
ES LA CASA BONITA


La salida sea:

CASA , BONITA , ES , LA
CASA , BONITA , ES , LA
CASA , BONITA , ES , LA


La salida es segun la posicion que tiene el vector eje que es:

SUSTANTIVO , ADJETIVO , VERBO , ARTICULO

De antemano, muchas gracias...

Saludos, Katty.
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757

Notapor explorer » 2006-11-06 21:31 @938

El problema estaba a la hora de acceder a la información almacenada en @eje, además de sacar algunas cosas del bucle (ciclo) principal.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

# Leemos líneas
open FICHERO,"<kk.txt";
@lineas = <FICHERO>;
close FICHERO;

# Se crea un array que almacenará referencias a otros arrays
# Algo parecido a tener una matriz de dos dimensiones,
# siendo la primera dimensión el tipo de palabra a guardar
# y la segunda dimensión es el orden de la línea leída del fichero
# Así, $eje[2]->[4] es el verbo de la quinta línea.
my @eje;

# Por cada linea
foreach my $linea ( @lineas )
{
    chomp $linea;

    # Por cada palabra
    foreach my $palabra ( split(" ", $linea) )
    {
        # Si la palabra Articulo
        if ($palabra eq "LA") {
            push @{$eje[3]}, $palabra;
        }
        # Si la palabra es Sustantivo
        if ($palabra eq "CASA") {
            push @{$eje[0]}, $palabra;
        }
        # Si la palabra es Verbo
        if ($palabra eq "ES") {
            push @{$eje[2]}, $palabra;
        }
        # Si la palabra Adjetivo
        if ($palabra eq "BONITA") {
          push @{$eje[1]}, $palabra;
        }
    }
}

# Impresión del resultado
# Una por línea leída
foreach $i ( 0 .. $#lineas ) {

  # Una por cada tipo de palabra
  foreach $j ( 0 .. 3 ) {
    print "$eje[$j]->[$i], ";   # Qué es lo mismo que $eje[$j][$i]
  }

  # Este foreach se puede cambiar por:
  #print join(',', map { $eje[$_][$i] } 0..3);

  print "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Katty » 2006-11-07 11:44 @530

Explorer, gracias por tan buena solucion, pero que pasa si ahora se complica el problema y se le asigna un numero (segun el tipo de oracion) y ese numero debe estar en la salida, al final de cada oracion... :? Y que pasa si ahora se guarda ninguna o mas de una palabra en eje? :shock: Y que pasa si las palabras que no conoce las ignora para la salida, pero igual las muestra, pero solo una vez? :cry:

Es decir, si tenemos la siguiente entrada:

LA CASA ES FEA BONITA , 1
BONITA ES , 2
ES FEA LA CASA BONITA LINDA, 3
LINDA CASA ES BONITA , 4


En este caso LINDA seria tambien un ADJETIVO...

Y la salida sea:

CASA , BONITA , ES , LA , 1
, BONITA , ES , , 2
CASA , BONITA LINDA , ES , LA , 3
CASA , BONITA LINDA , ES , , 4


Notese que entre las palabras que pertenecen al mismo tipo no estan separadas por "," (como en el caso de BONITA LINDA) y que si no hay palabras que pertenezcan a un tipo especifico se deja el espacio...

He intentado con una adaptacion del programa de explorer, pero no me resulta: :oops:


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

# Leemos líneas
open FICHERO,"<kk.txt";
@lineas = <FICHERO>;
close FICHERO;

# Se crea un array que almacenará referencias a otros arrays
# Algo parecido a tener una matriz de dos dimensiones,
# siendo la primera dimensión el tipo de palabra a guardar
# y la segunda dimensión es el orden de la línea leída del fichero
# Así, $eje[2]->[4] es el verbo de la quinta línea.
my @eje;
my $clase;

# Por cada linea
foreach my $linea ( @lineas )
{
    chomp $linea;

    # Por cada palabra
    foreach my $palabra ( split(" ", $linea) )
    {
        # Si la palabra Articulo
        if ($palabra eq "LA") {
            push @{$eje[3]}, $palabra;
        }
        # Si la palabra es Sustantivo
        if ($palabra eq "CASA") {
            push @{$eje[0]}, $palabra;
        }
        # Si la palabra es Verbo
        if ($palabra eq "ES") {
            push @{$eje[2]}, $palabra;
        }
        # Si la palabra Adjetivo
        if ($palabra eq "BONITA" || $palabra eq "LINDA") {
          push @{$eje[1]}, $palabra;
        }
               
                if ($palabra =~ /d{1}$/)
                {       $clase = $palabra;
                        print "lo q tiene clase es $clase\n";
                }                              
                elsif ($palabra ne "," )
                {   # next if my $vista ($palabra) ++;
                        print "Palabra: $palabra ---> Clase: \n";
                }
        }

        @reg = join(",", map { $eje[$_][$j] } 0..3);

        push @reg , $clase;

        @regis = join(",", @reg);

        print "regis tiene: @regis\n";
        print "\n";

        foreach my $campo3(@regis)
        {       print "lo que tiene campo3 es $campo3\n";
                print "\n";
        }
}
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Bueno, espero que me puedan ayudar.... :lol:
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757

Notapor explorer » 2006-11-07 14:22 @640

Código: Seleccionar todo
LA CASA ES FEA BONITA , 1
BONITA ES , 2
ES FEA LA CASA BONITA LINDA, 3
LINDA CASA ES BONITA , 4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
# Lección aprendida
# Joaquín Ferrero, Noviembre 2006

# Esto
%es_lo_que_se = (
    LA      => 3,
    CASA    => 0,
    BONITA  => 1,
    ES      => 2,
    LINDA   => 1,
);

# del alfa al omega
($alfa, $omega) = (0, 3);

# porque de la nada, nada se aprende
$nada = ' ';

# pues entonces, abre el libro o muere
open my $libro, '<', 'kk.txt' or die "$!\n";

# y lo leeremos
while ( my $linea = <$libro> ) {

    # Saco tus frases del infinito espacio de las líneas.
    my ( $frase, $infinito ) = split ',', $linea;

    # Lo que leí antes no es nada
    my %lo_que_lei;

    # pues es ahora que con tus palabras aprenderé
    foreach $de_tus_palabras ( split " ", $frase ) {

        # Que son tus palabras en mi cabeza, leídas y memorizadas
        push
            # pues ahora,
            @{   $lo_que_lei {
                 $es_lo_que_se #,
            {    $de_tus_palabras  # y sólo
            }}}, $de_tus_palabras; # lo aprendí
    }

    # Ahora lo sé.
    # ¿Te digo lo que sé?
    print join ',', (
            map {
                # que
                      $lo_que_ahora_se = join ' ',
                # es
                    @{$lo_que_lei{$_}};

                # y sólo sé, que
                $lo_que_ahora_se ? # es
                $lo_que_ahora_se :
                # y si no sé nada, es que
                $nada # aprendí,

            # del alfa al omega,
            } $alfa .. $omega

        # hasta el
        ), $infinito;
}

# Fin de la lección,
close $libro;

__END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Código: Seleccionar todo
CASA,BONITA,ES,LA, 1
 ,BONITA,ES, , 2
CASA,BONITA LINDA,ES,LA, 3
CASA,LINDA BONITA,ES, , 4
Última edición por explorer el 2007-03-31 18:05 @795, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Katty » 2006-11-07 16:42 @738

Es la respuesta mas creativa que he visto en mi vida....

Sin embargo me quedan algunas dudas sobre lo que se hace en estas instrucciones...


explorer escribiste: push
@{ $lo_que_lei {
$es_lo_que_se
{ $de_tus_palabras
}}}, $de_tus_palabras;
}

print join ',', (
map {
$lo_que_ahora_se = join ' ',
@{$lo_que_lei{$_}};

$lo_que_ahora_se ?
$lo_que_ahora_se :
$nada
} $alfa .. $omega

), $infinito;
}

Espero que me pueda explicar lo que se realiza en ellas...

Saludos, Katty
Katty
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2006-08-30 17:11 @757

Notapor explorer » 2006-11-08 09:09 @423

Esta es otra versión un poco menos 'poética'.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

# Relación entre expresiones conocidas y número de esa expresión
%exp = (
    LA      => 3,
    CASA    => 0,
    BONITA  => 1,
    ES      => 2,
    LINDA   => 1,
);

# Rango de valores posibles
($alfa, $omega) = (0, 3);

# Leemos el fichero línea a línea
open my $fh, '<', 'kk.txt' or die "$!\n";

while ( my $linea = <$fh> ) {

    # Separamos la frase del número
    chomp $linea;
    my ( $frase, $num ) = split ',', $linea;

    # Las palabras las guardaremos en una estructura de datos
    # que tiene el siguiente aspecto:
    # Se trata de un hash cuyas claves son los números de los tipos de expresión
    # Y los valores son arrays que almacenan las expresiones encontradas
    # Ejemplo: $leido{1} = [ 'BONITA', 'LINDA', 'BONITA' ]
    my %leido;

    # Bucle por las palabras de la $frase
    foreach $palabra ( split " ", $frase ) {

        $tipo = $exp{ $palabra };       # número de tipo de expresión (de 0 a 3)

        # Guardamos la $palabra dentro del array según el $tipo que sea
        push @{ $leido{ $tipo } }, $palabra;
    }

    # Después de leer todas las palabras, pintamos el resultado

    # Hacemos un bucle por todos los tipos posible
    my @resultado;
    foreach $tipo ( $alfa .. $omega ) {

      # Por cada tipo, sacamos su array y los unimos con espacios en blanco
      my $tipo_str = join(' ', @{ $leido{ $tipo } });

      # En el caso de que no haya nada, dejamos al menos un espacio en blanco
      $tipo_str = $tipo_str ? $tipo_str : ' ';

      # Guardamos el resultado intermedio
      push @resultado, $tipo_str;
    }
    # Obtenemos el resultado final uniendolo todo con comas
    $resultado = join(',', @resultado);

    # Y lo sacamos todo a pantalla
    print $resultado;

    # Repetir el número leído antes y terminar la línea
    print ",$num\n";
}

close $fh;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron