miércoles, 2 de septiembre de 2009

Análisis de textos,USC,examenes...

"Me comenta mi hermana que tiene una asignatura de Linux, una optativa, la ha suspendido y me comentaba si le podrías echar una mano". Así comenzaba una de las mayores sorpresas de este año. La respuesta estaba cantada, "Dile que me llame, tomamos algo y lo hablamos...". Lo dicho, quedamos y me comenta Rosa "Teño unha asignatura de Linux, facemos cousas na consola e non teño nin idea. O exame será oral a comezos de setembro, mira esta páxina web http://gramatica.usc.es/~gamallo/ , que é donde tes a información sobre a Análise Computadorizada de Textos Hispánicos". Mi sopresa es mayúscula cuando reviso el contenido del curso. El docente les ha enseñado Perl, para extraer información de cualquier texto. La frustración de Rosa : ponerse a programar,;y claro, si estudias Hispánicas, comprendo la frustración es más que comprensible.
El examen oral está disponible aquí, y según me comenta, se deben explicar los scripts el día del examen.
¿Cómo analiza un texto? Lo primero que hace es "tokenizar" el texto, es decir, escribir en cada línea una palabra.El docente les ha dejado un script, llamado tokenizer.perl, que realiza esta tarea. Ejemplo con el fichero texto.txt que contiene "Ni nombre Alberto" tendríamos un fichero de salida del tipo:
[alberto@pilarrubio]cat texto.txt|./tokenizer.perl > texto.tokenizado && cat texto.tokenizado.

Mi
nombre
es
Alberto

El contenido del fichero tokenizer.perl es el siguiente:

#!/usr/bin/perl -w


#Tokenizer:
#lê um ficheiro texto linha a linha
#Separa os símbolos especiais
#quebra as linhas cada vez que encontra um espaço em branco
#escreve um tokem ou símbolo por linha

$Separador = "[\.\,\;\:\«\»\&\%\+\=\$\(\)\<\>\!\¡\?\¿\\[\\]]" ;

while ($line=) {
chop($line);

$line =~ s/($Separador)/ $1 /g;
#$line =~ s/\s+/ /g;


@ListaDeTokens = split(" ", $line);
foreach $token (@ListaDeTokens) {

print "$token\n";

}
}


print STDERR "Fim do tokenizer\n";



El problema viene cuando nos pide que en un texto se distinga entre nombres propios, verbos y demás. Para ello, después de tener el texto "tokenizado", debemos "Taggearlo" con una aplicación de análisis morfológio llamada FreeLing, desarrollada por el Centre de Tecnologies i Aplicacions del Llenguatge i la Parla (TALP). He intentado instalarlo en Ubuntu 9.04 y en Debian 5.0 Testing, pero lamentablemente el link de descarga no funcionaban. Decidí ponerme en contacto con la gente del TALP, y tengo que decir, que, aunque no se ha resuelto aún el problema, la respuesta ha sido muy rápida. Así da gusto. Continuamos. Al final, gracias a Dorfun encontré FreeLing empaquetado en .deb en esta URL.
Taggeamos el texto:
[alberto@pilarrubio] cat texto.tokenizado|freeling-es > texto.tagged
cuyo resultado es un texto de nombre texto.tagged con el siguiente contenido.

PRO Mi
NOM nombre
V es
NOM Alberto


A continuación ya tenemos el texto tagged y podemos filtrar por el criterio que nos pida el docente, en este caso, o que el usuario decida.El enunciado del ejericio 4 es el siguiente:

4.-Cuenta y escribe de mayor a menor frecuencia todos los nombres propios.


El comando, después de tener taggeado el texto sería algo así:
[alberto@pilarrubio] cat texto.tagged |.04.perl
Donde 04.perl :

#!/usr/bin/perl
$token="";
while ($linha = ) {
chomp $linha;
if ($linha ne "") {
($token,$etiqueta) = split (" ", $linha) ;



if ($etiqueta =~ m/^NOM/ ) {
$contarNomes++;
$contar{$token}++ ;
}

}


}

if (defined $contarNomes) {
print "Ocorrencias de nomes: $contarNomes\n";
}
foreach $tokenDiff (sort {$contar{$b} <=>
$contar{$a} }
keys %contar ) {

print "$tokenDiff\t$contar{$tokenDiff}\n";
}



Si tenéis curiosidad por el tema , os remito a la web de Pablo Gamallo, el docente del curso. La casualidad me lleva a leer vía RSS una noticia que anuncia un curso de verano de la USC : "O Software Libre e a Lingüistica".
Para finalizar el post, dar mi enhorabuena al docente, que , en mi modesta opinión, se ha currado mucho el temario del curso, no tanto por la calidad de los scripts, que sí la tiene, sino por la aplicación de un lenguaje de programación, Perl, en este caso, al análisis lingüístico de textos. En segundo lugar agradecer a Rosa la oportunidad de poder ayudarla a, por lo menos, intentar aprobar la asignatura. Ahora mismo la deben de estar examinando. No suelo desear suerte a nadie en ningún examen, sólo justicia, y si se hace justicia debe aprobar: el esfuerzo (casi) siempre tiene recompensa.

No hay comentarios: