Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 
Índice general » Mundo Perl » Intermedio » Extracción de todos los tokens de un texto  RESUELTO Responder al tema
Nuevo tema


Página 1 de 1  [ 7 mensajes ] 
 
Nota 2011-06-10 06:42 @321

Perlero Nuevo
Registrado: 2011-04-20 06:32 @314
Mensajes: 35
Extracción de todos los tokens de un texto
Hola,

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

Dado este texto:
Syntax: [ Download ] [ Hide ]
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.


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

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

Con un:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1.  split(\b,$linea) #siendo linea el texto

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:
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. [a-zA-Zàáóòíéèúñ]+|\d+(.\d+)?|[,."?¿]

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!


Nota 2011-06-10 07:24 @350
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de todos los tokens de un texto
Sería así.
Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my @match = $linea =~ /([a-zàáóòíéèúñ]+|\d+(.\d+)?|[,."?¿])/gi;


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):

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. my @match = $linea =~ /\b([a-zàáóòíéèúñ]+|[\d.]+)\b/gi;

_________________
JF^D Perl programming


Nota 2011-06-12 05:43 @279
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de todos los tokens de un texto  RESUELTO
Aquí hay otra solución...
Syntax: [ Download ] [ Hide ]
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__
Sale (al principio):
Syntax: [ Download ] [ Hide ]
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

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


Nota 2011-08-26 08:07 @380

Perlero Nuevo
Registrado: 2011-08-26 07:49 @367
Mensajes: 6
Re: Extracción de todos los tokens de un texto
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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. use File::Slurp;
  2.  
  3. my $_ = read_file('/Users/rgp/Desktop/Test.html');


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


Nota 2011-08-26 09:35 @441
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de todos los tokens de un texto
A mí me parece correcto la forma de leerlo.

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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. for (sort keys %tokens) {
  2.     say "$_ => $tokens{$_}";
  3. }

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

_________________
JF^D Perl programming


Nota 2011-08-26 10:31 @480

Perlero Nuevo
Registrado: 2011-08-26 07:49 @367
Mensajes: 6
Re: Extracción de todos los tokens de un texto
explorer escribió:
A mí me parece correcto la forma de leerlo.

Perfecto. Entonces ya no hay de qué preocuparse.

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

Syntax: [ Download ] [ Hide ]
Using perl Syntax Highlighting
  1. for (sort keys %tokens) {
  2.     say "$_ => $tokens{$_}";
  3. }

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


Nota 2011-08-26 21:23 @932
Avatar de Usuario
Administrador
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España
Mensajes: 10250
Re: Extracción de todos los tokens de un texto
Bueno, pues entonces hay que encadenas varias ordenaciones:

Syntax: [ Download ] [ Hide ]
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. }

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


Responder al tema  [ 7 mensajes ] 

Reglas del Foro
No puedes abrir nuevos temas en este Foro
No puedes responder a temas en este Foro
No puedes editar tus mensajes en este Foro
No puedes borrar tus mensajes en este Foro
No puedes enviar adjuntos en este Foro

Publicidad

Socializa

Síguenos por Twitter

Suscríbete GRATUITAMENTE al Boletín de Perl en Español

Saltar a:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO