• Publicidad

Extracción de todos los tokens de un texto

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Extracción de todos los tokens de un texto

Notapor Vertik » 2011-06-10 06:42 @321

Hola,

Estoy haciendo un script que dado un texto me devuelva todos sus tokens.

Dado este texto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Tras admitir que cada uno "puede tomar sus propias decisiones" aunque el Gobierno no espera un "comportamiento irracional" de los clientes sacando cantidades excesivas de dinero, el jefe de la política económica del Ejecutivo ha justificado el aval de hasta 9.000 millones sobre los fondos depositados en Caja Castilla-La Mancha en que, en cualquier caso, había que prever este extremo. "Pueden pedir su dinero con toda tranquilidad, pero si no le hace falta utilizarlo no tienen ninguna necesidad de cambiar de entidad", ha asverado Solbes en declaraciones posteriores a TVE.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Obtener la separación de palabras y signos de puntuación.

Pues no sé cómo hacerlo bien del todo, me explico.

Con un:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  split(\b,$linea) #siendo linea el texto
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

el resultado es aproximadamente lo que quiero, pero el caso de 9.000 falla, ya que me los separa.

Entonces, jugando con un validador de expresiones regulares, la expresión:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. [a-zA-Zàáóòíéèúñ]+|\d+(.\d+)?|[,."?¿]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

haciendo matchAll me caza todas los tokens que quiero.

Entonces, ¿cómo puedo hacer para que dada esta expresión Perl me genere un array donde cada elemento/posición sea un match de ella?

¡Mil gracias!
Vertik
Perlero nuevo
Perlero nuevo
 
Mensajes: 41
Registrado: 2011-04-20 06:32 @314

Publicidad

Re: Extracción de todos los tokens de un texto

Notapor explorer » 2011-06-10 07:24 @350

Sería así.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @match = $linea =~ /([a-zàáóòíéèúñ]+|\d+(.\d+)?|[,."?¿])/gi;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Eso sí... hay que afinar un poco más la expresión regular. Hay que indicar que queremos capturar palabras, así que hay que poner los delimitadores \b.

Algo así (no probado):

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @match = $linea =~ /\b([a-zàáóòíéèúñ]+|[\d.]+)\b/gi;
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

Re: Extracción de todos los tokens de un texto

Notapor explorer » 2011-06-12 05:43 @279

Aquí hay otra solución...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Modern::Perl;        # somos modernos
  3. use utf8;                # este programa está escrito en utf8
  4. #use autodie;            # es mejor morir que regresar con deshonor (proverbio Klingon)
  5. use open qw(:utf8 :std); # la salida y la entrada estándar serán en utf8
  6.  
  7. my $_ = q(
  8. Tras admitir que cada uno "puede tomar sus propias decisiones" aunque el
  9. Gobierno no espera un "comportamiento irracional" de los clientes sacando
  10. cantidades excesivas de dinero, el jefe de la política económica del Ejecutivo
  11. ha justificado el aval de hasta 9.000 millones sobre los fondos depositados en
  12. Caja Castilla-La Mancha en que, en cualquier caso, había que prever este
  13. extremo.  "Pueden pedir su dinero con toda tranquilidad, pero si no le hace
  14. falta utilizarlo no tienen ninguna necesidad de cambiar de entidad", ha
  15. aseverado Solbes en declaraciones posteriores a TVE.
  16. );
  17.  
  18. my %tokens;
  19.  
  20. while (/( \d+(?:[.,]\d+)* | [[:punct:]] | \w+ )/gx) {      
  21.  
  22.     say $1;
  23.  
  24.     $tokens{ $1 }++;
  25. }
  26.  
  27. for (sort {$tokens{$b} <=> $tokens{$a}} keys %tokens) {
  28.     say "$_ => $tokens{$_}";
  29. }
  30.  
  31. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sale (al principio):
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
" => 6
de => 6
, => 5
en => 4
no => 3
que => 3
el => 3
dinero => 2
ha => 2
. => 2
los => 2
su => 1
excesivas => 1
sus => 1
tomar => 1
tienen => 1
ninguna => 1
Castilla => 1
económica => 1
política => 1
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

En el patrón, buscamos por conjuntos de dígitos con separador de millares y decimales (\d+(?:[.,]\d+)*), caracteres de puntuación ([[:punct:]]), y palabras (\w+) (aquí, las palabras incluyen aquellas con un '_').
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

Re: Extracción de todos los tokens de un texto

Notapor RGP_perl » 2011-08-26 08:07 @380

Muchas gracias por esta solución. Me parece muy útil.

Si en vez de colocar el texto en "my $_ = q(...) quisiera ejecutar el código directamente sobre un archivo (e.g., Users/rgp/Desktop/Test.html), ¿cómo lo haría exactamente?

He probado añadiendo

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use File::Slurp;
  2.  
  3. my $_ = read_file('/Users/rgp/Desktop/Test.html');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y parece funcionar, pero no sé si es lo más indicado en este caso.

Por último, ¿sería posible adaptar el script de modo que los tokens aparecieran ordenados por número de aciertos, como ahora, pero luego por orden alfabético?

Muchas gracias.

RGP
RGP_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-08-26 07:49 @367

Re: Extracción de todos los tokens de un texto

Notapor explorer » 2011-08-26 09:35 @441

A mí me parece correcto la forma de leerlo.

Para sacar los tokens por orden alfabético, hay que ordenarlos por las claves:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (sort keys %tokens) {
  2.     say "$_ => $tokens{$_}";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por defecto, si no se le dice nada a sort{}, ordenará por orden alfabético.
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

Re: Extracción de todos los tokens de un texto

Notapor RGP_perl » 2011-08-26 10:31 @480

explorer escribiste:A mí me parece correcto la forma de leerlo.

Perfecto. Entonces ya no hay de qué preocuparse.

explorer escribiste:Para sacar los tokens por orden alfabético, hay que ordenarlos por las claves:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for (sort keys %tokens) {
  2.     say "$_ => $tokens{$_}";
  3. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Por defecto, si no se le dice nada a sort{}, ordenará por orden alfabético.


Me temo que no he sabido expresarme correctamente. Me refería a establecer un orden dentro de otro orden. Primero los tokens que aparecen 6 veces (o 5 o las que sean), y dentro de ese grupo que aparecieran listados alfabéticamente, luego los que aparecen 5 veces, y así sucesivamente. Así, por remitirme al ejemplo original, saldría esto:

    " => 6
    de => 6
    , => 5
    en => 4
    el => 3
    no => 3
    que => 3
    . => 2
    dinero => 2
    ha => 2
    los => 2
    Castilla => 1
    económica => 1
    excesivas => 1
    ninguna => 1
    política => 1
    su => 1
    sus => 1
    tienen => 1
    tomar => 1

Gracias de nuevo, y disculpas por la falta de claridad en mi anterior mensaje.

RGP
RGP_perl
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2011-08-26 07:49 @367

Re: Extracción de todos los tokens de un texto

Notapor explorer » 2011-08-26 21:23 @932

Bueno, pues entonces hay que encadenas varias ordenaciones:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @claves_ordenadas
  2.     = sort {
  3.         $tokens{$b} <=> $tokens{$a}
  4.                     ||
  5.                  $a cmp $b
  6.     }
  7.     keys %tokens
  8.     ;
  9.  
  10. for ( @claves_ordenadas ) {
  11.     say "$_ => $tokens{$_}";
  12. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Primero realiza la ordenación por los valores, en orden numérico, por orden inverso, y si son iguales, se activa la segunda ordenación, por las claves, por medio de una comparación alfanumérica, en orden ascendente.

Más ejemplos en perldoc -f sort.
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 Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 3 invitados