2011-06-10 06:42 @321 |
|
|
Vertik
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: 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: Using perl Syntax Highlighting 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: Using perl Syntax Highlighting [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!
|
2011-06-10 07:24 @350 |
|
|
 |
explorer
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í. Using perl Syntax Highlighting 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): Using perl Syntax Highlighting my @match = $linea =~ /\b([a-zàáóòíéèúñ]+|[\d.]+)\b/gi;
_________________ JF^D Perl programming
|
2011-06-12 05:43 @279 |
|
|
 |
explorer
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... Using perl Syntax Highlighting #!/usr/bin/perl
use Modern::Perl; # somos modernos
use utf8; # este programa está escrito en utf8
#use autodie; # es mejor morir que regresar con deshonor (proverbio Klingon)
use open qw(:utf8 :std); # la salida y la entrada estándar serán en utf8
my $_ = q(
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
aseverado Solbes en declaraciones posteriores a TVE.
);
my %tokens;
while (/( \d+(?:[.,]\d+)* | [[:punct:]] | \w+ )/gx) {
say $1;
$tokens{ $1 }++;
}
for (sort {$tokens{$b} <=> $tokens{$a}} keys %tokens) {
say "$_ => $tokens{$_}";
}
__END__
Sale (al principio): 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
|
2011-08-26 08:07 @380 |
|
|
RGP_perl
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 Using perl Syntax Highlighting use File::Slurp;
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
|
2011-08-26 09:35 @441 |
|
|
 |
explorer
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: Using perl Syntax Highlighting for (sort keys %tokens) {
say "$_ => $tokens{$_}";
}
Por defecto, si no se le dice nada a sort{}, ordenará por orden alfabético.
_________________ JF^D Perl programming
|
2011-08-26 10:31 @480 |
|
|
RGP_perl
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: Using perl Syntax Highlighting for (sort keys %tokens) {
say "$_ => $tokens{$_}";
}
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
|
2011-08-26 21:23 @932 |
|
|
 |
explorer
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: Using perl Syntax Highlighting my @claves_ordenadas
= sort {
$tokens{$b} <=> $tokens{$a}
||
$a cmp $b
}
keys %tokens
;
for ( @claves_ordenadas ) {
say "$_ => $tokens{$_}";
}
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
|
|
Página 1 de 1
|
[ 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
|
|
Socializa |
 |
|