Desktop version

Home arrow Language & Literature

  • Increase font
  • Decrease font


<<   CONTENTS   >>

Exploración avanzada

Volvamos ahora a una cuestion tratada previamente: la elaboracion de listas de frecuencias. Como hemos visto, con wc es posible saber cuantas formas graficas estan contenidas en un fichero о en una serie de ficheros, у con grep -c podemos saber cuantas lfneas contienen una determinada expresion, pero ese tipo de manipulation esta lejos de producir una lista de frecuencias de formas.

Es evidente, pues, que es necesario cambiar de perspectiva, tratar de ver que operaciones serfan necesarias para producir automaticamente una lista de frecuencias e investigar luego si existen utilidades que nos permitan llevarlas a cabo. No es dificil llegar a la conclusion de que lo primero que necesitamos para producir una lista de frecuencias de las palabras de un texto es, precisamente, tener todas las palabras que lo forman en una lista. Es decir, hay que pasar de un formato en el cual las lfneas contienen una serie mas о menos grande de palabras a otro en el cual cada palabra ocupa una lfnea. Una vez conseguido eso, podrfamos ordenarlas, con lo que todos los casos de la misma palabra estarfan unos a continuacion de los otros. Con ello serfa relativamente sencillo hacer el recuento de line as que contienen cada palabra у generar un fichero con una lfnea para cada forma distinta acompanada de su frecuencia. Aunque en aparta- dos posteriores veremos formas mucho mas rapidas у elegantes de lograr el mismo resultado, en esta parte vamos a seguir un camino mas largo у compuesto por diferentes fases, que tiene la ventaja (didactica) de obligar a individualizar cada una de las operaciones necesarias.

Para cumplir con lo indicado en la primera fase (hacer que cada palabra del texto este en una lfnea diferente), podemos recurrir a una utilidad de Unix realmente potente (aunque aquf nos vamos a limitar a hacer un uso muy restringido de ella): sed. Se trata de un editor en lfnea que puede hacer sustituciones de secuencias de caracteres, eliminar lfneas que ten- gan ciertas caracterfsticas у muchas otras operaciones. Lo que tenemos que conseguir de entrada con sed es algo tan sencillo сото sustituir los espacios en bianco por retornos de carro.35 La forma de lograrlo con la primera parte del Quijote es:

sed 's/ / /g' Quijotel.txt

En primer lugar esta la orden (sed) luego, entre comillas simples, su contenido у finalmente el fichero al cual queremos aplicarla. En este caso concreto, la operacion deseada es una sustitucion, que se marca separando cada una de sus partes con barras (/).

s/cadena_entrada/cadena_salida/

Aquf se pone un espacio en bianco сото cadena de entrada у la indicacion de retorno de carro ( )56 сото cadena de salida. Por ultimo, la g que figura despues de la ultima barra da caracter general a la operacion: si no se incluye, sed aplica la orden solo a la primera coincidencia de cada lfnea, que no es lo deseado. Las ultimas lfneas que podemos ver en el monitor son las siguientes:3'

con

esperanza

de

la

tercera

salida

de

don

Quijote.

Forsi

altro

cantera

con

miglior plectio.

Finis

Hay en ellas varios rasgos que debemos analizar. Dado que ahora cada palabra esta en una lfnea, parece que el numero de palabras у lfneas deberfa ser el mismo. Sin embargo, si redirec- cionamos a wc la orden anterior, ambos recuentos difieren: sed 's/ / /g' Quijotel.txt |wc 190275 185771 1058310

Hay 190 275 1ideas у solo 185 771 palabras. Esta claro que la diferencia es debida a la exis- tencia de lfneas en bianco (observables en la lista anterior), que cuentan сото lineas, pero no сото palabras. Esas lfneas en bianco proceden de los retornos de carro existentes ya en el texto original у que se han conservado.

