El debate político o como analizar textos con WPS

Febrero 4th, 2011 | por rvaquerizo |

¿Qué hacen los políticos españoles en el Congreso de los Diputados? Las tertulias radiofónicas están llenas de analístas políticos que podrán opinar sobre la labor del Congreso mejor que yo. Sin embargo yo tengo WPS, sé programar en SAS y en la web del Congreso están todas las sesiones y todas las intervenciones de la democracia. Pues con estos elementos vamos a iniciar un proceso de text mining, aunque no llegaremos a realizar ningún análisis complejo. Para comenzar, como siempre, necesito datos. Me he guardado la sesión del Congreso de los Diputados del día 26/01/2011 como web y posteriormente con Word la he salvado como fichero de texto (ojo con las codificaciones). De todos modos podéis descargaros aquí el fichero.

Comienza nuestro trabajo con WPS y lo primero es crear una tabla con la sesión:

filename sesion "D:\raul\wordpress\text mining WPS\PopUpCGI.txt" ;
data sucio;
infile sesion RECFM=V LRECL=10000;
informat linea1 $10000.;
format linea1 $10000.;
input linea1 $10000. ;
run;

Comenzamos con lo más sencillo pero considero necesario realizar unos comentarios. Cuando hacemos el INFILE la longitud de registro es mejor que sea variable, así aprovechamos los saltos de línea, como longitud de registro 10000 caracteres me parecen suficientes, esto no tiene mucha ciencia pero considero que las intervenciones no habrían de tener más de 10000 caracteres. Ahora tenemos una tabla de frases y yo quiero llegar a una tabla de palabras, será necesario un bucle que recorra caracter a caracter y separe las palabras:

data palabras;
set sucio end=fin;
drop linea1 i letra;
length palabra $20;
palabra="";
do i = 1 to length(linea1);
letra=substr(linea1,i,1);
if letra not in (" ","-") then palabra=compress(palabra||letra);
else do;
output;
palabra="";
end;end;
if fin then output;
run;

Este código no es sencillo pero lo puedo resumir en si hay un espacio en blanco o un guión eso implica separación entre palabras, es en ese momento cuando hago el OUTPUT, también lo tengo que hacer con la última palabra de la tabla. El proceso se realiza recorriendo caracter a caracter. El resultado es un dataset PALABRAS con las 29.903 palabras que se pronunciaron aquel día en el Congreso de los Diputados. Ahora necesitamos mejorar nuestros datos y quiero emplear una macro que ya ha asomado en el blog en otras ocasiones. Además elimino tildes y algunas palabras que suelen usarse mucho:


%macro valida(in,out);
length escribe $55.;
escribe="";
do i=1 to length(&in.);
j=substr(&in.,i,1);
if j in ('A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','Ñ') then escribe=trim(escribe)||j;
else if substr(&in.,i,1)=" " then escribe=trim(escribe)||"-";
else escribe=trim(escribe);
drop i j escribe;
end;
&out.=tranwrd(compress(escribe),"-"," ");
%mend;
***************************************;
data palabras2;
set palabras;
palabra=upcase(palabra);
palabra=translate(palabra,"AEIOU","ÁÉÍÓÚ");
%valida(palabra,palabra2);
if length(palabra2) > 2;
if palabra2='QUE' then delete;
if palabra2='DEL' then delete;
if palabra2='LOS' then delete;
if palabra2='POR' then delete;
if palabra2='LAS' then delete;
if palabra2='CON' then delete;
if palabra2='PARA' then delete;
if palabra2='UNA' then delete;
if palabra2='ESTA' then delete;
if palabra2='COMO' then delete;
if palabra2='ESTE' then delete;
if palabra2='MAS' then delete;
if palabra2='USTED' then delete;
if palabra2='GRACIAS' then delete;
if palabra2='SOBRE' then delete;
if palabra2='TAMBIEN' then delete;
if palabra2='HAN' then delete;
if palabra2='TANTO' then delete;
if palabra2='MUCHAS' then delete;
if palabra2='PORQUE' then delete;
if palabra2='NOS' then delete;
if palabra2='PERO' then delete;
if palabra2='TODO' then delete;
if palabra2='TIENE' then delete;
if palabra2='NUESTRO' then delete;
if palabra2='SUS' then delete;
run;

Ya tenemos en nuestra sesión de WPS el dataset PALABRAS2 con la variable PALABRA2 con la que ya podemos hacer un pequeño análisis de que asuntos son los que más se tratan en las sesiones del congreso. ¿Y qué es lo primero que podemos hacer? Un ranking de palabras:

proc sql;
create table cuenta as select
palabra2,
count(*) as frec
from palabras2
group by 1
order by 2 desc;
quit;
*Establecemos el ranking;
data cuenta;
set cuenta;
posicion = _n_;
run;

Ya podemos ver que los AEROPUERTOS despiertan el interés en nuestros representantes. Que el PARO o el EMPLEO parecen preocupar menos. En fin, empezamos a ver algunas cosas. Un trabajo sencillo con WPS nos permite realizar análisis muy interesantes. Os imagináis que tabulamos todas las intervenciones de la actual legislatura y analizamos que palabras son las que van despertando mayor interés en las sesiones. O por ejemplo, qué palabras son las que rodean a paro, ¿construcción, jóvenes? Qué diputados son los que más han intervenido, los que menos, la longitud de las palabras que emplean,... en fin mil cosas. No necesitamos software específico ni algoritmos complejos para realizar nuestros procesos de text mining. En poco menos de una hora he encontrado algunas cosas interesantes. Seguiré con ello.

Etiquetas: ,

  1. 7 Respuestas en “El debate político o como analizar textos con WPS”

  2. Por Carlos J. Gil Bellosta, Feb 8, 2011 | Responder

    ¡Muy bueno el comentario! A ver si encuentro la página de unos tipos que hicieron algo parecido con todas las sesiones del parlamento vasco…

  3. Por Carlos J. Gil Bellosta, Feb 8, 2011 | Responder

    Igual deberias tratar de replicar esto:

    http://www.guardian.co.uk/news/datablog/2010/dec/16/wikileaks-iraq-visualisation#zoomed-picture

  4. Por Carlos J. Gil Bellosta, Feb 8, 2011 | Responder

    ¡O podías procesarlos con http://www.wordle.net!

  5. Por rvaquerizo, Feb 9, 2011 | Responder

    Los tiros van más por aquí:

    http://www.nytimes.com/interactive/2011/01/25/us/politics/state-of-the-union-words-used.html?hp?src=ISMR_HP_LO_MST_FB

    Por cierto, mira lo que he “retwitteado” del linkedin.

  6. Por Carlos J. Gil Bellosta, Feb 11, 2011 | Responder

    ¿Y qué opinión tienes de esto otro?

    http://ai-depot.com/articles/the-easy-way-to-extract-useful-text-from-arbitrary-html/

  7. Por rvaquerizo, Feb 11, 2011 | Responder

    Interesante el link. Además me ha gustado el ejemplo.

    Por cierto, no has dicho nada de esto:

    http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

  1. 1 Trackback(s)

  2. Sep 12, 2013: Dividir en palabras un texto con SAS » Análisis y decisión

Publica un Comentario