Vamos a escribir un conjunto de herramientas de línea de comandos simples para mostrar estadísticas básicas sobre un archivo de texto o un conjunto de archivos de texto. Algunas estadísticas básicas incluyen ...
También trabajaremos para agregar la capacidad de ...
Aquí hay una captura de pantalla de un programa que descarga todo el texto de Moby Dick de Project Gutenberg e imprime un histograma de las frecuencias de letras.
Resulta que la letra "T" representa el 9.25% de todas las letras en Moby Dick.
Para comenzar, tendrás que ...
npm install para instalar los paquetes requeridos.textalyze.js es el código fuente para este proyectosample_data es un directorio que contiene archivos de texto de muestra para analizar, principalmente de Project Gutenberg. El archivo textalyze.js que viene con este repositorio está lleno de comentarios diseñados para ayudarlo a comenzar. Debe sentirse libre de eliminarlos para que el programa sea más fácil de leer.
Sin embargo, piense en las preguntas que necesitaría para poder responder para que funcione:
Estas preguntas ejecutan desde la gama de Ruby Nitty-Brity hasta la experiencia del usuario, al tiempo que nos inician en el camino de sentirnos cómodos con la forma en que funciona la web.
Para solicitar comentarios sobre su código, use el proceso de flujo de GitHub estándar.
Este proyecto está estructurado como una secuencia de iteraciones, cada una de las cuales se basa en iteraciones anteriores. Las iteraciones cumplen tres roles importantes:
Utilizando ejemplos codificados, escriba una función que tome una Array que contiene elementos arbitrarios y posiblemente duplicados como entrada y devuelve un Object que contiene pares de elementos/recuentos. Hemos escrito algunos
Esta iteración tiene pruebas escritas para usted. Correr
npm test Para ver las pruebas de falla. ¡Recuerde ejecutar npm install primero!
Es decir, si la entrada tiene 100 entradas y 20 de ellas son la letra "A", entonces Object resultante debe contener
{ 'a' : 20 } "Sensible" depende de usted definir, pero aquí hay un formato sugerido, fingiendo que codificamos la entrada como ["a", "a", "a", "b", "b", "c"] .
user@host project-js-textalyze $ node textalyze.js
The counts for ["a", "a", "a", "b", "b", "c"] are...
a 3
b 2
c 1
user@host project-js-textalyze $
Utilizando ejemplos codificados, escriba una función que toma una String arbitraria como entrada y devuelve una Array de todos los caracteres en la cadena, incluidos los espacios y la puntuación.
Alimente esto en la función de conteo de matriz de la iteración anterior para obtener un Object que contenga pares de letras/recuentos. Imprima esos pares de manera sensata.
Cree un archivo lib/sanitize.js y defina una función llamada sanitize adentro. Como en lib/itemCounts.js , la última línea debería ser
module . exports = sanitize La función sanitize debe tomar una String arbitraria, que tal vez contenga espacios, puntuación, saltos de línea, etc., y devolver una cadena "desinfectada" que reemplaza todas las letras de los casos superiores con su equivalente en el caso inferior. Esto asegurará que las letras 'A' y 'a' no se traten como dos letras distintas cuando analicemos nuestro texto. Manejaremos la puntuación y otros bits en una iteración posterior.
Debería funcionar así
sanitize ( 'This is a sentence.' ) // => 'this is a sentence.'
sanitize ( 'WHY AM I YELLING?' ) // => 'why am i yelling?'
sanitize ( 'HEY: ThIs Is hArD tO rEaD!' ) // => 'hey: this is hard to read!'Por suerte para nosotros, JavaScript viene con una función incorporada para ayudarnos: string.prototype.tolowercase.
Integre esta función en el programa actual para que el Object de resultados contenga, por ejemplo,
{ 'a' : 25 }en lugar de
{ 'a' : 19 , 'A' : 6 } A menudo, los datos que queremos no están en un formato que facilite la analización. El proceso de tomar datos mal formados y transformarlos en algo que podemos usar se llama desinfectación de nuestros datos.
Lo que cuenta como "desinfectación" varía según los datos subyacentes y nuestras necesidades. Por ejemplo, si quisiéramos mirar todo el texto en un documento HTML, no querríamos contar todas las etiquetas HTML. Por el contrario, si quisiéramos un informe sobre las etiquetas más utilizadas en un documento HTML, queremos mantener las etiquetas pero eliminar el texto.
En nuestro caso, hemos diseñado nuestro programa de manera que trata las letras de los casos superiores y las letras inferiores como letras distintas, es decir, nuestro Object de resultados podría contener
{ 'a' : 20 , 'A' : 5 }Pero probablemente preferiríamos que contengan
{ 'a' : 25 }Del mismo modo, probablemente no nos importe la puntuación (períodos, comas, guiones, colons, etc.), aunque esto es más difícil de manejar que las diferencias entre las letras superiores y inferiores.
El repositorio base contiene un directorio llamado sample_data que contiene un puñado de archivos de texto. Codifique el nombre de uno de estos archivos en su programa y lea el contenido de ese archivo en una cadena. Pase esa cadena a su programa actual, para que ahora imprima las estadísticas de conteo de letras para ese archivo específico en lugar de las cadenas codificadas que tenía en la iteración anterior.
Para leer el contenido de un archivo en una cadena, consulte fs.Readfile y fs.ReadFileSync.
No queremos editar nuestro código JavaScript cada vez que necesitamos cambiar el archivo del que estamos leyendo datos. Cambiémonos para que el usuario que ejecute el programa pueda pasar en el nombre del archivo desde el cual leer. Lo haremos usando argumentos de línea de comando.
Esta iteración marca V1.0 de nuestro programa. Tal como está, nuestro programa, aunque limitado, es lo suficientemente autónomo como para que pueda dárselo a otra persona y podría usarlo como pretendía sin tener que saber cómo editar el código JavaScript.
¡Felicitaciones!
Considere el siguiente comando Ejecutar desde el terminal:
node some-program.js first_argument second_argument banana
Los argumentos de la línea de comando son first_argument , second_argument y banana , con un espacio que denota la separación entre cada argumento. first_argument es el primer argumento de línea de comando y banana es el tercer argumento de línea de comando.
Utilizando ejemplos codificados, escriba una función que tome una Array que contiene entradas arbitrarias y posiblemente duplicadas como entrada y devuelve un Object que contiene elementos/pares de frecuencia. Imprima esos pares de manera sensata.
Es decir, si la entrada tiene 100 entradas y 20 de la letra son "A", entonces Object devuelto debería tener
{ 'a' : 0.20 } Ya ha escrito una función que toma una Array y devuelve un Object que contiene pares de entrada/recuento y necesitará estos recuentos (de una forma u otra) para calcular la frecuencia general. Si desea estirarse, intente escribir su función de "estadísticas de frecuencia" de una manera que utilice su función de "estadísticas de conteo", para que no tenga que duplicar tanto código o trabajar en su programa.
Este es un "enfoque estirado", lo que significa que no es absolutamente necesario que escriba su programa de esta manera. Como hemos estado diciendo, es mucho mejor escribir algo y recibir comentarios sobre ello que atascarse mientras intenta desconcertarse un enfoque "mejor", "más rápido", "más elegante", etc.
Imprima un histograma de frecuencias de letras que se parece a lo siguiente:
El objetivo es producir una salida útil y bien diseñada. No tiene que parecer idéntico a la salida anterior.
Sugerencia: puede usar la frecuencia para cada elemento como una forma de escalar la longitud del histograma.
Aquí hay algunas características adicionales que puede agregar:
Instale y use el módulo de solicitud para agregar soporte para pasar URL y nombres de archivos. Por ejemplo, en lugar de tener que descargar primero Moby Dick , podrías ejecutar
node textalyze.js http://www.gutenberg.org/cache/epub/2701/pg2701.txt Agregue soporte para mostrar las 5 (o N ) palabras más comunes en lugar de solo frecuencias de letras.
Agregue soporte para exportar los datos en un formato que puede cargar en Excel, como un archivo CSV. Puede instalar y usar el módulo CSV-escritor para hacer esto.
Encuentre textos de múltiples idiomas y compare la frecuencia de la letra entre idiomas. La frecuencia de las letras de un idioma actúa como una especie de huella digital, y te sorprendió el poco texto que se necesita para identificar un idioma una vez que conoces las frecuencias de las letras.
Use una biblioteca de gráficos como cualquier CarryCart para exportar un histograma gráfico.
Para instalar un módulo, ejecute el siguiente comando (reemplazar nameOfModule con el nombre del módulo deseado):
npm install --save nameOfModule Esto actualizará package.json y agregará el módulo como dependencia. Lea la documentación de cada módulo para ver cómo require y usarla.