El punto siguiente sobre el que debemos reflexionar se refiere a la presencia de palabras seguidas por signos de puntuacion (сото Quijote. о plectio.). Es algo que extrana a los ojos humanos, acostumbrados a abstraer los elementos lingiifsticos en sentido estricto sin prestar atencion a los signos de puntuacion, pero que resulta perfectamente esperable si tenemos en cuenta lo que se ha pedido: sustituir los espacios en bianco por retornos de carro, con lo que la secuencia situada entre dos blancos se convierte en el contenido de una lfnea. Por tanto, en la lista resultante, tendremos casos de Quijote sin mas у tambien Quijote seguido о prece- dido de diferentes signos de puntuacion. Es un problema que tendremos que solucionar, puesto que no interesa un recuento en el que las formas sean diferenciadas segtin vayan acompanadas о no de signos de puntuacion, pero vamos a prescindir de el de momento para centrarnos en lo que se refiere a la produccion de la lista de formas con sus frecuencias.

Comprobado que la orden con sed nos proporciona un resultado proximo al que necesita- mos, podemos aplicarla de nuevo у conservar el resultado en otro fichero.

sed 's/ / /g' Quijotel.txt > lista_Ql.txt

Tenemos ahora, por tanto, que convertir la lista de todas las formas que componen esta parte de la obra en lfneas distintas en una relacion simple de las formas distintas. La utilidad sort, que ya hemos utilizado, tiene una opcion que puede servir:

sort -u lista_Ql.txt

La salida (en el monitor) muestra que no es exactamente lo que necesitamos, puesto que nos da la relacion de formas distintas, pero no la frecuencia de cada una de ellas.38 Necesitamos, por tanto, que sea capaz de contar el mimero de apariciones de cada una de las formas. Eso es lo que consigue la orden uniq (que produce una lista de formas distintas) acompanada del parametro -c (que incorpora el recuento de cada una de ellas). Ahora bien, esta orden exige que los casos que hay que fundir esten seguidos, de modo que es obligado hacer primero la ordenacion. Por tanto, dando todos los pasos por separado:

sort lista_Ql.txt > lista_Ql_bis.txt

uniq -c lista_Ql_bis.txt > lista_Ql_ter.txt

Podemos analizar todo el fichero producido, pero, para observar el formato que tiene sera suficiente con obtener (con tail) sus ultimas lfneas о bien extraer (con grep) las que contengan una determinada secuencia de caracteres. El resultado de tail es:

  • 3 Zoraida;
  • 3 Zoraida:
  • 6 Zoraida.
  • 28 Zoraida 1 Zoroastes,
  • 1 Zulema,
  • 1 zumban 1 Zurdo.
  • 1 zurron,
  • 1 zuzaban

El fichero esta formado por la indicacion de la frecuencia de cada forma, luego nn espacio en bianco у despues la secuencia de caracteres individualizada. Parece que hay ordenacion alfabetica por la forma. Si resulta de mas utilidad, es sencillo obtener esa misma lista orde- nada por frecuencias

sort -n lista_Ql_ter.txt

las facilita en secuencia ascendente (de menor a mayor) у

sort -nr lista_Ql_ter.txt

las da en secuencia descendente (de mayor a menor).

En todo el proceso anterior hemos ido paso a paso, produciendo у conservando los resul- tados de cada fase en ficheros intermedios. Si lo unico que interesa es el resultado final, podemos usar el redireccionamiento у obtener directamente el listado final, que vamos a ordenar por frecuencias у en sentido descendente:

sed 's/ / /g' Quijotel.txt | sort | uniq -c | sort -nr > lista_ frecuencias_Ql.txt

Con estas pocas instrucciones formuladas directamente desde el sistema operativo hemos conseguido producir una lista de frecuencias de todas las formas ortograficas existentes en la primera parte del Quijote. Pero para que la lista pueda tener utilidad real, tenemos que solucionar el problema que hemos dejado provisionalmente a un lado: los signos ortograficos que aparecen pegados a las secuencias de letras у que distorsionan la ordenacion, la obten- cion de las formas tinicas y, por tanto, los recuentos. Ya hemos visto que sed puede hacer sustituciones, de modo que el camino es claro: podemos emplear esta utilidad para sustituir los signos ortograficos por nada, es decir, eliminarlos.

