Nous allons écrire un ensemble d'outils de ligne de commande simples pour afficher des statistiques de base sur un fichier texte ou un ensemble de fichiers texte. Certaines statistiques de base incluent ...
Nous travaillerons également à ajouter la possibilité de ...
Voici une capture d'écran d'un programme qui télécharge l' intégralité du texte de Moby Dick de Project Gutenberg et imprime un histogramme des fréquences de lettres.
Il s'avère que la lettre "t" représente 9,25% de toutes les lettres de Moby Dick.
Pour commencer, vous devrez ...
npm install pour installer les packages requis.textalyze.js est le code source de ce projetsample_data est un répertoire contenant des exemples de fichiers texte à analyser, principalement à partir du projet Gutenberg. Le fichier textalyze.js fourni avec ce référentiel est rempli de commentaires conçus pour vous aider à démarrer. Vous devez vous sentir libre de les supprimer afin de rendre le programme plus facile à lire.
Réfléchissez aux questions auxquelles vous auriez besoin pour pouvoir répondre afin de le faire fonctionner, cependant:
Ces questions passent toute la gamme de Nitty-Gritty Ruby à l'expérience utilisateur, tout en nous commençant à nous mettre à l'aise avec le fonctionnement du Web.
Pour demander des commentaires sur votre code, utilisez le processus de flux GitHub standard.
Ce projet est structuré comme une séquence d'itérations, chacune s'appuyant sur les itérations précédentes. Les itérations jouent trois rôles importants:
À l'aide d'exemples à code dur, écrivez une fonction qui prend un Array contenant des éléments arbitraires et éventuellement dupliqués en entrée et renvoie un Object contenant des paires d'élément / comptage. Nous en avons écrit
Cette itération a des tests écrits pour vous. Courir
npm test pour voir les tests d'échec. N'oubliez pas d'exécuter npm install en premier!
Autrement dit, si l'entrée a 100 entrées et 20 d'entre elles sont la lettre "A" alors alors Object résultant doit contenir
{ 'a' : 20 } "Sensible" est à vous de définir, mais voici un format suggéré, prétendant que nous avons codé dur l'entrée comme ["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 $
À l'aide d'exemples à code dur, écrivez une fonction qui prend une String arbitraire en entrée et renvoie un Array de tous les caractères de la chaîne, y compris les espaces et la ponctuation.
Imaginez ceci dans la fonction de comptage du tableau de l'itération précédente pour obtenir un Object contenant des paires de lettres / comptes. Imprimez ces paires de manière raisonnable.
Créez un fichier lib/sanitize.js et définissez une fonction appelée sanitize à l'intérieur. Comme dans lib/itemCounts.js , la dernière ligne devrait être
module . exports = sanitize La fonction sanitize doit prendre une String arbitraire - peut-être contenant des espaces, la ponctuation, les pauses de ligne, etc. - et renvoyer une chaîne "désinfectée" qui remplace toutes les lettres de cas supérieur par leur équivalent de cas inférieur. Cela garantira que les lettres 'A' et 'a' ne sont pas traitées comme deux lettres distinctes lorsque nous analysons notre texte. Nous gérerons la ponctuation et d'autres bits dans une itération ultérieure.
Ça devrait fonctionner comme ça
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!'Heureusement pour nous, JavaScript est livré avec une fonction intégrée pour nous aider: string.prototype.tolowercase.
Intégrez cette fonction dans le programme actuel afin que l' Object de résultats contient, par exemple,
{ 'a' : 25 }au lieu de
{ 'a' : 19 , 'A' : 6 } Souvent, les données que nous voulons ne sont pas dans un format qui facilite l'analyse. Le processus de prise de données mal formulées et de la transformation en quelque chose que nous pouvons utiliser est appelé désinfecter nos données.
Ce qui compte comme «désinfecter» varie en fonction des données sous-jacentes et de nos besoins. Par exemple, si nous voulions regarder tout le texte dans un document HTML, nous ne voudrions pas compter toutes les balises HTML. Inversement, si nous voulions un rapport sur les balises les plus couramment utilisées dans un document HTML, nous voudrions conserver les balises mais supprimer le texte.
Dans Object cas, nous avons conçu notre programme de telle sorte qu'il traite
{ 'a' : 20 , 'A' : 5 }Mais nous préférons probablement qu'il contienne
{ 'a' : 25 }De même, nous ne nous soucions probablement pas de la ponctuation (périodes, virgules, traits de disposition, colons, etc.), bien que cela soit plus difficile à gérer que les différences entre les lettres supérieures et les cas inférieures.
Le référentiel de base contient un répertoire appelé sample_data qui contient une poignée de fichiers texte. Code dur le nom de l'un de ces fichiers dans votre programme et lisez le contenu de ce fichier dans une chaîne. Passez cette chaîne dans votre programme actuel, afin qu'il imprime désormais les statistiques de comptoir des lettres pour ce fichier spécifique au lieu des chaînes codées dures que vous aviez dans l'itération précédente.
Pour lire le contenu d'un fichier dans une chaîne, voir fs.readfile et fs.readfilesync.
Nous ne voulons pas modifier notre code JavaScript chaque fois que nous devons changer le fichier à partir duquel nous lisons des données. Changeons-le afin que l'utilisateur exécute le programme puisse passer au nom du fichier à partir de laquelle lire. Nous le ferons en utilisant des arguments de ligne de commande.
Cette itération marque le v1.0 de notre programme. En l'état, notre programme - bien que limité - est suffisamment autonome pour que vous puissiez le donner à une autre personne et ils pourraient l'utiliser comme vous l'aviez prévu sans avoir à savoir comment modifier le code JavaScript.
Bravo!
Considérez la commande suivante exécutée à partir du terminal:
node some-program.js first_argument second_argument banana
Les arguments de ligne de commande sont first_argument , second_argument et banana , avec un espace désignant la séparation entre chaque argument. first_argument est le premier argument de ligne de commande et banana est le troisième argument de ligne de commande.
À l'aide d'exemples à code dur, écrivez une fonction qui prend un Array contenant des entrées arbitraires et éventuellement dupliquées en entrée et renvoie un Object contenant des paires d'élément / fréquence. Imprimez ces paires de manière raisonnable.
Autrement dit, si l'entrée a 100 entrées et 20 de la lettre ARE "A" alors Object retourné devrait avoir
{ 'a' : 0.20 } Vous avez déjà écrit une fonction qui prend un Array et renvoie un Object contenant des paires d'entrée / comptage et vous aurez besoin de ces dénombrements (d'une manière ou d'une autre) afin de calculer la fréquence globale. Si vous voulez vous étirer, essayez d'écrire votre fonction "Statistiques de fréquence" d'une manière qui utilise votre fonction "de comptage des statistiques", afin que vous n'ayez pas à dupliquer autant de code ou de travailler dans votre programme.
Il s'agit d'une «approche extensible», ce qui signifie qu'il n'est absolument pas nécessaire pour vous d'écrire votre programme de cette façon. Comme nous l'avons dit, il vaut mieux écrire quelque chose et obtenir des commentaires à ce sujet que de rester coincé tout en essayant de supprimer une approche "meilleure", "plus rapide", "plus élégante", etc.
Imprimez un histogramme de fréquences de lettres qui ressemblent à ce qui suit:
L'objectif est de produire une sortie utile et bien conçue. Il n'a pas à paraître identique à la sortie ci-dessus.
Astuce: vous pouvez utiliser la fréquence pour chaque élément comme un moyen d'édiger la longueur de l'histogramme.
Voici quelques fonctionnalités supplémentaires que vous pourriez ajouter:
Installez et utilisez le module de demande pour ajouter la prise en charge du passage des URL ainsi que des noms de fichiers. Par exemple, plutôt que d'avoir à télécharger Moby Dick en premier, vous pouvez courir
node textalyze.js http://www.gutenberg.org/cache/epub/2701/pg2701.txt Ajoutez une prise en charge pour afficher les mots 5 (ou N ) les plus courants au lieu de simples fréquences de lettres.
Ajoutez une prise en charge pour l'exportation des données dans un format que vous pouvez charger dans Excel, comme un fichier CSV. Vous pouvez installer et utiliser le module CSV-Writer pour ce faire.
Trouvez des textes à partir de plusieurs langues et comparez la fréquence des lettres entre les langues. La fréquence des lettres d'une langue agit comme une sorte d'empreinte digitale, et vous aviez surpris le peu de texte qu'il faut pour identifier une langue une fois que vous connaissez les fréquences de lettre.
Utilisez une bibliothèque de cartographie comme AnyChart pour exporter un histogramme graphique.
Pour installer un module, exécutez la commande suivante (remplacement de nameOfModule par le nom du module souhaité):
npm install --save nameOfModule Cela mettra à jour package.json et ajoutera le module en tant que dépendance. Lisez la documentation de chaque module pour voir comment require et l'utiliser.