Cuantas palabras tienen tus posts

Hoy estaba pensando en esto ¿como cuernos cuento las palabras en mis posts? es que nunca me puse a hacerlo y de pronto me di cuenta que en MySQL no hay funciones para esto ¡hay que googlear! ya mismo, pásenme la googlera.

Así fue que encontré una forma, pero resulta que no sólo tengo que contar palabras si no que tengo que, primero, sacarle todo el HTML que yo le agrego a mis posts.

Así es, en el viejo y querido PostRev el código se agrega a mano lo que complica identificar una palabra y los números no me daban, así que a crear dos funciones, wordcount y strip_tags.

La cuestión también está en que una base de datos no es precisamente para hacer cuentas, esas debería hacerlas aparte, pero salvo que sean sumatorias estas eran cosas para hacer aparte. ¿como hacerlo y seguir dentro de MySQL? creando funciones y utlizándolas en la consulta.

Es un poco intensivo y recomiendo hacerlo solamente con una copia local de la base de datos, así si tienen que esperar no bloquean el blog durante un rato.

A continuación se las comento



Contar Palabras



Primero que nada, a contar palabras. Estamos ingresando un texto y tiene que devolvernos un entero con la cantidad de palabras:

DELIMITER $$
CREATE FUNCTION wordcount(str TEXT)
       RETURNS INT
       DETERMINISTIC
       SQL SECURITY INVOKER
       NO SQL
  BEGIN
    DECLARE wordCnt, idx, maxIdx INT DEFAULT 0;
    DECLARE currChar, prevChar BOOL DEFAULT 0;
    SET maxIdx=char_length(str);
    WHILE idx < maxIdx DO
        SET currChar=SUBSTRING(str, idx, 1) RLIKE '[[:alnum:]]';
        IF NOT prevChar AND currChar THEN
            SET wordCnt=wordCnt+1;
        END IF;
        SET prevChar=currChar;
        SET idx=idx+1;
    END WHILE;
    RETURN wordCnt;
  END
$$
DELIMITER ;


Borrar tags HTML



Lo segundo y no menos importante, hay que sacarle toda la basura, bah, esto se hace antes de contar las plabras pero lo armé después porque no me daban los números ¡Estaba todo lleno de HTML! y si, lo cuenta como más palabras... borremoslo más o menos así:

DELIMITER $$

CREATE FUNCTION strip_tags( x longtext) 
	RETURNS longtext
	LANGUAGE SQL 
	NOT DETERMINISTIC 
	READS SQL DATA
BEGIN
	DECLARE sstart INT UNSIGNED;
	DECLARE ends INT UNSIGNED;
	SET sstart = LOCATE('<', x, 1);
	REPEAT
	SET ends = LOCATE('>', x, sstart);
	SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ;
	SET sstart = LOCATE('<', x, 1);
	UNTIL sstart < 1 END REPEAT;
	return x;
END
$$
DELIMITER ;


La consulta



En el caso del postrev tengo dos campos a consultar, hometext y bodytext, uno para el texto de portada, el otro el resto de la nota (es mi diseño, no es tan malo como parece :P)

Básicamente tomo el campo, lo paso por strip_tags y luego por wordcount, esto lo filtro por año y estado para tomar datos reales.

SELECT id_noticia, 
(wordcount(strip_tags(hometext)) + wordcount(strip_tags(bodytext))) AS palabras 
FROM posts 
WHERE estado = 1 AND year(time) = 2011
ORDER BY 2 DESC


Para Wordpress es básicamente igual cambiando algunos campos:

SELECT ID, 
(wordcount(strip_tags(post_content))) AS palabras 
FROM wp_posts 
WHERE post_status = 'publish' AND year(post_date) = 2011
ORDER BY 2 DESC


y listo!

Armado con funciones de aquí y aquí

Otros posts que podrían llegar a gustarte...

Comentarios

  • Jose    

    Y cuanto dió la ejecución de la Query?? Te faltó el final de la historia! :P

    • Responder
    • Citar
    • Comentado:
  • Marvin    

    Todo muy lindo, pero y el resultado............?

    • Responder
    • Citar
    • Comentado:
  • nnnnnnnnnnneeeeerrrrrrrrrrrrdddddddddddddd :D

    • Responder
    • Citar
    • Comentado:
  • blklaucha    

    Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D

    • Responder
    • Citar
    • Comentado:
  • Gonzalo    

    Este es el tipo de cosas que convendría calcular solamente a la hora de editar o agregar un post (seguramente conviene hacerlo desde php, con str_word_count) y después guardar el valor en la misma tabla.

    Recalcularlo a la hora de ordenar los posts por cantidad de palabras seguro tarda demasiado :P

    • Responder
    • Citar
    • Comentado:
  • blklaucha dijo:

    Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D


    Y cuando queres hacer un ranking de los posts con mas palabras de tu blog? Ratapashhh.. ahi tenes uno de los motores de la era informatica XD

    • Responder
    • Citar
    • Comentado:
  • Tomich    

    Para wordpress hay un plugin, es un archivo php unico cortito de un par de lineas.. vale la pena mirarlo

    http://wordpress.org/extend/plugins/post-word-count/installation/

    • Responder
    • Citar
    • Comentado:
  • Fabio    

    blklaucha dijo:

    Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D


    4600 posts, 50 posts por mes este año ¿word?


    Gonzalo dijo:
    Este es el tipo de cosas que convendría calcular solamente a la hora de editar o agregar un post (seguramente conviene hacerlo desde php, con str_word_count) y después guardar el valor en la misma tabla.

    Recalcularlo a la hora de ordenar los posts por cantidad de palabras seguro tarda demasiado :P


    totalmente, por eso recomiendo hacerlo con una base offline para evitar problemas en el server

    • Responder
    • Citar
    • Comentado:
  • blklaucha    

    Fabio dijo:

    blklaucha dijo:
    Yo con SQL y MySQL soy un negado que nunca aprendi aun cuando en mi laburo se utiliza (de forma muy basica), pero no sirve copiar el post a un word y utilizar el contador de palabras?:D:D


    4600 posts, 50 posts por mes este año ¿word?

    Eso es tu culpa por escribir tanto y nuestra por leerte tanto

    • Responder
    • Citar
    • Comentado:
  • Jeremías    

    Grox!. Jamás se me hubiera ocurrido!.

    • Responder
    • Citar
    • Comentado:
  • Jesus    

    mirá este plugin

    http://blog.peterfisher.me.uk/code/wordcounter/wordcounter-jquery-plugin/

    • Responder
    • Citar
    • Comentado:

Deje su comentario:

Tranquilo, su email nunca será revelado.
La gente de bien tiene URL, no se olvide del http/https
Para evitar bots, si se tardó mucho en leer la nota seguramente no sirva y tenga que intentar dos veces

Negrita Cursiva Imagen Enlace


comentarios ofensivos o que no hagan al enriquecimiento del post serán borrados/editados por el administrador