Hagamos una prueba con las comas. Para hacernos cargo de la entidad de lo que vamos a intentar, veamos primero cuantas lfneas contienen una coma en el fichero que resulta de la conversion de los espacios en bianco en retornos de carro:

grep -c lista_Ql.txt

19382

Vamos ahora a tratar de eliminarlas utilizando sed: sed 's/,//' lista_Ql.txt

El examen de las lineas que quedan en el monitor muestra que ya no hay comas, pero podemos asegurarnos del resultado de la operacion analizando el resultado obtenido con grep:39

sed 's/,//' lista_Ql.txt | grep -c 0

Esta claro que este es el camino adecuado, de modo que podemos ir almacenando el resultado de la primera sustitucion en un fichero de paso sobre el que aplicamos la segunda sustitucion у asf sucesivamente hasta lograr la anulacion de todos los signos ortograficos. Es un proceso bastante pesado, por lo que hay que explorar otras vfas. La primera de ellas es utilizar la posi- bilidad que ofrece sed de combinar varias sustituciones en la misma orden. Por ejemplo, para cambiar de una sola vez las comas у los guiones podemos usar la orden siguiente en la que, para comprobar que han desaparecido tambien los guiones, se envia el resultado a grep:

sed 's/,//;s/-//' lista_Ql.txt | grep

prosegui-

diran-

respondio-

di j e-

Han quedado algunos guiones posteriores a la palabra. La causa es, naturalmente, que ahora, al combinar varias sustituciones, no es adecuado que sed opere solo una vez por linea. Por tanto:

sed 's/,//;s/-//g' lista_Ql.txt | grep -c 0

Es posible, pues, ir anadiendo sustituciones hasta agotar los signos de puntuacion у quedar- nos unicamente con lo que entendemos habitualmente por forma ortografica:

sed 's/,//;s/-//;s/;//;s/?//g' lista_Ql.txt

Una opcion equivalente, mas comoda, consiste en indicarle a sed que aplique las instrucciones contenidas en un fichero extemo. Es decir, en un fichero de texto se van escribiendo todas las sustituciones que queremos hacer en forma de instrucciones para sed. Por ejemplo, podemos hacer, con un editor de texto, el fichero sustitucion_signos_puntuacion. txt con un contenido del estilo siguiente:40

s/.//g s/ //g s/,//g s/;//g s/://g s/i//g s/?//g s///g s/!//g s/-//g s/"//g s/"//g s/ //g s/ (//g s/)//g s/i//g s/"//g s/'//g s/]//g

Lo que hay que hacer luego es indicarle a sed que debe aplicar todas esas instrucciones, lo cual se logra utilizando el parametro - f:

sed -f sustitucion_signos_puntuacion.txt lista_Ql.txt > lista_ Ql_bis.txt

Es necesario examinar el resultado por si ha quedado todavia algun signo. En ese caso, se abre el fichero у se anade la line a correspondiente, siempre con el mismo sistema. Cuando ese proceso este totalmente terminado, podemos aplicar ya la secuencia de operaciones examinada anteriormente: ordenar, hacer el recuento de formas unicas y, si es preciso, reor- denar el resultado del ntodo mas adecuado a nuestros fines:41

sort lista_Ql_bis.txt | uniq -c | sort -nr > lista_Ql_ter.txt

Para saber cuantas formas distintas hay en la primera parte del Quijote:

wc lista_Ql_ter.txt

15947 31893 267436 lista_Ql_ter.txt

Aunque no hemos hecho mucho mas que explorarla en la superficie, los paragrafos anterio- res han dejado claro que grep es una herramienta que, junto con sed, resulta de gran ayuda a quienes necesitamos extraer informacion de los textos. Por ejemplo, grep puede devolver no solo la lfnea en la que aparece la expresion buscada, sino tambien las que figuran inme- diatamente antes о inmediatamente despues.42 Para ver tambien las tres lfneas siguientes a la unica que contiene la forma rabeles en toda la obra:

grep -A3 "rabeles" Quijote7.txt

Quijote2.txt:zamoranas, que tamborines, у que de sonajas, у que de rabeles! Pues, ;que

