Nonsense

Análisis de texto - Estadísticas

Clasificación

Es un problema fácil, indicado específicamente para principiantes. Otros pueden encontrarlo un ejercicio algo aburrido.

Ojo, aunque el ejercicio es sencillo, puede resultar también amplio. Es mayormente mecánico y la única diferencia entre hacer 2 cálculos o hacer 4 está en la organización del código, pero no en su complejidad.

Enunciado

Tenemos un sitio de noticias y comentarios de temas de actualidad en el que una serie de redactores publican sus artículos. Recientemente hemos decidido que, para ayudar a los redactores a mejorar en alguna forma la calidad de los textos, vamos a crear un módulo de análisis y estadísticas de texto. Nada sofisticado, eso sí. Por ahora nos limitaremos a calcular una serie de datos sobre el texto recibido.

Podemos plantear la interfaz de varios modos, el más sencillo seguramente sería una interfaz en forma de función como…

    func analize(text: String) {
        ...
        return { ... };
    }

Es decir, recibimos un texto y devolvemos un objeto con los resultados de los cálculos (que ahora veremos) convenientemente ordenados.

Otra opción puede ser la de una clase a la que pasemos el texto en el constructor y nos ofrezca una serie de métodos para obtener cada resultado.

    class TextAnalizer {
        constructor(text: String) { ... }
        // ... otros métodos para cada cálculo o grupo de cálculos
    }

Ofrezco ambas opciones, aunque prefiero la primera. En cualquier caso, veamos los cálculos que hay que realizar:

Contadores Básicos
  • Número de palabras, número de frases y número de párrafos del texto. (*)
  • Número total de caracteres en el texto, y número total de caracteres en el texto sin contar espacios en blanco, tabuladores o saltos de línea.
Estadísticas Básicas
  • Longitud media de las palabras medida en caracteres. (*)
  • Longitud media de las frases, medida en caracteres y en palabras. (*)
  • Longitud media de los párrafos, medida en caracteres, en palabras y en frases. (*)
  • Longitud de la palabra más larga en número caracteres, de la frase más larga en número de palabras y del párrafo más largo en número de palabras. (*)
Análisis avanzado
  • Número de palabras únicas en el texto (i.e. sin contar repeticiones)
  • 10 palabras más frecuentemente repetidas en el texto, con el número de ocurrencias de cada una (*)
  • Uno o más índices de legibilidad. Sugiero el índice Coleman-Liau, que es sencillo y como ejercicio vale.

Con estos yo creo que hay suficiente para que el ejercicio tenga un poco de gracia, pero tampoco es imprescindible hacerlos todos.

Opciones

Es interesante poder pasar a la función / constructor un segundo parámetro, opcional, en el que indiquemos un número. Este número indicará que las palabras por debajo de esa longitud se descartan del análisis en los cálculos que he marcado arriba con (*). Es decir, si llamamos con analize(text, 3) no se tendrán en cuenta las palabras de 3 o menos caracteres para los cálculos marcados. (Sólo se tendrán en cuenta para los totales de caracteres, con y sin espacios en blanco, y para el índice Coleman-Liau)

Teniendo en cuenta esto, podríamos tener un interfaz, para el caso de la función, con esta pinta:

    function analize(text, minWordLength) {
        ...
        return {
            basics: {
                characters: ...,
                charactersNoWS: ...,
                words: ...,
                sentences: ...,
                paragraphs: ...
            },
            stats: {
                wordAverage: ...,
                sentenceAverage: {
                    chars: ...,
                    words: ...
                },
                paragraphAverage: {
                    chars: ...,
                    words: ...,
                    sentences: ...
                },
                longest: {
                    word: ...,
                    sentence: ...,
                    paragraph: ...
                }
            },
            advanced: {
                uniqueWords: ...,
                mostRepeatedWords: [
                    { word: ..., occurrences: ... },
                    { word: ..., occurrences: ... },
                    { word: ..., occurrences: ... },
                    // ... hasta 10
                ],
                colemanLiauIndex: ...
            }
        };
    }

Sugerencias

Insisto en que no es necesario resolver todo el ejercicio. El enunciado plantea un buen número de cálculos diferentes, y aunque es bueno hacerlo entero, si te aburres puedes resolver sólo unos cuántos de los cálculos y enviar tu solución así.

Por otra parte, piensa que un texto puede ser relativamente largo, de modo que realizar cada uno de los cálculos completamente por separado, seguramente llevará a repetir muchas acciones y a un rendimiento pobre. Busca alguna manera de realizar varios cálculos simultáneamente o busca algún procesamiento parcial que se repita y encuentra el modo de que sólo se haga una vez.

Incluye algún test, por favor :)

Pruebas

Al ser un ejercicio orientado especialmente a principiantes, ten en cuenta que revisaré tu solución fijándome con más atención en detalles generales como usar una buena nomenclatura, presentar un código limpio, ordenado y claro, e incluir unos tests razonables.

Se puede coger casi cualquier texto como ejemplo. En el proyecto Gutenberg hay disponibles muchos libros en formato plano, como por ejemplo El Quijote. Podemos usar algún fragmento de algún libro, o podemos coger cualquier artículo que encontremos por ahí que nos apetezca.

Soluciones

Envíame tu solución si quieres que la revise o que te ayude con ella. Las que reciba las pondremos aquí: Estadísticas de Texto.