¿Qué hace esa caja ahí y para qué sirve?
Brevemente: Después de que escribas un texto, o lo pegues, y le des al botón enviar sabrás cuántas palabras totales has utilizado y de ellas cuántas son únicas. Es decir, sabrás, en términos numéricos, qué vocabulario has usado. Funciona con textos largos. Yo lo he probado con esta versión del Quijote y ha ido bien. Por cierto, el Quijote (la primera parte, en la versión utilizada para el experimento) tiene 187043 palabras, de las cuales son únicas 14508. Vamos, que Cervantes, por si a alguien le quedaba algún tipo de dudas, se manejaba con un vocabulario amplio. Ojo, no nos queramos comparar con Cervantes. Jugaba con ventajas. En su época no había televisión ni periódicos (o como mínimo no había televisión, pues de lo segundo no estoy del todo seguro). Es decir, que si uno quería mirar el mundo con mirada amplia tenía que proveerse de una buena cantidad de conceptos (valga decir palabras). (Ahora demasiada gente se conforma con las ilusiones que genera la televisión.) Pues de todos es sabido que nuestra mirada sobre el mundo se comporta como una cámara fotográfica, cuantos más píxeles, mejor resolución, esto es, cuantas más palabras más fina es nuestra mirada, más detalle somos capaces de apreciar. Pero ojo que la ecuación no es excluyente. La calidad de la óptica es importante. De todos modos no hay que obsesionarse con el vocabulario. Siguiendo con las metáforas fotográficas, vale más una buena sintaxis que mil palabras.
Espero que haya quedado claro qué hace ahí esa caja. Ahora, si quieres, pruébala.
Esta caja la podemos considerar un regalo de reyes. El mío es el negro. (Un regalo que quiero compartir aquí.)
Su Majestad Baltasar escuchando atenta y pacientemente al infante que yo tenía delente
Lo explico. La noche de reyes estaba nervioso (la intriga, la espera del nuevo amanecer, haber visto a sus majestades a escasos metros de distancia, que qué habrá hecho ese hombre para merecerse tamaño honor, hablo del alcalde, que cada año disfruta del privilegio de poder estrecharles la mano a los tres, y de darse un baño de multitudes cómodamente instalado en un coche descapotable junto a su majestad Melchor, que es quien abre la comitiva…) nervioso, digo, y me puse a leer un libro malísimo del que daré debida cuenta aquí, pero, la noche en cuestión, esa zona oscura de mi personalidad no estaba de humor y cambié el libro por el portátil (el más portátil de mis portátiles) y navegando navegando fui a dar con un artículo de Sergio Parra, que puede leerse pinchando aquí, en el que explica un curioso experimento para conocer el vocabulario de cada quien. (Cada quien conocer su propio vocabulario, y sólo el suyo.)
La cosa tiene que ver con el diccionario, y me pareció cansado. A diferencia de Sergio Parra, que confiesa un amor devoto hacia esos libros, yo prácticamente ya no los uso; el de la real ni de coña, pues las palabras que te hacen pensar en un diccionario no aparecen en él ni por asomo, y el de María Moliner, que fue durante años mi diccionario de cabecera, empieza a quedarme muy alto allá en el espacio que ocupa en su estantería, de modo que cuando me surgen dudas sobre la definición de una palabra, pues me la invento, y punto, como diría quien yo me sé. En fin, que el experimento, digo, tiene que ver con el diccionario. Se trata de abrir el tocho aleatoriamente cien veces, mirar la primera palabra en cada una de las ocasiones y ver si conocemos la definición. Tomas nota y después aplicas ecuaciones estadísticas. Cansado además de que se tiene que utilizar estadística, lo que convierte el resultado en demasiado interpretable, o subjetivo.
Se me ocurrió entonces que lo más fácil, riguroso y exacto sería enumerarlas, vamos, contarlas. Esto es, idear un experimento algebraico en vez de estadístico. Que cada cual (que cada cual interesado en conocer el alcance de su vocabulario) empezara a recitar, digamos que por orden alfabético, las palabras que conoce e ir contándolas a medida. Por supuesto, ésa sería una tarea todavía más cansada además de que se debería confiar en la memoria (pues a veces uno sabe una palabra y no se acuerda en el preciso instante, y es cuando se suele decir que la tienes ahí, en la punta de la lengua); total, un poco inviable.
Pero si en vez de recitarlas, las escribes, tomándote el tiempo que necesites y en el orden que te apetezca, sin ni siquiera preocuparte de si repites alguna (ordenándolas incluso de tal modo que te salga un relato, un artículo o una novela, un poema también valdría) y luego las cuentas (restando las repeticiones), pues ahí tienes un método riguroso y preciso si no de saber cuántas palabras conoces sí al menos de saber cuántas has escrito. Y contar todos sabemos, o deberíamos saber (menos los políticos, que en su inmensa mayoría, por no saber, no saben ni hacer la o con un canuto, y así les salen las sumas, que más que sumar, restan).
Y entonces pensé en alguna clase de programa y me puse a googlear para ver si daba con él. Y no lo hallé, aunque he de reconocer que tampoco mi búsqueda fue demasiado exhaustiva, ya que, si de verdad quieres dar con algo en Internet, al final acabas encontrándolo. Lo que ocurrió es que en seguida me entró el gusanillo de hacérmelo yo mismo. Y aquí es donde tengo que confesar uno de mis hobbies, que también valdría decir “entretenimiento” o “actividad de recreo”.
Me gusta programar. Los lenguajes formales aplicados, esto es, los lenguajes de programación (los formales a secas serían los lógicos, como el de proposiciones o el de primer orden, o el de lógica difusa) tienen una gracia que no tienen los lenguajes naturales (este mismo que estoy utilizando ahora para escribir este post) y que para mí los convierten en una especie de oasis, en una suerte de remanso en aguas turbulentas. (Y ahora me ha venido a la cabeza, no sé por qué, una canción…)
Quien tenga la costumbre de escribir textos con intención digamos que literaria (también valdrían divulgativos) habrá experimentado esa especie de desazón que produce el texto terminado, o más que el texto la duda de si la forma que le hemos dado es la mejor, la más perfecta, la que con mayor precisión, armonía y arte representa aquello que queríamos decir.
Esto no ocurre con los lenguajes de programación. Si el programa funciona, es que lo hemos escrito bien. Sí, sí, ya se que un programa se puede escribir de más de una manera, y que también podemos buscar la elegancia del código. Pero si el programa funciona, ahí tienes tu recompensa, la prueba irrefutable de que aquello lo has escrito bien. Me estoy enrollando.
Y me puse manos a la obra, y la tarea ha resultado sumamente sencilla.
El script está hecho en Php (que es el lenguaje de programación más extendido para aplicaciones web) y básicamente sólo he tenido que utilizar funciones nativas del propio lenguaje.
La madre del cordero es str_word_count() que, como su nombre indica, cuenta las palabras que hay en una cadena de texto. Así que si a esa función le pasas como argumento un texto cualquiera te devuelve un número, siendo este número la cantidad de palabras contenidas en la cadena. (Pero no sólo las únicas sino todas.)
Pero la función no acaba ahí. Acepta dos argumentos opcionales. El primero puede ser un número comprendido entre 0 y 2. Si le añades el argumento “cero” tal que así: str_word_count(“esta es la cadena”,0) la función se comporta de idéntica manera a la ya explicada (y devolvería un 4 para el ejemplo que acabo de escribir), pero si el segundo argumento es “1” o “2” entonces la función te devuelve un array, que es asociativo en el segundo de los casos. Es decir, te devuelve un conjunto cuyos elementos son todas y cada una de las palabras que formaban la cadena, siendo un conjunto “pelado” con el 1 y diciéndote además qué posición ocupa cada palabra en la cadena con el 2. Para nuestro propósito nos servía el 1. (i.e. str_word_count(“esta es la cadena”,1) devolvería {esta, es, la, cadena})
Sin embargo, esa función está pensada por una mente sajona, de modo que se hace necesario un apaño para los caracteres que podrían considerarse raros. Y la función, qué lujo, lo contempla. Así que como tercer argumento se le puede pasar una cadena de caracteres raros tales como “ñ”, “ç”, “á” o “à”. El propósito es que la función cuando se ponga a correr reconozca esos caracteres y no parta palabras indevidamente, es decir, str_word_count(“apaño”,1,”ñ”) devuelve {apaño} mientras que str_word_count(“apaño”,1) devuelve {apa, o}, lo que no sería correcto.
Total que la función nos coge el Quijote y nos lo convierte en un conjunto de 187043 palabras. Ahora sólo falta saber cuáles de ellas son únicas.
Pero no me alargo más, dejo aquí el código brevemente comentado, por si alguien quiere implementar este gadget en su página.
<?php
if ($_POST['texto']) { //si han pasado texto...
$str=$_POST['texto']; //“meto” el texto recibido en $str
$str=str_replace(array('¡',"'",'¿','-'), "", $str); //elimino caracteres molestos
$str=strtolower($str); //todo minúsculas, para que “La” y “la” sean la misma palabra
$array=(str_word_count($str, 1, 'àèìòùáéíóúïüç·ñ')); //la madre del cordero, el conjunto de palabras
$num=count($array); //las contamos
echo "<p>Tu texto tiene " . $num . " palabras</p>"; //en pantalla el resultado
$array_unique=array_unique ($array); //el subconjunto con las palabras únicas
$num=count($array_unique); //y las contamos
echo "<p>De las cuales son únicas: " . $num . "</p>"; //y lo saco en pantalla
echo "<p><a href='http://localhost/juannegro/2011/01/palabras-unicas-en-un-texto-con-php/'>Volver al post</a></p>";
}
else {
echo "<p>Oh, has enviado la caja vacía. Pega algo de texto, o escríbelo. Puedes copiar y pegar hasta un Quijote.</p>";
echo "<p><a href='http://localhost/juannegro/2011/01/palabras-unicas-en-un-texto-con-php/'>Volver al post</a></p>";
}
?>
Como se ve, el código utilizado no es nada complicado.
Y, por cierto, en modo alguno la caja es maliciosa. Vamos, que los textos enviados no se guardan en base de datos alguna, lo que, ciertamente, podría hacerse de la manera más sencilla.
Escrito por Juan Negro. Publicado el 17 de enero de 2011 en Libros, Miscelánea. Etiquetas Php, Regalo, Reyes Magos. 12 comentarios. Síguelos en RSS.
Compartelo en Facebook Digg del.icio.us Bitacoras.com email
12 comentarios
Me has dejado alucinado, Juan. Impresionante
Bueno, bueno, no creo que haya para tanto.
Gracias Daniel
Wow, esta caja ha sido una verdadera revelación, y no, no deberíamos compararnos con Cervantes, porque menuda desilusión entonces
Espero que mi cupo de palabras sea no del todo decepcionante la verdad
Me gusto leerte Juan
Una curiosidad, diría yo. Gracías por leerme.
Me has dejado pasmada.
He probado el invento y está genial. Gracias por compartirlo.
Un abrazo.
Gracias Felisa, eres muy amable.
Hola Juan Negro:
Enhorabuena por este nuevo post. Soy un lector asiduo del blog y una vez más me sorprende por la energía e ingenio que muestran tus escritos; son entretenidos y se agradece que uno lo pase bien leyéndolos. Y tras este balsámico masaje, una pequeña reflexión:
¿No es el lenguaje oral y escrito una herramienta, un artificio no natural construido al uso y disfrute del ser humano?
Pues gracias por venir leyendo el blog y gracias por el masaje (que siempre viene bien, y uno hace lo que puede). Po cierto, crls, ¿has pensado en ponerle una “a” y una “o” a tu nombre? Quedaría tal que así “carlos” y sería algo más fácil de leer. En cuanto a lo que dices de que el lenguaje oral y escrito sea una herramienta, pues sí, completamente de acuerdo, es una herramienta que usamos a diario y que justo es para eso, para usarla (y aquí piénsese en el segundo Wittgenstein), que sea un artificio no natural, uff, aquí habría tela que cortar y fijo que para no salir de una discusión semántica, o sobre los usos de las palabras. Yo cuando hablo de lenguaje natural refiriéndome a éste que estoy utilizando ahora simplemente lo hago para diferenciarlo de los lenguajes formales.
Iouyeah!
Juan menudo regalo!
Se nota que eres bueno y generoso y los reyes te dejan ingenio y saber hacer.
Aún no había leido este post; no he probado la caja… pero lo anoto. La tendré en mente por si la necesito.
hasta pronto
Juan ,como los demas estoy sorprendido y mucho mas despues de ver los resultados instantaneos que muestra tu invento. Por ejemplo he puesto un cuento mio para probar y este es el resultado.2710 -894 ¿Quiere eso decir que he utilizado 2710 palabras en total? o sea ¿estan incluidas las intergenciones , los artícuos etc?
He querido decir Interjecciones
¡Ah! y artículos