Quijote2.txt-si destas diferencias de musicas resuena la de los albogues! Alii se vera

Quijote2.txt-casi todos los instrumentos pastorales.

Quij ote2.txt-

Para ver las tres anteriores:

grep -B3 "rabeles" Quijote7.txt Quij ote2.txt-

Quijote2.txt—;Valame Dios -dijo don Quijote-, у que vida nos hemos de dar, Sancho

Quijote2.txt-amigo! ;Que de churumbelas han de llegar a nuestros oidos, que de gaitas

Quijote2.txt:zamoranas, que tamborines, у que de sonajas, у que de rabeles! Pues, ;que

Por supuesto, es posible combinar una indicacion para las li'neas anteriores у otra para las posteriores, pero hay una forma de pedir de una sola vez un cierto numero de li'neas anted- ores у posteriores:45

grep -C2 "rabeles" Quijote7.txt

Quijote2.txt—;Valame Dios -dijo don Quijote-, у que vida nos hemos de dar, Sancho

Quijote2.txt-amigo! ;Que de churumbelas han de llegar a nuestros oidos, que de gaitas

Quijote2.txt:zamoranas, que tamborines, у que de sonajas, у que de rabeles! Pues, ;que

Quijote2.txt-si destas diferencias de musicas resuena la de los albogues! Alii se vera

Quijote2.txt-casi todos los instrumentos pastorales.

Es posible tambien obtener el numero que corresponde en el texto explorado a cada linea devuelta (ojo: no es lo mismo que el numero de li'neas devueltas, que es lo que se consigue con la opcion -c):

grep -nC2 "rabeles" QuijoteP.txt

Quijote2.txt-18224—;Valame Dios -dijo don Quijote-, у que vida nos hemos de dar, Sancho

Quijote2.txt-18225-amigo! ;Que de churumbelas han de llegar a nuestros oidos, que de gaitas

Quijote2.txt:18226:zamoranas, que tamborines, у que de sonajas, у que de rabeles! Pues, ;que

Quijote2.txt-18227-si destas diferencias de musicas resuena la de los albogues! Alii se vera Quijote2.txt-18228-casi todos los instrumentos pastorales.

En el proceso de elaboracion de la lista de frecuencias de las formas de la primera parte del Quijote no hemos tenido en cuenta la diferencia entre caracteres en mayuscula у en minus- cula. Elio implica que en el resultado final se mantiene esa diferencia, lo cual podria resultar inadecuado para ciertos propositos, ya que la devolucion de la frecuencia de, por ejemplo, la secuencia senor devuelve un resultado que no es realmente el que se necesita en la mayor parte de los objetivos de una investigacion linguistica:

grep "senor" lista_Ql_ter.txt 352 senor 224 senora 20 senoras 1 senorea 1 senoreaba 52 senores 3 senoria

  • 2 senorias
  • 1 senoril
  • 2 senorio 1 senorios

grep -i "senor" lista_Ql_ter.txt 352 senor 47 Senor 224 senora 5 Senora 1 SENORA 20 senoras 1 Senoras 1 senorea

1 senoreaba 52 senores

2 Senores

3 senoria

1 Senoria

  • 2 senorias
  • 1 senoril
  • 2 senorio 1 senorios

Como se puede apreciar en las dos salidas anteriores, la utilizacion del parametro -i con la orden grep proporciona, de una sola vez, todas las combinaciones de mayusculas у minusculas que hay para esta secuencia en el texto analizado (pero las formas se mantienen diferenciadas).

Es posible producir listas сото las anteriores у sumar aquellos resultados que nos puedan interesar, pero existe una opcion mucho mas adecuada para aquellas investigaciones en las que la diferencia entre mayusculas у minusculas no tenga interes о simplemente menos rele- vancia que la que diferencia entre ambas cajas. Se trata, claro esta, de marcar la fusion entre mayusculas у minusculas en el paso de uniq. Por tanto, ademas de lo realizado anteriormente о en su lugar, podemos hacer lo siguiente:

sort lista_Ql_bis.txt | uniq -ci | sort -nr > lista_Ql_quat.txt

La comprobacion posterior muestra que los casos de senor (352) у Senor 47 estan ahora inte- grados en los 399 que hemos obtenido ahora para esta secuencia:

grep senor lista_Ql_quat.txt 399 senor 229 senora 54 senores 21 senoras 4 senoria 2 senorio 2 senorias

1 senorios 1 senoril 1 senoreaba 1 senorea

Las busquedas con grep admiten muchas otras posibilidades, pero vamos a limitarnos a anadir solo una mas a las ya expuestas en los paragrafos precedentes: el llamado operador de disyuncion. Como indica su nombre, se trata simplemente de la opcion de indicar a grep que debe hacer la busqueda no ya sobre una secuencia, sino sobre dos о mas. Asf, volviendo sobre alguno de los casos examinados previamente, podemos recuperar en una orden linica los casos de superlativo sintetico en masculino у femenino. La forma de hacerlo es, simple- mente, situar la barra | entre las opciones44

grep -E "1simo|isima" lista_Ql_quat.txt 15 grandisimo 8 grandisima 6 hermosisima 5 felicisimo 4 felicisima 3 finisimo [• • •]

о bien saber simplemente cuantas palabras distintas contienen alguna de estas dos secuencias:

grep -Ec "isimo|isima" lista_Ql_quat.txt 73

Notese que la orden grep se formula ahora con una opcion -E, no utilizada hasta el momento. Es el modo de indicar a esta aplicacion que debe entender que la instruccion que se le pasa contiene (o puede contener) expresiones regulares, que es el tema del que nos vamos a ocupar en el apartado siguiente. A partir de ahora utilizare siempre esta opcion, que funciona perfectamente aunque no esten implicadas expresiones regulares.

Por supuesto, las secuencias unidas en expresiones de este tipo pueden ser totalmente distintas, сото sucede en:

grep -E "dulce|amargo|amarga" lista_Ql_quat.txt 14 dulce 4 amarga 2 amargamente 1 dulces 1 amargo

La recuperacion de todas las lineas que cumplen una determinada condicion puede pro- ducir un numero enorme de ejemplos у, сото consecuencia de ello, hacer muy dificil о incluso imposible la investigacion. Esa es la razon de que algunas aplicaciones de consulta incorporen la posibilidad de devolver una muestra aleatoria de los casos que responden a lo deseado. Conseguir algo similar en un fichero propio requiere la utilizacion de un lenguaje de programacion que queda fuera de los objetivos de este capftulo. Sin embargo, si es posi- ble lograr algo muy parecido con la orden sed, que ya hemos analizado. Por ejemplo, para obtener una de cada cinco lfneas de uno de los ficheros del CREA puede utilizarse la orden:

sed -n 'l~5p' crea_1000.txt

El parametro -n impide la impresion de las lfneas (que es lo que, por defecto, hace siempre sed). La expresion situada entre comillas simples indica que se seleccione una lfnea de cada cinco (~5)45 a partir de la lfnea numero 1 у se imprima (p). La numeracion de las ultimas devueltas muestra que se ha obtenido lo deseado:

  • 970 blanca 14061 92,16
  • 975 hicieron 13913 91,19
  • 980 conseguir 13871 90,92
  • 985 hospital 13823 90,6
  • 990 torno 13781 90,33
  • 995 explico 13751 90,13
  • 1000 tercera 13694 89,76

Practices

i,Cuantas formas distintas hay en la primera parte del Quijotel Si utiliza wc para obtener ese dato, note que las dos primeras cifras (numero de lineas у numero de palabras) no estan en la relacion 1:2 esperable, puesto que cada lfnea consta de dos palabras. ^Cual es la razon de ello?

i,Cuantas formas distintas hay en la segunda parte del Quijotel Reordene las listas de frecuencia de cada una de las dos partes del Quijote para darles una organizacion alfabetica.

Las ordenes grep -E "isimoIisima"уgrep -E "isimo I isima" sobre el texto del Quijote dan resultados diferentes. i,Por que?

 
<<   CONTENTS   >>

Related topics