python dictionnaire

Identification

Infoforall

17 - Stocker et compter avec un dictionnaire


Ranger les données... Dans un tableau, c'est bien mais il faut un index pour atteindre une case.

Si on peut associer un index à chaque donnée de façon évidente, c'est correct.

Mais pour un dictionnaire par exemple (le livre, celui avec les mots), on fait comment ? On donne un numéro à chaque mot ?

Si on veut recenser les arbres et leurs positions dans un parc ?

Si on veut recenser les oeuvres et leurs positions dans une exposition ?

Si on veut connaitre le nombre de malades pour une maladie donnée par pays ?

Si on veut connaitre les mots les plus utilisés dans un discours politique ?


Bref, vous l'aurez compris : les tableaux, c'est bien, c'est rapide mais ça n'est qu'une structure de données parmi d'autres.

Aujourd'hui, nous allons donc voir le dictionnaire.

Logiciel nécessaire pour l'activité : Python 3 : Thonny, IDLE ...

Evaluation ✎ : questions 5-9-10-12-15-16.

Résumé : Version HTML ou fond blanc ou ou PDF (couleur ou gris)

1 - Création d'un dictionnaire

Prenons l'exemple d'un dictionnaire au sens usuel du terme, le dico, le livre plein de mots et de définitions. Je suis parti sur le site d'un éditeur bien connu de dictionnaire. Et je suis parti voir ce qu'on y disait de l'encodage. Voici la réponse :

Une définition : celle d'encodage

On retrouve donc bien le fait qu'il s'agit de transformer un contenu quelconque (image, vidéo, texte, ...) en une suite d'octets par exemple.

Autre façon de présenter les choses :

Clé (plutôt qu'index) Elément ou valeur associée à cette clé
"encodage" "Transcription de données d'un format dans un autre"
"cryptage" "Procédé de cryptographie grâce auquel on souhaite rendre la compréhension d'un document impossible à toute personne qui n'a pas la clé de (dé)chiffrement. On parle également de chiffrement."

Et voilà : un dictionnaire informatique peut donc être vu comme une sorte de tableau dont on accède aux éléments à l'aide d'une clé, plutôt qu'à l'aide d'un index numérique.

Comment mémoriser ces définitions avec Python ?

1 - Déclaration d'un dictionnaire en Python

Les éléments délimitateurs sont les accolades. Chaque élément du dictionnaire est séparé des autres par une virgule. On donne d'abord la clé, suivi du symbole : puis de la valeur associée à la clé.

Exemple avec un dictionnaire de traduction FRANCAIS (pour la clé) et ANGLAIS (pour la valeur)

1
dicoFR_AN = {'encodage' : "encoding", 'cryptage' : "encryption"}

Pour plus de clarté, on pourrait taper le code ainsi :

1 2 3 4
dicoFR_AN = { 'encodage' : "encoding", 'cryptage' : "encryption" }
N'oubliez pas la virgule pour séparer les différents éléments.

Une fois, cette variable en mémoire, on peut chercher son type :

>>> type(dicoFR_AN) <class 'dict'>

Comme vous pouvez le voir, le type de l'objet que nous utilisons pour gérer les dictionnaires (dictionary en anglais) dans Python se nomme dict.

2 - Nombre de couples clés-valeurs enregistrées

On peut utiliser la fonction native len pour obtenir le nombre de clés-valeurs enregistrées dans un dictionnaire.

Exemple

>>> mon_dico = {'encodage' : "encoding", 'cryptage' : "encryption"} >>> nbr = len(mon_dico) >>> nbr 2

Le dictionnaire contient bien 2 ensembles clés-valeurs, et pas 4 éléments indépendants.

3 - Rajouter une clé et sa valeur associée

Contrairement aux tableaux, on peut facilement rajouter des éléments dans un dictionnaire.

Par contre, attention à la syntaxe : on utilise des crochets et pas des accolades !

Exemple

>>> mon_dico = {'encodage' : "encoding", 'cryptage' : "encryption"} >>> mon_dico {'encodage': 'encoding', 'cryptage': 'encryption'} >>> mon_dico['balise'] = "tag" >>> mon_dico {'encodage': 'encoding', 'cryptage': 'encryption', 'balise': 'tag'} >>> nbr = len(mon_dico) >>> nbr 3

Le dictionnaire contient bien maintenant 3 ensembles clés-valeurs.

01° Trouver à l'aide d'un programme Python, le nombre de couples clés-valeurs présents dans le dictionnaire suivant :

1
mon_dico = { 'encodage' : "encoding", 'cryptage' : "encryption", 'attribut' : "attribute", 'tableau' : "array", 'lier' : "to bind", 'bit' : "bit", 'octet' : "byte (eight-bit byte)", 'multiplet' : "byte", 'retenue' : "carry", 'événement' : "event", "gestionnaire d'événement" : "event handler", "drapeau" : "flag", "nombre à virgule flottante" : "float", "fonction" : "function", "caché" : "hidden", "cachés" : "hidden", "cachée" : "hidden" , "cachées" : "hidden", "entier" : "integer" }

...CORRECTION...

1 2 3 4
mon_dico = {'encodage' : "encoding", 'cryptage' : "encryption", 'attribut' : "attribute", 'tableau' : "array", 'lier' : "to bind", 'bit' : "bit", 'octet' : "byte (eight-bit byte)", 'multiplet' : "byte", 'retenue' : "carry", 'événement' : "event", "gestionnaire d'événement" : "event handler", "drapeau" : "flag", "nombre à virgule flottante" : "float", "fonction" : "function", "caché" : "hidden", "cachés" : "hidden", "cachée" : "hidden" , "cachées" : "hidden", "entier" : "integer"} nbr_couples = len(mon_dico) print(nbr_couples)

Le programme affiche alors 19 dans le Shell. Il y a donc 19 couples clés-valeurs.

02° Maintenant que le dictionnaire est en mémoire (dans Thonny, activez VIEW VARIABLES pour le visualiser), tapez dans le shell le code permettant par exemple de rajouter que 'boucle' peut se traduire par 'loop' et 'dépassement' par 'overflow'.
Tapez ensuite une instruction permettant de visualiser que vous avez bien 21 couples clés-valeurs après le rajout des deux nouveaux couples.

...CORRECTION...

>>> mon_dico['boucle'] = 'loop' >>> mon_dico['dépassement'] = 'overflow' >>> len(mon_dico) 21

Le programme affiche alors 21. Il y a donc 21 couples clés-valeurs.

4 - Accès à l'une des valeurs

Pour accéder à l'un des éléments en particulier, on peut noter le nom de la variable-dictionnaire suivi de crochets et y placer la clé voulue. Comme avec un tableau mais avec la clé plutôt qu'avec un index chiffré.

Cela donne donc la notation monDictionnaire[maCle] donne maValeur.

Exemple

>>> mon_dico['boucle'] 'loop' >>> mon_dico['tableau'] 'array'
>>> mon_dico['lapin'] 'Traceback (most recent call last): File "", line 1, in mon_dico['lapin'] KeyError: 'lapin'

On remarquera que tenter d'accéder à une clé inconnue crée une erreur et une interruption du programme. Comme lorsqu'on demande l'index 20 d'un tableau qui ne comporte que 10 éléments.

La correspondance clé - valeur donne ceci sur l'exemple

Clé 'boucle' 'tableau'
Elément 'loop' 'array'
5 - Que peut-on utiliser pour faire une clé ?

A peu près tout.

Imaginons par exemple qu'on veuille réaliser un état des lieux des lieux d'aggression dans une ville.

On pourrait indiquer dans la valeur la nature du crime en fournissant comme clé la localisation du lieu sous la forme (latitude, longitude).

Exemple

>>> crimes = {} >>> crimes[("50°19'59\"", "3°22'59.99\"") = 'Recopiage de DM' >>> crimes {("50°19'59\"", "3°22'59.99\""): 'Recopiage de DM'}

Cette clé n'est sans doute pas facile à taper pour un humain mais elle est tout à fait valide pour l'ordinateur.

Et pouquoi noter \" et pas juste " ?

Sinon l'interpréteur Python va croire qu'on veut fermer le string : on utilise donc un caractère d'échappement. Nous l'avons déjà rencontré dans l'activité 1 ou 2.

Le plus fort, c'est que les clés n'ont pas à être du même type ! On pourrait, dans un même dictionnaire, créer des clés ayant le nom de la ville, le code postal... Par contre, sans uniformité de la clé, l'information est sans doute présente mais difficilement exploitable...

La seule chose qui ne puisse pas être une clé, c'est une variable mutable ou un contenu mutable.

>>> toto = ['bonjour'] >>> mon_dico = {toto : "non, pas possible : la list-python est mutable"} Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> mon_dico = {toto : "non, pas possible : la list-python est mutable"} TypeError: unhashable type: 'list' >>> toto = ('bonjour',) >>> mon_dico = {toto : "oui, c'est possible car le tuple est non-mutable"} >>> mon_dico {('bonjour',): "oui, c'est possible car le tuple est non-mutable"}

C'est extrêmement intéressant pour gérer des cases sur un plateau de jeu :

toucheCoule = { (10,5):"Bateau", (10,6):"Bateau" }

Ici, on a donc un bateau lignes 10 et colonnes 5 et 6 par exemple.

C'est super pratique pour gérer un plateau sans avoir à stocker plein d'informations sur des cases ... vides.

Il nous reste à voir si les dictionnaires sont mutables (comme les tableaux de Python) ou non-mutables (comme les tuples de Python).

03° Utiliser les codes suivants. Répondre ensuite à la question suivante : les dictionnaires sont-ils mutables en Python ?

>>> dico_ascii = {'A':65, 'B':66, 'C':67} >>> dico_ascii {'A': 65, 'B': 66, 'C': 67} >>> id(dico_ascii) 140578584342600 >>> dico_ascii['A'] = 75 >>> id(dico_ascii) 140578584342600

...CORRECTION...

On parvient bien à modifier les éléments du dictionnaire. On remarque d'ailleurs que l'identifiant reste bien le même : la variable-dictionnaire fait bien référence au même objet en mémoire.

Le programme affiche alors 21. Il y a donc 21 couples clés-valeurs.

6 - Le dictionnaire Python est mutable

Les objets dict sont des objets mutables : on peut modifier leur contenu sans modifier la référence de l'objet en lui-même.

En gros, comme les tableaux.

Du coup, on peut modifier un dictionnaire qu'on passe en paramètre à une fonction par effet de bord.

La puissance de cet objet est que

  • Si on veut modifier la valeur associée à une clé existence : on modifie la valeur
  • Si on veut "modifier" la valeur associée à une clé qui n'existe pas en réalité : on crée le couple
  • Un exemple avec un oubli un remplacement initial de overflow par overflaw :

    >>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> mon_dico['dépassement'] = 'overflaw' >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflaw'}

    Tentons de changer la valeur associée à "dépassement" :

    >>> mon_dico['dépassement'] = 'overflow' >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflow'}

    Et pour rappel : si la clé n'existe pas, on crée juste une nouvelle entrée :

    >>> mon_dico['balise'] = 'tag' >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflow', 'balise': 'tag'}

Un dernier élément : nous avons vu qu'une recherche sur une clé inconue, ça provoque une erreur. Comment faire alors pour vérifier si une clé existe ou pas ?

7 - Connaître l'existence d'une clé

C'est très facile, puisque c'est fondamental pour ne pas déclencher d'erreur.

Il existe un mot-clé Python qui permet de tester l'existence d'un élément dans un conteneur : in (dans, en anglais)

Il suffit d'évaluer l'expression suivante : cleTestee in monDict : l'interpréteur Python va renvoyer une valeur booléenne : True ou False.

Un exemple :

>>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> mon_dico['dépassement'] = 'overflow' >>> 'boucle' in mon_dico True >>> 'toto' in mon_dico False >>> 'loop' in mon_dico False

On notera donc qu'on teste l'existence de la clé et pas l'existence d'une valeur.

D'ailleurs, en réalité, il s'agit d'un raccourci pour l'expression suivante que nous allons voir dans la partie suivante : cleTestee in monDict.keys() : l'interpréteur Python va renvoyer une valeur booléenne : True ou False.

Un exemple :

>>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> mon_dico['dépassement'] = 'overflow' >>> 'boucle' in mon_dico True >>> 'toto' in mon_dico False >>> 'loop' in mon_dico False

04° Lire, comprendre et utiliser la fonction suivante. Lancer le programme pour mémoriser le dictionnaire et la fonction. Lancer ensuite les commandes suivantes dans le Shell pour en vérifier les réponses.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
def incrementer(leDict, laCle) : '''Fonction qui renvoie True si la clé existe déjà et l'incrémente. Sinon, elle renvoie False et crée une valeur associée de 0 :: param leDict(dic) :: le dictionnaire sur lequel on veut agir :: param laCle(?) :: la clé qu'on veut tester :: return (bool) :: True si leDict[laCle] existe :: exemples :: >>> nbr_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nbr_lettres, 'z') False >>> nbr_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} ''' if laCle in leDict.keys() : leDict[laCle] = leDict[laCle] + 1 # ou leDict[laCle] += 1 return True leDict[laCle] = 1 # return ligne 18 : si on arrive ici c'est que c'est faux return False comptesLettres = {'a':1, 'b':20, 'c':300} if __name__ == '__main__' : import doctest doctest.testmod()
>>> monDico = {} >>> incrementer(monDico, 'a') >>> incrementer(monDico, 'a') >>> incrementer(monDico, 't') >>> monDico

✎ 05° Tenter de trouver les réponses des commandes suivantes si on les effectue après celles de la question 04.

>>> incrementer(monDico, 'a') >>> incrementer(monDico, 'b') >>> incrementer(monDico, 't') >>> monDico

Nous en verrons un peu plus le moyen de lire entièrement les dictionnaires dans la dernière partie.

Regardons maintenant comment récupérer le contenu d'un fichier texte.

2 - Lecture d'un fichier

Qu'est-ce qu'un fichier texte ?

Un ensemble d'octets (valant de 0 à 255) qui sont la représentation du texte.

Nous allons maintenant voir comment lire un fichier texte ligne par ligne.

Ensuite, nous verrons comment compter les lettres du texte, une à une.

06° Télécharger (clic-droit, télécharger) la nouvelle suivante qui est maintenant dans le domaine public : The Dunwich Horror de HP Lovecraft.

Placer ce fichier texte dans un dossier dont vous connaissez le nom et que vous parviendrez facilement à ouvrir.

Pourquoi en anglais ? Car la traduction en français, elle, est encore trop récente : elle n'est donc pas dans le domaine public.

Deuxième raison : pas d'accent en anglais. Il y a donc moins de tests à réaliser (style si 'e' ou 'é' ou 'ê', rajoute 1).

07° Créer un fichier Python au même endroit. Lancer ce fichier.

1 2 3 4 5 6
monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : print(ligne) monFichier.close()

Vous devriez visualiser dans le Shell le texte de cette oeuvre, ligne par ligne.

Une erreur se produit ? Oui : lisez ceci. Non : passez l'information

Il est possible qu'il vous dise qu'il ne parvient pas à interpréter certaines caractères en UTF-8. Normalement, ça marche tout seul notez bien. Si une telle erreur survient, c'est que votre machine a enregistré le fichier texte en utilisant un encodage différent de UTF-8. Comment y remédier ?

  • Ouvrir le fichier texte dans Notepad++.
  • En bas à droite, vous devriez voir l'encodage du fichier. Par exemple ANSI ou UTF-8. Si il est noté autre chose que UTF-8, c'est gagné : l'erreur vient de là
  • Dans ce cas, dans le menu du haut, choisir ENCODAGE / ENCODING et sélectionner CONVERT TO UTF-8 ou CONVERTIR VERS UTF-8 (pas simplement lire comme, attention : il s'agit des choix du bas).
  • Sauvegardez la nouvelle version. Ca devrait résoudre le problème.
Fonction open et close

La fonction-constructeur native open de Python permet de créer un objet-fichier permettant au code Python d'agir sur le fichier texte.

L'argument 'r' (read) signale qu'on ne donne qu'un accès lecture : on ne pourra pas le modifer.

L'argument 'w' (write) signalerait qu'on ne donne qu'un accès écriture : on détruit le contenu précédent et on écrit un nouveau fichier.

L'argument 'a' (append) signalerait qu'on ne donne qu'un accès rajout : on écrit à la suite du contenu précédent. Si le fichier n'existe pas, il sera créé.

L'argument nommé encoding permet de signaler quelle technique d'encodage/décodage des octets utilisés. Ici, il s'agit du standard actuel 'utf-8'.

La méthode close permet ensuite de fermer le fichier. Comme d'habitude avec les méthodes, on a le NOM de l'objet, suivi d'un POINT, suivi du nom de la METHODE.

Et vous savez ce qu'on va faire ? Nous allons utiliser notre fonction permettant de rajouter 1 à chaque fois qu'on lit une lettre. Comme cela, nous aurons notre compte de lettres.

Comment lire les lettres une à unen ?Très facile avec Python : on peut itérer sur un string "Bonjour", c'est après tout "B" puis "o" puis "n" ...

08° Créer un fichier Python au même endroit. Lancer ce fichier.

1 2 3 4 5 6 7
monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : for caractere in ligne : print(caractere) monFichier.close()

Vous devriez visualiser dans le Shell le texte de cette oeuvre, caractère par caractère.

C'est un peu long, vous pouvez quitter avec CTRL+C ou en appuyant sur le bouton STOP de Thonny.

Ce que nous venons de faire est assez mal : nous venons d'interrompre le programme alors que fichier n'étant pas fermé ! Cela peut provoquer des erreurs dans le fichier ou un refus de l'ouvrir par la suite. L'ordinateur pourrait croire qu'on y accède encore, puisqu'il n'est pas fermé.

Ici, nous l'utilisions en lecture, ça devrait aller.

Si vous voulez apprendre à gérer correctement les accès fichiers, aller voir la partie FAQ en fin d'activité.

Pour vérifier que le caractère est bien une lettre, nous devrions faire ceci : if caractere in "ABC...Zabc...z". Mais c'est un peu long.

✎ 09° Tapez ceci dans le Shell :

>>> import string >>> string.ascii_letters

On importe le module string et on y cherche l'attribut ascii_letters.

Que contient string.ascii_letters ?

Et voilà : nous allons pouvoir :

  • Ouvrir le fichier
  • Placer une ligne à la fois en mémoire et la lire caractère par caractère
  • Si le caractère est une lettre, on utilise la fonction incrementer pour compter les lettres utilisées.

✎ 10° Utiliser le programme suivant qui permet de compter les lettres dans notre livre. Que contient le dictionnaire ? Le contenu des clés est-il dans l'ordre d'apparition des clés ou dans l'ordre alphabétique ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# Importation import string # Déclaration des fonctions def incrementer(leDict, laCle) : '''Fonction qui renvoie True si la clé existe déjà et l'incrémente. Sinon, elle renvoie False et crée une valeur associée de 0 :: param leDict(dic) :: le dictionnaire sur lequel on veut agir :: param laCle(?) :: la clé qu'on veut tester :: return (bool) :: True si leDict[laCle] existe :: exemples :: >>> nbr_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nbr_lettres, 'z') False >>> nbr_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} ''' if laCle in leDict.keys() : leDict[laCle] = leDict[laCle] + 1 # ou leDict[laCle] += 1 return True leDict[laCle] = 1 # return ligne précédente : si on arrive ici c'est que c'est faux return False # Programme nbrLettres = {} monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : for caractere in ligne : if caractere in string.ascii_letters : incrementer(nbrLettres, caractere) monFichier.close() print(nbrLettres) if __name__ == '__main__' : import doctest doctest.testmod()

Pas mal, mais il reste un problème : on différence majuscule et minuscule. La dernière chose à faire est donc de transformer les majuscules en minuscules. De cette façon, M et m rajouteront un à la valeur associée à la clé 'm'.

Compliqué ? Non : nous allons utiliser la méthode lower qui permet de transformer une chaîne de caractères en minuscules.

11° Utiliser le programme suivant qui permet de compter les lettres dans notre livre. Que contient le dictionnaire ? Le contenu des clés est-il dans l'ordre d'apparition des clés ou dans l'ordre alphabétique ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# Importation import string # Déclaration des fonctions def incrementer(leDict, laCle) : '''Fonction qui renvoie True si la clé existe déjà et l'incrémente. Sinon, elle renvoie False et crée une valeur associée de 0 :: param leDict(dic) :: le dictionnaire sur lequel on veut agir :: param laCle(?) :: la clé qu'on veut tester :: return (bool) :: True si leDict[laCle] existe :: exemples :: >>> nbr_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nbr_lettres, 'z') False >>> nbr_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} ''' if laCle in leDict.keys() : leDict[laCle] = leDict[laCle] + 1 # ou leDict[laCle] += 1 return True leDict[laCle] = 1 # return précédente : si on arrive ici c'est que c'est faux return False # Programme nbrLettres = {} monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : for caractere in ligne : if caractere in string.ascii_letters : incrementer(nbrLettres, caractere.lower()) monFichier.close() print(nbrLettres) if __name__ == '__main__' : import doctest doctest.testmod()

Et voici le résultat :

{ 't': 7264, 'h': 5222, 'e': 10006, 'd': 3662, 'u': 2296, 'n': 5681, 'w': 1922, 'i': 5163, 'c': 2065, 'o': 5750, 'r': 4665, 'b': 1325, 'y': 1538, 'p': 1310, 'l': 3647, 'v': 654, 'a': 6610, 'f': 1786, 'g': 1758, 's': 5026, 'm': 1884, 'k': 671, 'j': 55, 'x': 88, 'q': 77, 'z': 73 }

✎ 12° Utiliser dans le Shell l'instruction len(nbrLettres) pour savoir si les 26 lettres de l'alphabet ont été utilisées. Donner votre conclusion.

Dans l'activité Python suivante, nous verrons comment enregistrer ce résultat dans un fichier, dans le format CSV de façon par exemple à pouvoir l'exploiter pour un tableur, ou un autre programme Python.

Pourquoi c'est utile de savoir compter les caractères d'un fichier ?

Par exemple, pour décoder un texte, crypté ou pas. Imaginons que vous sachiez que le 'e' représente environ 12% des textes en français en moyenne. Si vous tombez sur un texte crypté mais que l'un des octets a également une fréquence de 12%, et bien, ça donne déjà un premier indice sur la façon dont le texte a été crypté. Avec les méthodes les plus simples bien entendu. Mais quand même un peu. Plus d'info dans la partie FAQ.

Et si on veut compter les mots, on peut ?

3 - Analyse de discours

Et oui, on peut aussi.

Il existe une méthode des strings qui permet de transformer un string en un tableau : la méthode split

>>> a = "Hello, it's a small world !\n" >>> tableau_mots = a.split(' ') >>> tableau_mots ['Hello,', "it's", 'a', 'small', 'world', '!\n']

Ici, on transmet ' ' à split pour indiquer qu'on veut séparer le string en différents éléments en utilisant l'espace comme caractère de séparation.

Il reste encore un problème : la ponctuation reste présente dans le texte.

Il faut donc la supprimer en utilisant la méthode des strings replace, en les remplaçant par des espaces pour être certain de séparer les mots.

>>> a = "Hello, it's a small world !\n" >>> a = a.replace('.', ' ') >>> a = a.replace(',', ' ') >>> a = a.replace(';', ' ') >>> a = a.replace('!', ' ') >>> a = a.replace("'", ' ') >>> a = a.replace("\n", ' ') >>> a 'Hello it s a small world ' >>> tableau_mots = a.split(' ') >>> tableau_mots ['Hello', '', 'it', 's', 'a', 'small', 'world', '', '']

13° Utiliser le programme suivant qui décompose le fichier en ligne, supprime les ponctuations et les caractères de contrôle, décompose la ligne en mots et compte les mots ! Tout ça.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
# Importation import string # Déclaration des fonctions def sans_ponctuation(chaine) : '''Renvoie chaine mais en remplaçant la ponctuation par des espaces :: chaine(str) :: un string :: return (str) :: la chaine mais sans la ponctuation :: exemple :: >>> a = "Hello, it's a small world." >>> n = sans_ponctuation(a) >>> n 'Hello it s a small world ' ''' for ponctuation in string.punctuation : chaine = chaine.replace(ponctuation, ' ') chaine = chaine.replace('\n', ' ') # new ligne chaine = chaine.replace('\r', ' ') # retour chariot chaine = chaine.replace('\t', ' ') # tabulation return chaine def incrementer(leDict, laCle) : '''Fonction qui renvoie True si la clé existe déjà et l'incrémente. Sinon, elle renvoie False et crée une valeur associée de 0 :: param leDict(dic) :: le dictionnaire sur lequel on veut agir :: param laCle(?) :: la clé qu'on veut tester :: return (bool) :: True si leDict[laCle] existe :: exemples :: >>> nbr_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nbr_lettres, 'z') False >>> nbr_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} ''' if laCle in leDict.keys() : leDict[laCle] = leDict[laCle] + 1 # ou leDict[laCle] += 1 return True leDict[laCle] = 1 # return ligne précédente : si on arrive ici c'est que c'est faux return False # Programme nbrMots = {} monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : ligne = sans_ponctuation(ligne) tableau_mots = ligne.split(' ') for mot in tableau_mots : incrementer(nbrMots, mot.lower()) monFichier.close() print(nbrMots) if __name__ == '__main__' : import doctest doctest.testmod()

Puissant non ? A tel point que la console est un peu trop petite. Voici le résultat. Attention, c'est long !

...CORRECTION...

{'\ufeff': 1, '': 4948, 'the': 1299, 'dunwich': 38, 'horror': 27, 'by': 63, 'h': 4, 'p': 2, 'lovecraft': 1, 'gorgons': 1, 'and': 603, 'hydras': 1, 'chimeras': 1, 'dire': 1, 'stories': 4, 'of': 618, 'celæno': 1, 'harpies': 1, 'may': 15, 'reproduce': 1, 'themselves': 7, 'in': 286, 'brain': 3, 'superstition': 1, 'but': 97, 'they': 126, 'were': 77, 'there': 55, 'before': 22, 'are': 29, 'transcripts': 1, 'types': 1, 'archetypes': 1, 'us': 5, 'eternal': 1, 'how': 9, 'else': 2, 'should': 1, 'recital': 1, 'that': 214, 'which': 87, 'we': 18, 'know': 19, 'a': 406, 'waking': 1, 'sense': 7, 'to': 373, 'be': 71, 'false': 1, 'come': 25, 'affect': 1, 'at': 113, 'all': 96, 'is': 59, 'it': 205, 'naturally': 1, 'conceive': 1, 'terror': 7, 'from': 110, 'such': 19, 'objects': 1, 'considered': 1, 'their': 55, 'capacity': 1, 'being': 16, 'able': 5, 'inflict': 1, 'upon': 14, 'bodily': 1, 'injury': 1, 'oh': 9, 'least': 6, 'these': 10, 'terrors': 3, 'older': 3, 'standing': 3, 'date': 3, 'beyond': 9, 'body': 6, 'or': 71, 'without': 15, 'would': 38, 'have': 32, 'been': 37, 'same': 11, 'kind': 16, 'fear': 9, 'here': 13, 'treated': 2, 'purely': 1, 'spiritual': 2, 'strong': 3, 'proportion': 1, 'as': 145, 'objectless': 1, 'on': 116, 'earth': 26, 'predominates': 1, 'period': 4, 'our': 7, 'sinless': 1, 'infancy': 1, 'difficulties': 1, 'solution': 3, 'might': 13, 'afford': 1, 'some': 46, 'probable': 2, 'insight': 1, 'into': 29, 'ante': 1, 'mundane': 1, 'condition': 1, 'peep': 1, 'shadowland': 1, 'pre': 1, 'existence': 2, 'charles': 1, 'lamb': 1, 'witches': 1, 'other': 12, 'night': 27, 'fears': 2, '1': 3, 'when': 61, 'traveler': 1, 'north': 1, 'central': 3, 'massachusetts': 2, 'takes': 1, 'wrong': 2, 'fork': 1, 'junction': 2, 'aylesbury': 11, 'pike': 2, 'just': 10, 'dean': 1, 's': 146, 'corners': 2, 'he': 227, 'comes': 2, 'lonely': 3, 'curious': 8, 'country': 4, 'ground': 10, 'gets': 1, 'higher': 1, 'brier': 1, 'bordered': 1, 'stone': 17, 'walls': 3, 'press': 4, 'closer': 4, 'against': 7, 'ruts': 1, 'dusty': 1, 'curving': 1, 'road': 14, 'trees': 14, 'frequent': 1, 'forest': 5, 'belts': 1, 'seem': 3, 'too': 16, 'large': 7, 'wild': 7, 'weeds': 1, 'brambles': 1, 'grasses': 1, 'attain': 1, 'luxuriance': 1, 'not': 65, 'often': 2, 'found': 15, 'settled': 2, 'regions': 1, 'time': 26, 'planted': 1, 'fields': 4, 'appear': 2, 'singularly': 2, 'few': 8, 'barren': 1, 'while': 12, 'sparsely': 1, 'scattered': 5, 'houses': 3, 'wear': 2, 'surprizing': 1, 'uniform': 1, 'aspect': 5, 'age': 5, 'squalor': 1, 'dilapidation': 1, 'knowing': 3, 'why': 7, 'one': 71, 'hesitates': 1, 'ask': 2, 'directions': 2, 'gnarled': 1, 'solitary': 1, 'figures': 6, 'spied': 2, 'now': 26, 'then': 37, 'crumbling': 1, 'doorsteps': 1, 'sloping': 1, 'rock': 3, 'strewn': 1, 'meadows': 2, 'those': 30, 'so': 26, 'silent': 2, 'furtive': 1, 'feels': 1, 'somehow': 1, 'confronted': 1, 'forbidden': 5, 'things': 17, 'with': 117, 'better': 3, 'nothing': 10, 'do': 10, 'rise': 1, 'brings': 1, 'mountains': 3, 'view': 2, 'above': 13, 'deep': 11, 'woods': 1, 'feeling': 2, 'strange': 18, 'uneasiness': 1, 'increased': 3, 'summits': 1, 'rounded': 2, 'symmetrical': 1, 'give': 4, 'comfort': 1, 'naturalness': 1, 'sometimes': 6, 'sky': 8, 'silhouettes': 1, 'especial': 1, 'clearness': 1, 'queer': 6, 'circles': 6, 'tall': 5, 'pillars': 2, 'most': 16, 'them': 40, 'crowned': 3, 'gorges': 1, 'ravines': 3, 'problematical': 1, 'depth': 1, 'intersect': 1, 'way': 12, 'crude': 1, 'wooden': 2, 'bridges': 1, 'always': 11, 'dubious': 2, 'safety': 2, 'dips': 1, 'again': 19, 'stretches': 1, 'marshland': 1, 'instinctively': 2, 'dislikes': 1, 'indeed': 9, 'almost': 21, 'evening': 6, 'unseen': 6, 'whippoorwills': 21, 'chatter': 1, 'fireflies': 2, 'out': 38, 'abnormal': 3, 'profusion': 1, 'dance': 1, 'raucous': 2, 'creepily': 1, 'insistent': 1, 'rhythms': 2, 'stridently': 1, 'piping': 6, 'bullfrogs': 1, 'thin': 1, 'shining': 1, 'line': 7, 'miskatonic': 10, 'upper': 11, 'reaches': 1, 'has': 9, 'an': 142, 'oddly': 3, 'serpentlike': 1, 'suggestion': 2, 'winds': 1, 'close': 8, 'feet': 8, 'domed': 3, 'hills': 22, 'among': 12, 'rises': 1, 'draw': 1, 'nearer': 1, 'heeds': 1, 'wooded': 2, 'sides': 5, 'more': 39, 'than': 32, 'tops': 2, 'loom': 1, 'up': 55, 'darkly': 2, 'precipitously': 1, 'wishes': 1, 'keep': 2, 'distance': 5, 'no': 61, 'escape': 1, 'across': 6, 'covered': 6, 'bridge': 3, 'sees': 1, 'small': 6, 'village': 13, 'huddled': 4, 'between': 10, 'stream': 1, 'vertical': 2, 'slope': 3, 'round': 1, 'mountain': 11, 'wonders': 1, 'cluster': 1, 'rotting': 2, 'gambrel': 2, 'roofs': 2, 'bespeaking': 1, 'earlier': 2, 'architectural': 1, 'neighboring': 1, 'region': 7, 'reassuring': 2, 'see': 16, 'glance': 1, 'deserted': 1, 'falling': 2, 'ruin': 1, 'broken': 2, 'steepled': 1, 'church': 3, 'harbors': 1, 'slovenly': 1, 'mercantile': 1, 'establishment': 1, 'hamlet': 1, 'dreads': 1, 'trust': 1, 'tenebrous': 1, 'tunnel': 1, 'yet': 16, 'avoid': 1, 'once': 18, 'hard': 4, 'prevent': 1, 'impression': 1, 'faint': 3, 'malign': 2, 'odor': 4, 'about': 37, 'street': 2, 'massed': 2, 'mold': 1, 'decay': 2, 'centuries': 3, 'relief': 1, 'get': 6, 'clear': 7, 'place': 22, 'follow': 4, 'narrow': 1, 'around': 11, 'base': 5, 'level': 4, 'till': 8, 'rejoins': 1, 'afterward': 7, 'learns': 1, 'through': 26, 'outsiders': 1, 'visit': 5, 'seldom': 2, 'possible': 6, 'since': 12, 'certain': 17, 'season': 1, 'signboards': 1, 'pointing': 3, 'toward': 10, 'taken': 7, 'down': 27, 'scenery': 1, 'judged': 1, 'any': 19, 'ordinary': 2, 'esthetic': 2, 'canon': 1, 'commonly': 1, 'beautiful': 1, 'influx': 1, 'artists': 1, 'summer': 5, 'tourists': 1, 'two': 14, 'ago': 4, 'talk': 7, 'witch': 2, 'blood': 5, 'satan': 2, 'worship': 1, 'presences': 4, 'was': 230, 'laughed': 2, 'custom': 2, 'reasons': 2, 'for': 59, 'avoiding': 1, 'locality': 1, 'sensible': 1, '1928': 4, 'hushed': 3, 'who': 30, 'had': 156, 'town': 1, 'world': 12, 'welfare': 1, 'heart': 1, 'people': 11, 'shun': 1, 'exactly': 2, 'perhaps': 3, 'reason': 3, 'though': 28, 'can': 21, 'apply': 1, 'uninformed': 1, 'strangers': 1, 'natives': 9, 'repellently': 1, 'decadent': 2, 'having': 8, 'gone': 10, 'far': 10, 'along': 10, 'path': 2, 'retrogression': 1, 'common': 7, 'many': 17, 'new': 10, 'england': 3, 'backwaters': 1, 'form': 5, 'race': 4, 'well': 9, 'defined': 1, 'mental': 1, 'physical': 1, 'stigmata': 1, 'degeneracy': 1, 'inbreeding': 2, 'average': 1, 'intelligence': 2, 'wofully': 2, 'low': 4, 'whilst': 10, 'annals': 3, 'reek': 1, 'overt': 1, 'viciousness': 1, 'half': 21, 'hidden': 1, 'murders': 1, 'incests': 1, 'deeds': 1, 'unnamable': 1, 'violence': 3, 'perversity': 1, 'old': 50, 'gentry': 1, 'representing': 1, 'three': 25, 'armigerous': 1, 'families': 3, 'came': 37, 'salem': 1, '1692': 1, 'kept': 6, 'somewhat': 6, 'general': 7, 'branches': 1, 'sunk': 2, 'sordid': 1, 'populace': 1, 'deeply': 1, 'only': 56, 'names': 1, 'remain': 4, 'key': 7, 'origin': 2, 'disgrace': 1, 'whateleys': 17, 'bishops': 2, 'still': 19, 'send': 1, 'eldest': 1, 'sons': 2, 'harvard': 3, 'return': 1, 'moldering': 1, 'under': 11, 'ancestors': 1, 'born': 9, 'even': 25, 'facts': 1, 'concerning': 4, 'recent': 1, 'say': 8, 'what': 46, 'matter': 9, 'legends': 1, 'speak': 2, 'unhallowed': 1, 'rites': 4, 'conclaves': 1, 'indians': 2, 'amidst': 7, 'called': 9, 'shapes': 2, 'shadow': 1, 'great': 33, 'made': 15, 'orgiastic': 1, 'prayers': 1, 'answered': 1, 'loud': 5, 'crackings': 1, 'rumblings': 5, 'below': 3, '1747': 1, 'reverend': 1, 'abijah': 1, 'hoadley': 2, 'newly': 2, 'congregational': 1, 'preached': 1, 'memorable': 2, 'sermon': 2, 'presence': 3, 'his': 124, 'imps': 1, 'said': 12, 'must': 15, 'allow': 1, 'd': 13, 'blasphemies': 1, 'infernall': 1, 'train': 1, 'dæmons': 1, 'matters': 1, 'knowledge': 1, 'deny': 1, 'cursed': 2, 'voices': 4, 'azazel': 1, 'buzrael': 1, 'beelzebub': 1, 'belial': 1, 'heard': 12, 'score': 2, 'credible': 1, 'witnesses': 1, 'living': 6, 'i': 63, 'myself': 2, 'did': 25, 'fortnight': 1, 'catch': 2, 'very': 21, 'plain': 1, 'discourse': 1, 'evill': 1, 'powers': 3, 'hill': 35, 'behind': 6, 'my': 8, 'house': 17, 'wherein': 1, 'rattling': 1, 'rolling': 1, 'groaning': 1, 'screeching': 1, 'hissing': 1, 'this': 46, 'cou': 1, 'raise': 1, 'needs': 1, 'caves': 1, 'black': 16, 'magick': 1, 'discover': 1, 'divell': 1, 'unlock': 1, 'mr': 3, 'disappeared': 4, 'soon': 12, 'after': 20, 'delivering': 1, 'text': 6, 'printed': 2, 'springfield': 1, 'extant': 1, 'noises': 11, 'continued': 4, 'reported': 3, 'year': 7, 'puzzle': 2, 'geologists': 1, 'physiographers': 1, 'traditions': 2, 'tell': 11, 'foul': 2, 'odors': 2, 'near': 14, 'crowning': 1, 'rushing': 1, 'airy': 1, 'faintly': 2, 'hours': 4, 'stated': 1, 'points': 1, 'bottom': 3, 'others': 8, 'try': 6, 'explain': 1, 'devil': 3, 'hop': 2, 'yard': 7, 'bleak': 2, 'blasted': 1, 'hillside': 4, 'where': 20, 'tree': 1, 'shrub': 1, 'grass': 5, 'blade': 1, 'will': 7, 'grow': 3, 'mortally': 1, 'afraid': 2, 'numerous': 1, 'vocal': 3, 'warm': 1, 'nights': 1, 'vowed': 1, 'birds': 3, 'psychopomps': 1, 'lying': 1, 'wait': 2, 'souls': 3, 'dying': 5, 'eery': 1, 'cries': 4, 'unison': 3, 'sufferer': 1, 'struggling': 1, 'breath': 2, 'if': 17, 'fleeing': 1, 'soul': 2, 'leaves': 1, 'instantly': 1, 'flutter': 1, 'away': 10, 'chittering': 1, 'demoniac': 2, 'laughter': 1, 'fail': 1, 'subside': 1, 'gradually': 2, 'disappointed': 1, 'silence': 6, 'tales': 6, 'course': 6, 'obsolete': 1, 'ridiculous': 1, 'because': 14, 'times': 7, 'ridiculously': 1, 'communities': 1, 'within': 6, 'thirty': 2, 'miles': 2, 'south': 2, 'spy': 2, 'cellar': 1, 'chimney': 2, 'ancient': 12, 'bishop': 15, 'built': 4, '1700': 1, 'ruins': 7, 'mill': 1, 'falls': 2, '1806': 1, 'modern': 4, 'piece': 1, 'architecture': 1, 'seen': 13, 'industry': 1, 'flourish': 1, 'nineteenth': 1, 'century': 3, 'factory': 1, 'movement': 1, 'proved': 4, 'short': 4, 'lived': 2, 'oldest': 2, 'rings': 4, 'rough': 1, 'hewn': 1, 'columns': 1, 'hilltops': 2, 'generally': 2, 'attributed': 1, 'settlers': 1, 'deposits': 1, 'skulls': 1, 'bones': 2, 'sizable': 1, 'table': 5, 'like': 50, 'sentinel': 13, 'sustain': 1, 'popular': 2, 'belief': 2, 'spots': 1, 'burial': 1, 'places': 6, 'pocumtucks': 1, 'ethnologists': 1, 'disregarding': 1, 'absurd': 1, 'improbability': 1, 'theory': 1, 'persist': 1, 'believing': 1, 'remains': 1, 'caucasian': 1, '2': 3, 'township': 1, 'partly': 4, 'inhabited': 1, 'farmhouse': 14, 'set': 10, 'four': 6, 'mile': 1, 'dwelling': 1, 'wilbur': 48, 'whateley': 75, '5': 2, 'm': 5, 'sunday': 5, 'second': 9, 'february': 1, '1913': 1, 'recalled': 3, 'candlemas': 2, 'curiously': 1, 'observe': 1, 'another': 14, 'name': 6, 'sounded': 4, 'dogs': 13, 'countryside': 7, 'barked': 4, 'persistently': 1, 'throughout': 2, 'less': 10, 'worthy': 1, 'notice': 1, 'fact': 4, 'mother': 8, 'deformed': 2, 'unattractive': 1, 'albino': 6, 'woman': 1, '35': 1, 'aged': 1, 'insane': 1, 'father': 11, 'whom': 4, 'frightful': 7, 'wizardry': 2, 'whispered': 2, 'youth': 3, 'lavinia': 9, 'known': 7, 'husband': 1, 'according': 1, 'attempt': 1, 'disavow': 1, 'child': 7, 'side': 11, 'whose': 8, 'ancestry': 2, 'folk': 6, 'speculate': 2, 'widely': 1, 'chose': 4, 'contrary': 1, 'she': 16, 'seemed': 49, 'strangely': 4, 'proud': 2, 'dark': 12, 'goatish': 9, 'looking': 3, 'infant': 2, 'formed': 3, 'contrast': 2, 'her': 17, 'own': 7, 'sickly': 3, 'pink': 1, 'eyed': 1, 'albinism': 1, 'mutter': 4, 'prophecies': 1, 'its': 35, 'unusual': 2, 'tremendous': 3, 'future': 2, 'apt': 1, 'lone': 1, 'creature': 2, 'given': 2, 'wandering': 1, 'thunderstorms': 1, 'trying': 2, 'read': 9, 'odorous': 1, 'books': 12, 'inherited': 2, 'fast': 8, 'pieces': 2, 'worm': 1, 'holes': 1, 'never': 17, 'school': 1, 'filled': 3, 'disjointed': 2, 'scraps': 1, 'lore': 4, 'taught': 1, 'remote': 2, 'feared': 3, 'reputation': 1, 'magic': 3, 'unexplained': 1, 'death': 3, 'mrs': 4, 'twelve': 3, 'years': 8, 'helped': 2, 'make': 12, 'isolated': 2, 'influences': 1, 'fond': 2, 'grandiose': 1, 'daydreams': 1, 'singular': 2, 'occupations': 1, 'nor': 11, 'leisure': 1, 'much': 20, 'household': 2, 'cares': 1, 'home': 8, 'standards': 1, 'order': 5, 'cleanliness': 1, 'long': 14, 'hideous': 8, 'screaming': 5, 'echoed': 2, 'barking': 5, 'doctor': 3, 'midwife': 1, 'presided': 1, 'coming': 2, 'neighbors': 3, 'knew': 11, 'him': 53, 'week': 3, 'drove': 1, 'sleigh': 1, 'snow': 1, 'discoursed': 1, 'incoherently': 1, 'group': 11, 'loungers': 5, 'osborn': 8, 'store': 4, 'change': 4, 'man': 16, 'added': 2, 'element': 2, 'furtiveness': 1, 'clouded': 1, 'subtly': 1, 'transformed': 1, 'object': 1, 'subject': 1, 'perturbed': 1, 'family': 5, 'event': 3, 'showed': 8, 'trace': 2, 'pride': 1, 'later': 6, 'noticed': 6, 'daughter': 4, 'paternity': 1, 'remembered': 3, 'hearers': 1, 'dun': 7, 't': 48, 'keer': 3, 'folks': 9, 'think': 10, 'ef': 8, 'lavinny': 6, 'boy': 15, 'looked': 13, 'pa': 1, 'wouldn': 2, 'look': 9, 'nothin': 4, 'ye': 24, 'expeck': 2, 'needn': 2, 'hereabouts': 1, 'seed': 2, 'o': 30, 'abaout': 7, 'calc': 4, 'late': 9, 'good': 4, 'husban': 1, 'kin': 7, 'find': 8, 'knowed': 1, 'dew': 6, 'ast': 1, 'weddin': 1, 'n': 11, 'let': 9, 'me': 10, 'suthin': 8, 'day': 19, 'yew': 5, 'll': 14, 'hear': 9, 'callin': 3, 'top': 10, 'persons': 1, 'saw': 18, 'during': 9, 'first': 10, 'month': 3, 'life': 6, 'zechariah': 2, 'undecayed': 4, 'earl': 9, 'sawyer': 14, 'law': 1, 'wife': 4, 'mamie': 4, 'frankly': 1, 'curiosity': 1, 'subsequent': 2, 'justice': 2, 'observations': 1, 'lead': 3, 'pair': 2, 'alderney': 1, 'cows': 3, 'bought': 1, 'son': 1, 'curtis': 8, 'marked': 2, 'beginning': 1, 'cattle': 15, 'buying': 2, 'part': 6, 'ended': 3, 'went': 8, 'ramshackle': 1, 'barn': 8, 'over': 22, 'crowded': 2, 'livestock': 1, 'enough': 6, 'steal': 1, 'count': 1, 'herd': 3, 'grazed': 1, 'precariously': 1, 'steep': 3, 'could': 41, 'ten': 5, 'anemic': 1, 'bloodless': 1, 'specimens': 1, 'evidently': 4, 'blight': 1, 'distemper': 1, 'sprung': 1, 'unwholesome': 1, 'pasturage': 4, 'diseased': 1, 'fungi': 1, 'timbers': 3, 'filthy': 1, 'caused': 3, 'heavy': 6, 'mortality': 1, 'amongst': 5, 'animals': 2, 'odd': 4, 'wounds': 1, 'sores': 3, 'something': 14, 'incisions': 1, 'afflict': 1, 'visible': 7, 'twice': 2, 'months': 7, 'callers': 4, 'fancied': 2, 'discern': 1, 'similar': 1, 'throats': 2, 'gray': 9, 'unshaven': 1, 'slatternly': 1, 'crinkly': 3, 'haired': 1, 'spring': 11, 'birth': 4, 'resumed': 1, 'customary': 1, 'rambles': 1, 'bearing': 1, 'misproportioned': 1, 'arms': 4, 'swarthy': 1, 'public': 2, 'interest': 2, 'subsided': 3, 'baby': 1, 'bothered': 1, 'comment': 1, 'swift': 1, 'development': 3, 'newcomer': 1, 'every': 7, 'exhibit': 1, 'growth': 1, 'phenomenal': 1, 'attained': 1, 'size': 4, 'muscular': 1, 'power': 3, 'usually': 2, 'infants': 1, 'full': 2, 'motions': 1, 'sounds': 9, 'restraint': 1, 'deliberateness': 2, 'highly': 2, 'peculiar': 4, 'really': 6, 'unprepared': 1, 'seven': 3, 'began': 17, 'walk': 5, 'unassisted': 1, 'falterings': 1, 'sufficient': 3, 'remove': 1, 'hallowe': 3, 'en': 3, 'blaze': 2, 'midnight': 2, 'stands': 1, 'tumulus': 1, 'considerable': 3, 'started': 4, 'silas': 2, 'mentioned': 2, 'running': 3, 'sturdily': 1, 'ahead': 6, 'hour': 4, 'remarked': 1, 'rounding': 1, 'stray': 1, 'heifer': 1, 'nearly': 2, 'forgot': 1, 'mission': 1, 'fleetingly': 1, 'dim': 3, 'light': 4, 'lantern': 2, 'darted': 1, 'noiselessly': 1, 'underbrush': 5, 'astonished': 1, 'watcher': 1, 'entirely': 2, 'unclothed': 1, 'sure': 2, 'fringed': 1, 'belt': 1, 'blue': 3, 'trunks': 2, 'trousers': 1, 'subsequently': 1, 'alive': 2, 'conscious': 2, 'complete': 4, 'tightly': 2, 'buttoned': 1, 'attire': 1, 'disarrangement': 2, 'threatened': 1, 'fill': 1, 'anger': 1, 'alarm': 3, 'squalid': 1, 'grandfather': 11, 'respect': 1, 'thought': 19, 'notable': 1, 'until': 3, 'suggested': 4, 'valid': 1, 'next': 6, 'january': 1, 'gossips': 1, 'mildly': 1, 'interested': 1, 'brat': 2, 'commenced': 3, 'eleven': 1, 'speech': 4, 'remarkable': 3, 'both': 7, 'difference': 2, 'accents': 1, 'displayed': 3, 'freedom': 1, 'infantile': 1, 'lisping': 1, 'children': 2, 'talkative': 1, 'spoke': 8, 'reflect': 1, 'elusive': 1, 'wholly': 7, 'unpossessed': 1, 'denizens': 1, 'strangeness': 1, 'reside': 1, 'simple': 2, 'idioms': 1, 'used': 10, 'vaguely': 4, 'linked': 2, 'intonation': 1, 'internal': 1, 'organs': 3, 'produced': 3, 'spoken': 2, 'facial': 1, 'maturity': 2, 'shared': 2, 'chinlessness': 1, 'firm': 3, 'precociously': 1, 'shaped': 3, 'nose': 1, 'united': 1, 'expression': 1, 'latin': 4, 'eyes': 9, 'air': 9, 'quasi': 1, 'adulthood': 1, 'nigh': 7, 'preternatural': 1, 'however': 6, 'exceedingly': 1, 'ugly': 1, 'despite': 4, 'appearance': 3, 'brilliancy': 1, 'animalistic': 1, 'thick': 2, 'lips': 1, 'pored': 1, 'yellowish': 2, 'skin': 3, 'coarse': 3, 'hair': 2, 'elongated': 1, 'ears': 1, 'disliked': 1, 'decidedly': 1, 'grandsire': 1, 'conjectures': 2, 'spiced': 1, 'references': 2, 'bygone': 1, 'shook': 3, 'shrieked': 3, 'dreadful': 1, 'yog': 13, 'sothoth': 13, 'midst': 1, 'circle': 2, 'stones': 4, 'book': 4, 'open': 8, 'abhorred': 1, 'obliged': 2, 'take': 8, 'various': 4, 'defensive': 1, 'measures': 1, 'menace': 2, '3': 2, 'meanwhile': 3, 'buy': 1, 'measurably': 1, 'increasing': 2, 'also': 1, 'cut': 4, 'timber': 2, 'repair': 1, 'unused': 1, 'parts': 6, 'spacious': 1, 'peaked': 2, 'roofed': 1, 'affair': 1, 'rear': 2, 'end': 6, 'buried': 1, 'rocky': 1, 'ruined': 2, 'floor': 10, 'rooms': 2, 'himself': 7, 'prodigious': 1, 'reserves': 1, 'strength': 2, 'enable': 1, 'accomplish': 1, 'labor': 1, 'babbled': 1, 'dementedly': 1, 'carpentry': 3, 'show': 4, 'effects': 2, 'sound': 9, 'calculation': 1, 'begun': 4, 'tool': 3, 'sheds': 5, 'put': 7, 'suddenly': 5, 'clapboarded': 2, 'fitted': 2, 'stout': 2, 'fresh': 4, 'lock': 2, 'restoring': 1, 'abandoned': 3, 'story': 6, 'thorough': 1, 'craftsman': 1, 'mania': 1, 'itself': 14, 'tight': 1, 'boarding': 1, 'windows': 4, 'reclaimed': 1, 'section': 1, 'declared': 1, 'crazy': 1, 'thing': 25, 'bother': 1, 'reclamation': 1, 'inexplicable': 1, 'fitting': 1, 'downstairs': 2, 'room': 9, 'grandson': 3, 'several': 5, 'ever': 13, 'admitted': 2, 'closely': 4, 'boarded': 5, 'chamber': 1, 'lined': 2, 'shelving': 1, 'arrange': 1, 'apparently': 5, 'careful': 1, 'heaped': 1, 'promiscuously': 1, 'use': 7, 'em': 8, 'tried': 4, 'mend': 1, 'torn': 3, 'letter': 1, 'page': 5, 'paste': 1, 'prepared': 1, 'rusty': 2, 'kitchen': 2, 'stove': 2, 'fitten': 1, 'orter': 2, 'hev': 2, 'sot': 2, 're': 2, 'goin': 4, 'larnin': 1, 'september': 5, '1914': 1, 'accomplishments': 1, 'alarming': 1, 'grown': 1, 'fluent': 1, 'incredibly': 1, 'intelligent': 1, 'talker': 1, 'ran': 6, 'freely': 1, 'accompanied': 1, 'wanderings': 2, 'pore': 1, 'diligently': 1, 'pictures': 1, 'charts': 1, 'instruct': 1, 'catechize': 1, 'afternoons': 1, 'restoration': 1, 'finished': 2, 'watched': 2, 'wondered': 4, 'solid': 2, 'plank': 1, 'door': 7, 'window': 7, 'east': 1, 'gable': 1, 'imagine': 1, 'cleated': 1, 'runway': 2, 'work': 6, 'completion': 1, 'locked': 3, 'windowlessly': 1, 'swung': 1, 'listlessly': 1, 'stepped': 1, 'selling': 1, 'call': 9, 'quite': 9, 'discomposed': 1, 'encountered': 1, 'stench': 12, 'averred': 1, 'smelt': 4, 'except': 3, 'indian': 1, 'anything': 4, 'sane': 2, 'homes': 1, 'olfactory': 1, 'immaculateness': 1, 'following': 3, 'void': 2, 'events': 1, 'save': 4, 'everyone': 5, 'swore': 1, 'slow': 2, 'steady': 1, 'increase': 1, 'mysterious': 1, 'eve': 6, '1915': 1, 'tremors': 1, 'felt': 6, 'underground': 1, 'rumbling': 4, 'queerly': 1, 'synchronized': 1, 'bursts': 1, 'flame': 1, 'doin': 1, 'summit': 5, 'growing': 6, 'uncannily': 1, 'entered': 3, 'fourth': 2, 'avidly': 2, 'talked': 2, 'formerly': 1, 'taciturnity': 1, 'absorbing': 1, 'specifically': 1, 'dawning': 1, 'evil': 3, 'face': 13, 'unfamiliar': 1, 'jargon': 1, 'chant': 4, 'bizarre': 1, 'chilled': 1, 'listener': 1, 'unexplainable': 1, 'aversion': 1, 'become': 2, 'wide': 2, 'remark': 1, 'carry': 1, 'pistol': 1, 'traverse': 1, 'occasional': 1, 'weapon': 2, 'enhance': 1, 'popularity': 1, 'owners': 1, 'canine': 1, 'guardians': 1, 'alone': 3, 'footsteps': 1, 'resounded': 1, 'doing': 1, 'turned': 4, 'pale': 3, 'degree': 1, 'jocose': 1, 'fish': 1, 'peddler': 2, 'leading': 2, 'stairway': 1, 'told': 9, 'horse': 3, 'stamping': 3, 'reflected': 2, 'thinking': 1, 'swiftly': 3, 'shuddered': 2, 'bullock': 2, 'sacrificed': 2, 'proper': 1, 'heathen': 1, 'gods': 1, 'hate': 1, 'whole': 4, 'violently': 3, 'hated': 2, 'young': 4, 'personally': 1, '1917': 1, 'war': 1, 'squire': 1, 'chairman': 1, 'local': 1, 'draft': 2, 'board': 1, 'finding': 2, 'quota': 1, 'men': 30, 'fit': 2, 'sent': 6, 'camp': 1, 'government': 1, 'alarmed': 1, 'signs': 3, 'wholesale': 1, 'regional': 1, 'decadence': 2, 'officers': 2, 'medical': 4, 'experts': 2, 'investigate': 1, 'conducting': 1, 'survey': 3, 'newspaper': 1, 'readers': 1, 'recall': 1, 'publicity': 2, 'attending': 1, 'investigation': 1, 'reporters': 2, 'track': 1, 'boston': 2, 'globe': 1, 'arkham': 15, 'advertiser': 3, 'print': 1, 'flamboyant': 1, 'precociousness': 1, 'shelves': 2, 'sealed': 6, 'weirdness': 1, 'lad': 2, 'fifteen': 3, 'lip': 1, 'cheek': 1, 'fuzzy': 1, 'voice': 7, 'break': 4, 'sets': 1, 'camera': 1, 'attention': 3, 'trickle': 1, 'spaces': 3, 'smell': 6, 'shed': 2, 'finally': 5, 'repaired': 2, 'caught': 1, 'appeared': 3, 'grinned': 1, 'obvious': 3, 'mistakes': 1, 'writers': 1, 'paid': 3, 'gold': 3, 'extremely': 1, 'received': 1, 'visitors': 4, 'ill': 1, 'concealed': 1, 'distaste': 1, 'dare': 2, 'court': 2, 'further': 2, 'violent': 1, 'resistance': 1, 'refusal': 1, '4': 1, 'decade': 1, 'sink': 1, 'indistinguishably': 1, 'morbid': 1, 'community': 2, 'ways': 1, 'hardened': 1, 'hallow': 1, 'orgies': 1, 'fires': 2, 'recur': 1, 'greater': 3, 'seasons': 2, 'portentous': 1, 'doings': 2, 'professed': 1, 'lingeringly': 1, 'cow': 1, 'complaint': 1, 'society': 1, 'prevention': 1, 'cruelty': 1, 'anxious': 4, 'outside': 15, '1923': 1, 'mind': 3, 'stature': 1, 'bearded': 4, 'gave': 5, 'impressions': 1, 'siege': 1, 'inside': 5, 'bits': 2, 'discarded': 1, 'lumber': 1, 'concluded': 2, 'knocked': 1, 'partitions': 2, 'removed': 1, 'attic': 1, 'leaving': 1, 'vast': 5, 'roof': 2, 'range': 1, 'flimsy': 1, 'tin': 1, 'pipe': 1, 'number': 1, 'cold': 11, 'glen': 27, 'chirp': 1, 'regard': 1, 'circumstance': 2, 'significance': 2, 'whistle': 1, 'jest': 9, 'tune': 1, 'breathin': 1, 'naow': 3, 'guess': 5, 'gittin': 1, 'ready': 3, 'ketch': 1, 'aout': 16, 'miss': 1, 'boys': 3, 'arter': 4, 'whether': 1, 'git': 8, 'er': 1, 'singin': 1, 'laffin': 1, 'kinder': 4, 'quiet': 4, 'daown': 11, 'hunts': 1, 'fer': 10, 'pretty': 2, 'tough': 1, 'tussles': 1, 'lammas': 2, '1924': 1, 'dr': 27, 'houghton': 4, 'hastily': 2, 'summoned': 3, 'lashed': 1, 'remaining': 1, 'darkness': 3, 'telephoned': 3, 'grave': 2, 'state': 6, 'cardiac': 1, 'action': 3, 'stertorous': 1, 'breathing': 1, 'off': 19, 'shapeless': 2, 'stood': 5, 'bedside': 1, 'vacant': 1, 'abyss': 2, 'overhead': 1, 'disquieting': 2, 'rhythmical': 4, 'surging': 2, 'lapping': 3, 'waves': 1, 'beach': 1, 'chiefly': 1, 'disturbed': 2, 'chattering': 1, 'seemingly': 1, 'limitless': 1, 'legion': 1, 'cried': 3, 'endless': 1, 'message': 3, 'repetitions': 1, 'timed': 1, 'diabolically': 1, 'wheezing': 2, 'gasps': 3, 'uncanny': 1, 'unnatural': 2, 'reluctantly': 1, 'response': 2, 'urgent': 1, 'clock': 2, 'gained': 1, 'consciousness': 6, 'interrupted': 3, 'choke': 1, 'words': 8, 'space': 6, 'willy': 2, 'grows': 3, 'faster': 1, 'sarve': 1, 'gates': 1, '751': 1, 'edition': 1, 'match': 1, 'prison': 1, 'fire': 2, 'airth': 1, 'burn': 2, 'nohaow': 1, 'obviously': 1, 'mad': 5, 'pause': 2, 'flock': 2, 'adjusted': 1, 'altered': 1, 'tempo': 1, 'indications': 1, 'afar': 2, 'sentence': 1, 'feed': 1, 'reg': 1, 'lar': 1, 'quantity': 1, 'busts': 1, 'quarters': 5, 'gits': 1, 'afore': 2, 'opens': 1, 'beyont': 3, 'multiply': 2, 'uns': 1, 'wants': 2, 'back': 16, 'screamed': 2, 'followed': 6, 'final': 3, 'throaty': 1, 'rattle': 1, 'drew': 4, 'shrunken': 1, 'lids': 1, 'glazing': 1, 'tumult': 1, 'faded': 1, 'imperceptibly': 1, 'sobbed': 1, 'chuckled': 1, 'rumbled': 1, 'didn': 5, 'muttered': 3, 'bass': 2, 'scholar': 1, 'erudition': 2, 'sided': 1, 'quietly': 1, 'correspondence': 2, 'librarians': 2, 'distant': 4, 'rare': 1, 'days': 1, 'dreaded': 4, 'youthful': 1, 'disappearances': 1, 'suspicion': 1, 'laid': 2, 'inquiry': 1, 'fund': 1, 'forth': 2, 'regularly': 1, 'increasingly': 2, 'tremendously': 1, 'mature': 1, 'height': 3, 'reached': 2, 'normal': 4, 'adult': 1, 'limit': 1, 'inclined': 3, 'wax': 1, 'figure': 2, '1925': 1, 'scholarly': 1, 'correspondent': 1, 'university': 6, 'departed': 2, 'puzzled': 2, 'fully': 3, 'six': 1, 'contempt': 1, 'forbidding': 1, 'go': 8, 'hallowmass': 2, '1926': 1, 'poor': 4, 'complained': 1, 'knows': 8, 'naowadays': 1, 'vaow': 2, 'afur': 1, 'gawd': 12, 'tryin': 1, 'louder': 1, 'burned': 1, 'usual': 2, 'flocks': 1, 'unnaturally': 1, 'belated': 1, 'assembled': 2, 'unlighted': 1, 'shrill': 2, 'notes': 4, 'burst': 5, 'pandemoniac': 1, 'cachinnation': 1, 'dawn': 2, 'vanished': 1, 'hurrying': 1, 'southward': 1, 'overdue': 1, 'meant': 2, 'none': 5, 'countryfolk': 1, 'died': 2, 'twisted': 1, '1927': 1, 'farmyard': 3, 'moving': 3, 'going': 6, 'closing': 1, 'doors': 1, 'taking': 4, 'done': 5, 'upstairs': 3, 'unusually': 1, 'worried': 1, 'tremulous': 2, 'suspected': 2, 'disappearance': 1, 'approached': 2, 'neighborhood': 1, 'ceasing': 1, 'winter': 3, 'brought': 6, 'trip': 4, 'widener': 2, 'library': 7, 'bibliotheque': 1, 'nationale': 1, 'paris': 1, 'british': 1, 'museum': 1, 'buenos': 1, 'aires': 1, 'failed': 2, 'loan': 1, 'desperately': 1, 'wanted': 1, 'length': 4, 'person': 1, 'shabby': 1, 'dirty': 1, 'uncouth': 1, 'dialect': 1, 'consult': 1, 'copy': 6, 'nearest': 2, 'geographically': 1, 'eight': 1, 'carrying': 1, 'cheap': 1, 'valise': 2, 'gargoyle': 1, 'quest': 3, 'volume': 4, 'college': 4, 'necronomicon': 6, 'arab': 1, 'alhazred': 1, 'olaus': 1, 'wormius': 1, 'version': 3, 'spain': 1, 'seventeenth': 1, 'city': 5, 'grounds': 1, 'passed': 7, 'heedlessly': 1, 'white': 3, 'fanged': 1, 'watchdog': 3, 'fury': 2, 'enmity': 1, 'tugged': 1, 'frantically': 2, 'chain': 1, 'priceless': 1, 'imperfect': 1, 'dee': 2, 'english': 5, 'bequeathed': 1, 'receiving': 1, 'access': 1, 'collate': 1, 'texts': 1, 'aim': 1, 'discovering': 1, 'passage': 4, '751st': 1, 'defective': 1, 'civilly': 1, 'refrain': 1, 'telling': 2, 'librarian': 3, 'erudite': 1, 'henry': 4, 'armitage': 52, 'ph': 1, 'princeton': 1, 'litt': 1, 'johns': 1, 'hopkins': 1, 'farm': 1, 'politely': 1, 'plied': 1, 'questions': 2, 'admit': 1, 'formula': 5, 'incantation': 3, 'containing': 2, 'discrepancies': 1, 'duplications': 1, 'ambiguities': 1, 'determination': 1, 'easy': 2, 'copied': 2, 'involuntarily': 1, 'shoulder': 1, 'pages': 1, 'left': 13, 'hand': 5, 'contained': 1, 'monstrous': 14, 'threats': 1, 'peace': 1, 'sanity': 1, 'mentally': 1, 'translated': 1, 'either': 3, 'last': 9, 'masters': 1, 'bulk': 3, 'substance': 2, 'walks': 1, 'ones': 6, 'shall': 9, 'serene': 1, 'primal': 1, 'undimensioned': 1, 'gate': 4, 'guardian': 1, 'past': 2, 'present': 2, 'broke': 2, 'trod': 1, 'tread': 2, 'behold': 2, 'semblance': 1, 'saving': 1, 'features': 2, 'begotten': 1, 'mankind': 4, 'sorts': 1, 'differing': 1, 'likeness': 1, 'truest': 1, 'eidolon': 1, 'shape': 3, 'sight': 6, 'howled': 2, 'wind': 3, 'gibbers': 1, 'mutters': 1, 'bend': 3, 'crush': 2, 'smites': 1, 'kadath': 2, 'waste': 1, 'hath': 2, 'ice': 1, 'desert': 1, 'sunken': 1, 'isles': 1, 'ocean': 1, 'hold': 2, 'whereon': 1, 'seal': 1, 'engraven': 1, 'frozen': 1, 'tower': 1, 'garlanded': 1, 'seaweed': 1, 'barnacles': 1, 'cthulhu': 1, 'cousin': 1, 'dimly': 3, 'iä': 1, 'shub': 1, 'niggurath': 1, 'foulness': 2, 'your': 5, 'habitation': 1, 'guarded': 1, 'threshold': 1, 'whereby': 1, 'spheres': 3, 'meet': 1, 'rules': 2, 'ruled': 1, 'rule': 2, 'patient': 2, 'potent': 2, 'reign': 1, 'associating': 1, 'reading': 4, 'brooding': 1, 'aura': 1, 'stretched': 2, 'cloud': 4, 'matricide': 1, 'wave': 2, 'fright': 7, 'tangible': 1, 'tomb': 1, 'clamminess': 1, 'bent': 4, 'giant': 2, 'spawn': 1, 'planet': 3, 'dimension': 3, 'gulfs': 2, 'essence': 1, 'entity': 6, 'stretch': 1, 'titan': 2, 'fantasms': 1, 'force': 7, 'presently': 2, 'raised': 5, 'head': 8, 'speaking': 2, 'resonant': 1, 'fashion': 1, 'hinted': 1, 'producing': 1, 'unlike': 2, 'run': 2, 've': 6, 'got': 8, 'sarten': 1, 'conditions': 1, 'ud': 1, 'mortal': 2, 'sin': 1, 'red': 4, 'tape': 1, 'sir': 1, 'swar': 1, 'wun': 3, 'nobody': 3, 'need': 4, 'wa': 4, 'stopped': 1, 'denial': 1, 'grew': 5, 'crafty': 1, 'needed': 1, 'consequences': 1, 'checked': 1, 'responsibility': 3, 'giving': 3, 'blasphemous': 2, 'outer': 1, 'answer': 1, 'lightly': 1, 'wal': 2, 'right': 7, 'feel': 4, 'maybe': 1, 'fussy': 1, 'saying': 2, 'rose': 3, 'strode': 1, 'building': 4, 'stooping': 1, 'each': 3, 'doorway': 1, 'savage': 3, 'yelping': 1, 'studied': 1, 'gorilla': 1, 'lope': 1, 'crossed': 1, 'bit': 1, 'campus': 2, 'picked': 1, 'rustics': 2, 'villagers': 1, 'tri': 1, 'dimensional': 1, 'rushed': 4, 'fetid': 4, 'horrible': 3, 'glens': 1, 'brooded': 1, 'obscenely': 1, 'terrible': 11, 'intruding': 1, 'glimpse': 1, 'hellish': 5, 'advance': 1, 'dominion': 1, 'passive': 2, 'nightmare': 1, 'shudder': 2, 'disgust': 1, 'reeked': 1, 'unholy': 3, 'unidentifiable': 1, 'quoted': 2, 'yes': 2, 'sickened': 1, 'ominous': 1, 'mockingly': 1, 'rumors': 1, 'parentage': 1, 'aloud': 3, 'god': 3, 'simpletons': 1, 'arthur': 1, 'machen': 1, 'pan': 1, 'scandal': 1, 'influence': 1, 'dimensioned': 1, 'nine': 2, '1912': 1, 'walked': 2, 'roodmas': 1, 'fastened': 1, 'human': 19, 'flesh': 1, 'ensuing': 1, 'weeks': 1, 'collect': 1, 'data': 1, 'formless': 1, 'communication': 1, 'attended': 1, 'illness': 1, 'ponder': 1, 'physician': 2, 'bring': 2, 'sought': 2, 'supply': 1, 'clues': 2, 'nature': 3, 'methods': 2, 'desires': 1, 'threatening': 2, 'talks': 1, 'students': 1, 'archaic': 1, 'letters': 3, 'elsewhere': 1, 'amazement': 1, 'slowly': 3, 'varied': 1, 'degrees': 1, 'acute': 2, 'ought': 3, 'lurking': 1, 'valley': 3, '6': 1, 'equinox': 1, 'witnessed': 1, 'prologue': 2, 'grotesque': 1, 'cambridge': 2, 'frantic': 5, 'efforts': 2, 'borrow': 1, 'vain': 2, 'issued': 1, 'warnings': 2, 'keenest': 1, 'intensity': 1, 'charge': 2, 'shockingly': 1, 'nervous': 1, 'equally': 1, 'results': 1, 'early': 3, 'august': 3, 'expected': 2, 'outcome': 1, 'developed': 4, 'third': 1, 'awakened': 2, 'fierce': 1, 'snarling': 1, 'growls': 1, 'barks': 1, 'mounting': 2, 'hideously': 2, 'significant': 1, 'pauses': 1, 'rang': 3, 'scream': 3, 'different': 2, 'throat': 3, 'roused': 1, 'sleepers': 1, 'haunted': 1, 'dreams': 1, 'hastened': 1, 'clothing': 3, 'lawn': 1, 'buildings': 1, 'echoes': 2, 'burglar': 1, 'shrilling': 2, 'gaping': 1, 'moonlight': 1, 'completed': 1, 'entrance': 2, 'fading': 1, 'mixed': 3, 'growling': 1, 'moaning': 2, 'proceeded': 1, 'unmistakably': 3, 'instinct': 2, 'warned': 2, 'unfortified': 1, 'brushed': 1, 'crowd': 12, 'authority': 2, 'unlocked': 1, 'vestibule': 2, 'professor': 5, 'warren': 1, 'rice': 14, 'francis': 1, 'morgan': 14, 'misgivings': 1, 'motioned': 1, 'accompany': 1, 'inward': 1, 'watchful': 1, 'droning': 1, 'whine': 1, 'dog': 5, 'perceived': 1, 'sudden': 1, 'start': 2, 'chorus': 2, 'shrubbery': 3, 'damnably': 1, 'hall': 1, 'genealogical': 1, 'whence': 2, 'whining': 1, 'dared': 2, 'turn': 2, 'courage': 2, 'snapped': 1, 'switch': 1, 'sprawled': 1, 'disordered': 1, 'tables': 1, 'overturned': 1, 'chairs': 1, 'declares': 1, 'lost': 1, 'instant': 3, 'stumble': 1, 'fall': 2, 'lay': 4, 'pool': 1, 'greenish': 4, 'yellow': 5, 'ichor': 2, 'tarry': 5, 'stickiness': 6, 'dead': 5, 'twitched': 1, 'silently': 1, 'spasmodically': 1, 'chest': 2, 'heaved': 1, 'expectant': 1, 'shoe': 1, 'leather': 1, 'fragments': 4, 'apparel': 1, 'empty': 3, 'canvas': 1, 'sack': 1, 'thrown': 1, 'desk': 2, 'revolver': 1, 'fallen': 3, 'dented': 1, 'undischarged': 1, 'cartridge': 1, 'explaining': 1, 'fired': 1, 'images': 1, 'trite': 1, 'accurate': 1, 'pen': 1, 'describe': 2, 'properly': 1, 'vividly': 1, 'visualized': 1, 'anyone': 1, 'ideas': 2, 'contour': 1, 'bound': 1, 'forms': 2, 'dimensions': 1, 'doubt': 3, 'manlike': 1, 'hands': 5, 'chinless': 1, 'stamp': 1, 'torso': 1, 'lower': 2, 'teratologically': 1, 'fabulous': 1, 'generous': 1, 'enabled': 1, 'unchallenged': 1, 'uneradicated': 1, 'waist': 2, 'semi': 1, 'anthropomorphic': 1, 'rending': 1, 'paws': 1, 'rested': 1, 'watchfully': 1, 'leathery': 1, 'reticulated': 1, 'hide': 1, 'crocodile': 1, 'alligator': 1, 'piebald': 1, 'squamous': 1, 'covering': 1, 'snakes': 1, 'worst': 2, 'resemblance': 2, 'sheer': 2, 'fantasy': 1, 'thickly': 2, 'fur': 5, 'abdomen': 1, 'tentacles': 3, 'sucking': 1, 'mouths': 1, 'protruded': 1, 'limply': 1, 'arrangement': 1, 'symmetries': 1, 'cosmic': 2, 'geometry': 1, 'unknown': 6, 'solar': 2, 'system': 2, 'hips': 1, 'pinkish': 1, 'ciliated': 1, 'orbit': 1, 'rudimentary': 1, 'eye': 2, 'lieu': 1, 'tail': 3, 'depended': 2, 'trunk': 1, 'feeler': 1, 'purple': 4, 'annular': 1, 'markings': 1, 'evidences': 1, 'undeveloped': 1, 'mouth': 1, 'limbs': 1, 'roughly': 1, 'resembled': 1, 'hind': 1, 'legs': 2, 'prehistoric': 1, 'saurians': 1, 'terminated': 1, 'ridgy': 1, 'veined': 1, 'pads': 1, 'neither': 1, 'hooves': 1, 'claws': 1, 'breathed': 1, 'rhythmically': 1, 'changed': 1, 'color': 1, 'circulatory': 1, 'cause': 1, 'non': 3, 'observable': 1, 'deepening': 2, 'tinge': 1, 'manifest': 1, 'alternated': 1, 'grayish': 1, 'genuine': 1, 'trickled': 1, 'painted': 2, 'radius': 1, 'discoloration': 1, 'rouse': 1, 'mumble': 1, 'turning': 2, 'raising': 3, 'written': 3, 'record': 3, 'mouthings': 1, 'asserts': 1, 'confidently': 1, 'uttered': 1, 'syllables': 3, 'defied': 1, 'correlation': 1, 'blasphemy': 4, 'perished': 1, 'recalls': 1, 'gai': 1, 'gha': 1, 'ghaa': 1, 'bugg': 1, 'shoggog': 1, 'y': 2, 'hah': 1, 'trailed': 1, 'nothingness': 1, 'crescendoes': 1, 'anticipation': 1, 'halt': 1, 'gasping': 1, 'lugubrious': 1, 'howl': 1, 'prostrate': 2, 'fell': 3, 'appallingly': 1, 'ceased': 2, 'murmurs': 1, 'gathering': 1, 'panic': 5, 'struck': 2, 'whirring': 1, 'fluttering': 1, 'moon': 1, 'clouds': 3, 'feathery': 1, 'watchers': 4, 'raced': 1, 'prey': 1, 'abruptly': 1, 'frightened': 6, 'bark': 1, 'leaped': 1, 'nervously': 2, 'cry': 3, 'shouted': 1, 'police': 3, 'examiner': 3, 'thankful': 1, 'high': 2, 'permit': 1, 'peering': 1, 'curtains': 1, 'carefully': 2, 'policemen': 2, 'arrived': 1, 'meeting': 1, 'urging': 1, 'sakes': 1, 'postpone': 1, 'changes': 2, 'rate': 2, 'shrinkage': 1, 'disintegration': 1, 'occurred': 4, 'permissible': 1, 'aside': 2, 'external': 1, 'elements': 1, 'sticky': 2, 'whitish': 1, 'mass': 1, 'boards': 1, 'skull': 1, 'bony': 1, 'skeleton': 1, 'true': 2, 'stable': 2, '7': 2, 'actual': 2, 'formalities': 1, 'bewildered': 1, 'officials': 2, 'details': 1, 'duly': 1, 'property': 1, 'notify': 1, 'heirs': 1, 'agitation': 1, 'beneath': 3, 'unwonted': 1, 'shell': 2, 'tended': 1, 'absence': 1, 'case': 1, 'nerves': 1, 'devised': 1, 'excuses': 1, 'enter': 1, 'noisome': 2, 'glad': 1, 'confine': 1, 'deceased': 2, 'mended': 1, 'single': 2, 'filed': 1, 'ponderous': 1, 'report': 2, 'litigations': 1, 'heirship': 1, 'progress': 1, 'innumerable': 1, 'decayed': 1, 'interminable': 1, 'manuscript': 9, 'characters': 1, 'huge': 1, 'ledger': 2, 'adjudged': 1, 'sort': 6, 'diary': 10, 'spacing': 1, 'variations': 1, 'ink': 1, 'penmanship': 1, 'presented': 1, 'baffling': 1, 'bureau': 1, 'served': 1, 'owner': 1, 'debate': 2, 'together': 5, 'collection': 1, 'study': 2, 'translation': 2, 'best': 2, 'linguists': 2, 'likely': 1, 'unriddled': 1, 'ease': 1, 'debts': 1, 'discovered': 2, 'ninth': 1, 'loose': 2, 'pronounced': 1, 'risers': 1, 'tenth': 1, 'luther': 6, 'brown': 1, 'hired': 2, 'george': 2, 'corey': 13, 'frenziedly': 1, 'morning': 9, 'acre': 1, 'meadow': 1, 'convulsed': 1, 'stumbled': 1, 'pawing': 1, 'lowing': 1, 'pitifully': 1, 'stammer': 1, 'tale': 1, 'thar': 4, 'rud': 12, 'mis': 8, 'ben': 7, 'smells': 2, 'thunder': 4, 'bushes': 4, 'little': 6, 'pushed': 3, 'haouse': 9, 'moved': 2, 'ain': 8, 'wust': 1, 'nuther': 1, 'prints': 7, 'raound': 4, 'big': 14, 'barrel': 1, 'heads': 3, 'elephant': 2, 'lines': 3, 'spreadin': 1, 'palm': 1, 'leaf': 1, 'fans': 1, 'twict': 1, 'hed': 4, 'paounded': 1, 'awful': 10, 'araound': 2, 'wizard': 6, 'ol': 5, 'faltered': 1, 'shiver': 1, 'afresh': 1, 'flying': 1, 'unable': 1, 'extract': 1, 'information': 1, 'telephoning': 2, 'thus': 1, 'starting': 1, 'rounds': 1, 'overture': 1, 'heralded': 1, 'major': 2, 'sally': 7, 'housekeeper': 1, 'seth': 10, 'became': 5, 'listen': 1, 'instead': 2, 'transmit': 1, 'chauncey': 1, 'slept': 5, 'poorly': 1, 'dashed': 1, 'party': 9, 'wire': 3, 'cha': 6, 'ncey': 6, 'post': 1, 'couldn': 3, 'haff': 8, 'bein': 2, 'scairt': 1, 'says': 17, 'blowed': 4, 'dynamite': 2, 'tarlike': 1, 'stuff': 2, 'drips': 1, 'offen': 1, 'aidges': 1, 'onto': 1, 'graoun': 2, 'whar': 6, 'marks': 2, 'tew': 3, 'bigger': 3, 'hogshead': 1, 'leads': 1, 'medders': 1, 'swath': 7, 'wider': 1, 'matted': 3, 'stun': 1, 'tumbled': 1, 'wherever': 1, 'goes': 2, 'haow': 3, 'caows': 2, 'frighted': 1, 'ez': 1, 'faound': 2, 'pasture': 1, 'clean': 2, 'sucked': 1, 'dry': 1, 'senct': 1, 'ter': 10, 'keerful': 1, 'led': 3, 'leff': 1, 'thinks': 1, 'inted': 1, 'towards': 4, 'abroad': 2, 'hadn': 1, 'bad': 2, 'eend': 1, 'desarved': 1, 'breedin': 1, 'hisself': 1, 'allus': 3, 'everybody': 4, 'nailed': 1, 'livin': 1, 'talkin': 2, 'lass': 1, 'mornin': 4, 'heerd': 7, 'laoud': 1, 'col': 2, 'sleep': 3, 'faintlike': 1, 'saound': 6, 'rippin': 1, 'tearin': 1, 'wood': 3, 'box': 1, 'crate': 1, 'opened': 1, 'sunup': 1, 'sooner': 1, 'mean': 1, 'accaount': 1, 'tracks': 9, 'healthy': 1, 'decent': 1, 'act': 1, 'creaters': 1, 'rushin': 1, 'stand': 2, 'atween': 1, 'bear': 1, 'den': 1, 'noon': 2, 'trooping': 1, 'roads': 2, 'examining': 1, 'maimed': 1, 'wreck': 1, 'bruised': 1, 'vegetation': 3, 'whatever': 5, 'assuredly': 1, 'sinister': 2, 'ravine': 1, 'banks': 1, 'avenue': 1, 'gouged': 1, 'precipice': 1, 'hanging': 1, 'launched': 1, 'avalanche': 1, 'slid': 1, 'tangled': 1, 'growths': 2, 'undefinable': 1, 'fetor': 4, 'preferred': 1, 'stay': 1, 'edge': 2, 'argue': 2, 'rather': 4, 'descend': 1, 'beard': 1, 'cyclopean': 1, 'lair': 1, 'furiously': 2, 'cowed': 3, 'reluctant': 2, 'someone': 2, 'news': 2, 'transcript': 1, 'editor': 1, 'accustomed': 1, 'concoct': 1, 'humorous': 1, 'paragraph': 1, 'item': 2, 'reproduced': 1, 'associated': 2, 'barricaded': 1, 'stoutly': 1, 'needless': 1, 'allowed': 2, 'elmer': 5, 'frye': 16, 'eastern': 1, 'agreed': 1, 'muffled': 1, 'swishing': 1, 'somewhere': 1, 'proposed': 2, 'agree': 1, 'noise': 3, 'splintering': 1, 'deliberations': 1, 'quickly': 2, 'slavered': 1, 'crouched': 1, 'numbed': 1, 'lit': 1, 'habit': 1, 'women': 1, 'whimpered': 1, 'obscure': 2, 'vestigial': 1, 'defense': 2, 'lives': 2, 'pitiful': 1, 'snapping': 1, 'crashing': 2, 'crackling': 1, 'ensued': 1, 'fryes': 3, 'sitting': 1, 'move': 1, 'dismal': 1, 'moans': 1, 'selina': 1, 'tottered': 1, 'telephone': 3, 'spread': 2, 'phase': 3, 'uncommunicative': 1, 'groups': 1, 'fiendish': 1, 'swaths': 3, 'destruction': 1, 'bare': 1, 'patches': 1, 'completely': 2, 'caved': 3, 'quarter': 1, 'identified': 1, 'survived': 1, 'shot': 3, 'help': 7, 'asked': 1, 'maintained': 1, 'zebulon': 3, 'branch': 2, 'hovered': 1, 'soundness': 1, 'suggestions': 1, 'practised': 1, 'tradition': 1, 'memories': 2, 'chantings': 1, 'altogether': 1, 'connected': 1, 'stricken': 3, 'organize': 1, 'real': 2, 'cases': 2, 'related': 1, 'band': 1, 'watch': 1, 'gloom': 1, 'repetition': 2, 'barricading': 2, 'futile': 2, 'ineffective': 1, 'gesture': 1, 'loading': 1, 'muskets': 1, 'setting': 1, 'pitchforks': 1, 'handily': 1, 'hoped': 3, 'bold': 1, 'offensive': 1, 'expedition': 1, 'venture': 1, 'example': 1, 'majority': 1, 'repeated': 2, 'huddling': 1, 'households': 1, 'excitement': 1, 'vague': 3, 'stenches': 1, 'explorers': 1, 'noted': 1, 'skirting': 1, 'bruising': 1, 'indicative': 1, 'blasphemously': 1, 'stupendous': 1, 'conformation': 1, 'returned': 1, 'foot': 1, 'crushed': 1, 'saplings': 1, 'steeply': 1, 'upward': 1, 'seekers': 2, 'gasped': 2, 'perpendicular': 2, 'deflect': 1, 'inexorable': 1, 'trail': 3, 'scale': 1, 'stony': 1, 'cliff': 1, 'verticality': 1, 'investigators': 1, 'climbed': 2, 'safer': 1, 'routes': 1, 'reversed': 1, 'build': 1, 'rituals': 1, 'center': 1, 'thrashed': 1, 'mountainous': 2, 'slightly': 2, 'concave': 1, 'surface': 1, 'deposit': 1, 'observed': 1, 'escaped': 3, 'descended': 1, 'route': 2, 'ascent': 1, 'logic': 1, 'motivation': 1, 'confounded': 1, 'situation': 1, 'plausible': 1, 'explanation': 2, 'thursday': 1, 'happily': 1, 'persistence': 1, 'telephones': 1, 'tremulously': 1, 'took': 6, 'receivers': 1, 'shriek': 2, 'breaking': 2, 'exclamation': 1, 'reply': 3, 'truth': 2, 'armed': 1, 'trudged': 1, 'hardly': 1, 'surprize': 1, 'longer': 2, 'egg': 2, 'erased': 1, '8': 1, 'meantime': 1, 'quieter': 1, 'spiritually': 1, 'poignant': 1, 'blackly': 1, 'unwinding': 1, 'closed': 1, 'shelf': 1, 'delivered': 1, 'worry': 1, 'bafflement': 1, 'languages': 1, 'alphabet': 4, 'notwithstanding': 1, 'heavily': 1, 'shaded': 1, 'arabic': 1, 'mesopotamia': 1, 'absolutely': 1, 'available': 1, 'conclusion': 1, 'represented': 1, 'artificial': 1, 'effect': 2, 'cipher': 2, 'cryptographic': 1, 'furnish': 1, 'clue': 1, 'applied': 1, 'basis': 1, 'tongue': 1, 'writer': 2, 'conceivably': 1, 'absorbingly': 1, 'interesting': 1, 'promising': 2, 'research': 2, 'philosophers': 1, 'science': 1, 'assistance': 1, 'tome': 1, 'iron': 2, 'clasp': 1, 'cast': 2, 'resembling': 1, 'sanskrit': 1, 'linguistic': 1, 'learning': 1, 'skill': 1, 'mystical': 2, 'formulæ': 5, 'antiquity': 2, 'middle': 2, 'ages': 1, 'idea': 2, 'esoterically': 1, 'cults': 2, 'wizards': 2, 'saracenic': 1, 'question': 2, 'deem': 1, 'vital': 3, 'unnecessary': 1, 'symbols': 1, 'language': 1, 'considering': 1, 'amount': 2, 'involved': 2, 'scarcely': 2, 'wished': 2, 'trouble': 2, 'using': 2, 'special': 1, 'incantations': 1, 'accordingly': 1, 'attacked': 1, 'preliminary': 1, 'assumption': 1, 'failures': 1, 'colleagues': 2, 'riddle': 1, 'complex': 2, 'mode': 1, 'merit': 1, 'trial': 1, 'fortified': 1, 'cryptography': 1, 'drawing': 1, 'fullest': 1, 'resources': 1, 'wading': 1, 'arcana': 1, 'trithemius': 1, 'poligraphia': 1, 'giambattista': 1, 'porta': 1, 'de': 2, 'furtivis': 1, 'literarum': 1, 'notis': 1, 'vigenere': 1, 'traité': 1, 'des': 1, 'chiffres': 1, 'falconer': 1, 'cryptomenysis': 1, 'patefacta': 1, 'davys': 1, 'thicknesse': 1, 'eighteenth': 1, 'treatises': 1, 'fairly': 1, 'authorities': 2, 'blair': 1, 'von': 1, 'marten': 1, 'klüber': 1, 'kryptographik': 1, 'interspersed': 1, 'attacks': 1, 'convinced': 1, 'deal': 1, 'subtlest': 1, 'ingenious': 1, 'cryptograms': 1, 'separate': 1, 'lists': 1, 'corresponding': 1, 'arranged': 1, 'multiplication': 1, 'arbitrary': 1, 'initiated': 1, 'helpful': 1, 'newer': 1, 'code': 1, 'handed': 2, 'experimenters': 1, 'daylight': 2, 'unforeseen': 1, 'obstacle': 1, 'emerged': 2, 'definitely': 1, 'barrier': 1, 'continuous': 1, 'couched': 1, 'style': 1, 'clearly': 3, 'showing': 1, 'occult': 1, 'illiteracy': 1, 'wrote': 1, 'deciphered': 2, 'entry': 1, 'dated': 1, 'november': 1, '26': 1, '1916': 1, 'startling': 2, 'thirteen': 1, 'today': 1, 'learned': 2, 'aklo': 2, 'sabaoth': 2, 'answerable': 1, 'elam': 2, 'hutchins': 3, 'collie': 1, 'jack': 1, 'bite': 1, 'kill': 2, 'dast': 1, 'won': 2, 'dho': 2, 'inner': 2, 'magnetic': 1, 'poles': 2, 'cleared': 2, 'hna': 1, 'commit': 1, 'sabbat': 1, 'learn': 1, 'angles': 1, 'planes': 1, 'formulas': 1, 'yr': 1, 'nhhngr': 1, 'looks': 1, 'yoorish': 1, 'sign': 3, 'blow': 2, 'ibn': 1, 'ghazi': 1, 'wonder': 2, 'beings': 5, 'transfigured': 1, 'sweat': 1, 'frenzy': 2, 'wakeful': 1, 'concentration': 1, 'sat': 1, 'electric': 2, 'shaking': 1, 'decipher': 1, 'cryptic': 1, 'breakfast': 1, 'dispose': 1, 'mouthful': 1, 'halted': 1, 'maddeningly': 1, 'reapplication': 1, 'necessary': 1, 'lunch': 1, 'dinner': 2, 'ate': 1, 'smallest': 1, 'fraction': 2, 'drowsed': 1, 'chair': 2, 'woke': 2, 'tangle': 1, 'nightmares': 1, 'truths': 1, 'menaces': 1, 'uncovered': 1, 'insisted': 2, 'seeing': 3, 'trembling': 2, 'ashen': 1, 'bed': 4, 'fitfully': 1, 'wednesday': 2, 'copious': 1, 'current': 1, 'sections': 1, 'already': 1, 'office': 1, 'hartwell': 3, 'cease': 1, 'refused': 1, 'intimating': 1, 'importance': 1, 'due': 1, 'twilight': 2, 'perusal': 1, 'sank': 1, 'exhausted': 2, 'bringing': 1, 'comatose': 1, 'warn': 1, 'sharp': 2, 'wander': 1, 'weakly': 1, 'rising': 2, 'gathered': 2, 'scribbled': 1, 'papers': 1, 'envelope': 1, 'immediately': 1, 'placed': 1, 'coat': 1, 'pocket': 2, 'aid': 2, 'delirious': 1, 'explanations': 1, 'calmer': 1, 'moments': 2, 'imperative': 1, 'conference': 3, 'wilder': 1, 'including': 1, 'appeals': 1, 'destroyed': 1, 'fantastic': 2, 'plan': 4, 'extirpation': 1, 'entire': 1, 'animal': 1, 'vegetable': 1, 'elder': 2, 'shout': 2, 'danger': 1, 'strip': 1, 'drag': 2, 'cosmos': 1, 'plane': 1, 'vigintillions': 1, 'eons': 1, 'dæmonolatreia': 1, 'remigius': 1, 'hopeful': 1, 'check': 1, 'peril': 1, 'conjured': 1, 'stop': 2, 'blind': 1, 'business': 3, 'powder': 3, 'hasn': 1, 'fed': 1, 'physique': 1, 'seventy': 1, 'disorder': 1, 'developing': 1, 'fever': 1, 'friday': 2, 'sober': 1, 'gnawing': 1, 'saturday': 1, 'afternoon': 3, 'summon': 1, 'rest': 1, 'tortured': 1, 'brains': 1, 'wildest': 1, 'speculation': 1, 'desperate': 1, 'drawn': 2, 'voluminously': 1, 'stack': 1, 'secure': 1, 'storage': 1, 'diagrams': 1, 'feverish': 1, 'haste': 1, 'bewildering': 1, 'abundance': 1, 'skepticism': 1, 'treat': 1, 'madman': 1, 'raving': 1, 'opinions': 1, 'divided': 1, 'notifying': 1, 'negative': 1, 'simply': 1, 'believed': 2, 'sample': 1, 'investigations': 1, 'disbanded': 1, 'definite': 2, 'busy': 1, 'comparing': 1, 'mixing': 1, 'chemicals': 1, 'obtained': 1, 'laboratory': 1, 'efficacy': 1, 'material': 3, 'agent': 1, 'monday': 4, 'task': 1, 'required': 1, 'infinity': 1, 'experiment': 1, 'consultations': 1, 'uncertainty': 1, 'tuesday': 1, 'mapped': 1, 'shock': 1, 'tucked': 1, 'obscurely': 1, 'corner': 1, 'facetious': 1, 'monster': 3, 'bootleg': 1, 'whisky': 1, 'stunned': 1, 'discussed': 1, 'whirlwind': 1, 'preparation': 1, 'meddling': 2, 'annul': 1, 'deeper': 1, '9': 1, 'motor': 1, 'arriving': 1, 'pleasant': 1, 'brightest': 1, 'sunlight': 2, 'dread': 1, 'portent': 1, 'hover': 1, 'shadowy': 1, 'gaunt': 1, 'glimpsed': 1, 'happened': 1, 'annihilation': 1, 'rode': 1, 'questioning': 3, 'pangs': 1, 'drear': 1, 'lingering': 1, 'traces': 1, 'wounded': 1, 'enormous': 1, 'cataclysmic': 2, 'altarlike': 1, 'apprised': 1, 'reports': 1, 'tragedy': 1, 'decided': 1, 'seek': 1, 'compare': 1, 'practicable': 1, 'easily': 1, 'planned': 1, 'performed': 1, 'direction': 3, 'five': 1, 'car': 2, 'perplexed': 1, 'companions': 1, 'sam': 1, 'nudging': 1, 'fred': 2, 'farr': 2, 'dank': 1, 'hollow': 1, 'yawned': 1, 'telled': 1, 'screechin': 1, 'noonday': 1, 'alike': 1, 'ear': 2, 'strained': 3, 'instinctive': 1, 'unconscious': 1, 'listening': 1, 'actually': 1, 'trembled': 2, 'lumbered': 1, 'eldritch': 1, 'negotium': 1, 'perambulans': 1, 'tenebris': 1, 'rehearsed': 1, 'memorized': 2, 'clutched': 1, 'paper': 1, 'alternative': 1, 'flashlight': 1, 'working': 1, 'beside': 3, 'metal': 1, 'sprayer': 4, 'combating': 1, 'insects': 1, 'uncased': 1, 'game': 1, 'rifle': 1, 'relied': 1, 'colleague': 1, 'painfully': 1, 'manifestation': 1, 'expect': 1, 'add': 1, 'hints': 1, 'conquered': 1, 'revelation': 1, 'shadows': 1, 'disperse': 1, 'homeward': 1, 'bar': 2, 'indoors': 1, 'evidence': 1, 'locks': 1, 'bolts': 1, 'useless': 1, 'guard': 1, 'expectancy': 2, 'piped': 1, 'threateningly': 1, 'sweeping': 1, 'touch': 1, 'ineffable': 1, 'smelled': 1, 'biding': 1, 'suicidal': 1, 'attack': 1, 'wanly': 1, 'drizzle': 1, 'rain': 3, 'heavier': 2, 'piling': 1, 'northwest': 1, 'undecided': 1, 'seeking': 1, 'shelter': 1, 'rainfall': 1, 'undestroyed': 1, 'outbuildings': 1, 'debated': 1, 'wisdom': 1, 'waiting': 1, 'aggressive': 1, 'nameless': 4, 'quarry': 1, 'downpour': 1, 'waxed': 1, 'heaviness': 1, 'peals': 1, 'horizons': 1, 'sheet': 1, 'lightning': 4, 'shimmered': 1, 'forky': 1, 'bolt': 3, 'flashed': 3, 'descending': 1, 'accursed': 3, 'storm': 5, 'prove': 1, 'weather': 1, 'gruesomely': 1, 'confused': 1, 'babel': 1, 'moment': 5, 'dozen': 1, 'shouting': 1, 'whimpering': 1, 'hysterically': 1, 'sobbing': 1, 'coherent': 1, 'choked': 1, 'agin': 5, 'movin': 2, 'minute': 2, 'lord': 2, 'speaker': 3, 'panted': 1, 'haour': 1, 'zeb': 2, 'phone': 2, 'ringin': 1, 'drivin': 1, 'bendin': 5, 'maouth': 2, 'opposite': 2, 'las': 1, 'swishin': 2, 'lappin': 1, 'suddent': 2, 'stompin': 1, 'splashin': 1, 'mud': 4, 'brook': 2, 'creakin': 1, 'strainin': 1, 'startin': 1, 'crack': 1, 'split': 2, 'whiles': 1, 'guts': 1, 'step': 2, 'fust': 1, 'graound': 1, 'water': 1, 'wipin': 1, 'beginnin': 1, 'ls': 1, 'point': 3, 'excited': 1, 'listenin': 2, 'haousekeeper': 1, 'carryin': 1, 'mushy': 1, 'puffin': 1, 'treadin': 1, 'headin': 1, 'fearful': 1, 'screamin': 2, 'rewins': 1, 'barkin': 1, 'whinin': 1, 'turrible': 2, 'yell': 1, 'lots': 2, 'gaspin': 1, 'onct': 1, 'yelled': 2, 'front': 3, 'picket': 1, 'fence': 1, 'crumpled': 2, 'yellin': 1, 'shriekin': 1, 'lightnin': 1, 'kep': 1, 'launchin': 1, 'nuthin': 1, 'winders': 1, 'deepened': 1, 'shaken': 2, 'barely': 1, 'poise': 1, 'prompt': 1, 'cavin': 1, 'hoar': 1, 'crashin': 1, 'hull': 2, 'wuss': 1, 'paused': 2, 'squeak': 1, 'fords': 1, 'wagons': 1, 'raounded': 1, 'bodied': 1, 'judgment': 1, 'iniquities': 1, 'positive': 1, 'decisively': 1, 'faltering': 1, 'believe': 1, 'chance': 3, 'putting': 1, 'you': 5, 'means': 1, 'spell': 2, 'recite': 1, 'fade': 1, 'invisible': 2, 'isn': 1, 'fight': 1, 'lot': 2, 'harm': 1, 'mustn': 1, 'hesitate': 1, 'rid': 1, 'begin': 1, 'wrecked': 2, 'somebody': 1, 'don': 1, 'shorter': 1, 'shuffled': 1, 'softly': 1, 'grimy': 1, 'finger': 2, 'steadily': 1, 'lessening': 1, 'quickest': 1, 'cuttin': 1, 'acrost': 2, 'medder': 1, 'wadin': 1, 'climbin': 1, 'carrier': 1, 'mowin': 1, 'mighty': 1, 'leetle': 1, 'indicated': 1, 'lighter': 1, 'worn': 1, 'inadvertently': 1, 'joe': 2, 'confidence': 1, 'scramble': 1, 'ladder': 1, 'qualities': 1, 'severe': 1, 'test': 1, 'muddy': 1, 'sun': 1, 'unmistakable': 2, 'consumed': 1, 'surveying': 1, 'incident': 1, 'collapsed': 2, 'shells': 1, 'cared': 1, 'altar': 7, 'slopes': 1, 'site': 1, 'abode': 1, 'visibly': 1, 'mix': 1, 'hesitancy': 1, 'zeal': 1, 'joke': 1, 'tracking': 1, 'vicious': 1, 'malevolence': 1, 'demon': 1, 'bending': 2, 'matting': 1, 'broad': 1, 'marking': 1, 'former': 1, 'telescope': 11, 'scanned': 1, 'green': 2, 'instrument': 2, 'keener': 1, 'gazing': 1, 'sharply': 1, 'passing': 2, 'glass': 4, 'indicating': 1, 'spot': 1, 'clumsy': 1, 'users': 1, 'optical': 1, 'devices': 1, 'fumbled': 1, 'eventually': 1, 'focused': 1, 'lenses': 2, 'restrained': 1, 'almighty': 1, 'creepin': 1, 'heaven': 2, 'germ': 1, 'chase': 1, 'spells': 1, 'suppose': 1, 'weren': 1, 'satisfy': 1, 'proximity': 1, 'phases': 1, 'utterly': 1, 'experience': 1, '10': 1, 'stocky': 1, 'lean': 1, 'youngish': 1, 'ascended': 1, 'instruction': 1, 'regarding': 1, 'focusing': 1, 'remained': 1, 'toiling': 1, 'maker': 1, 'repassed': 1, 'snail': 1, 'pursuers': 1, 'gaining': 1, 'holding': 1, 'detoured': 1, 'radically': 1, 'subordinate': 1, 'peak': 4, 'overlooked': 1, 'considerably': 1, 'gain': 1, 'minor': 1, 'elevation': 1, 'wesley': 1, 'adjusting': 1, 'held': 2, 'happen': 1, 'stirred': 1, 'uneasily': 1, 'recalling': 1, 'visibility': 1, 'shut': 2, 'snatched': 2, 'vision': 1, 'utmost': 1, 'vantage': 1, 'excellent': 1, 'spreading': 1, 'marvelous': 1, 'flash': 1, 'moderately': 1, 'dropped': 1, 'piercing': 1, 'ankle': 1, 'reeled': 1, 'seized': 1, 'steadied': 1, 'moan': 2, 'inaudibly': 1, 'illustration': 1, 'pandemonium': 1, 'wheeler': 5, 'rescue': 1, 'wipe': 2, 'coherence': 2, 'replies': 1, 'squirmin': 1, 'ropes': 2, 'hen': 1, 'dozens': 1, 'hogsheads': 1, 'jelly': 1, 'sep': 1, 'rit': 1, 'wrigglin': 1, 'clost': 1, 'bulgin': 1, 'twenty': 1, 'maouths': 1, 'stickin': 1, 'stovepipes': 1, 'tossin': 1, 'openin': 1, 'shuttin': 1, 'memory': 3, 'carried': 1, 'roadside': 1, 'damp': 1, 'rescued': 1, 'discernible': 2, 'tiny': 1, 'incline': 1, 'unseasonable': 1, 'unnumbered': 1, 'lurk': 1, 'note': 1, 'tense': 1, 'topmost': 1, 'ridge': 1, 'virtually': 1, 'rhythmic': 2, 'intervals': 1, 'musical': 1, 'accompanying': 1, 'gestures': 2, 'weird': 1, 'silhouette': 1, 'spectacle': 1, 'infinite': 1, 'grotesqueness': 1, 'impressiveness': 1, 'observer': 1, 'mood': 1, 'appreciation': 1, 'sayin': 1, 'wildly': 1, 'irregular': 2, 'rhythm': 1, 'ritual': 1, 'sunshine': 1, 'lessen': 1, 'intervention': 1, 'phenomenon': 1, 'plainly': 1, 'brewing': 1, 'concordant': 1, 'aloft': 1, 'wondering': 1, 'portents': 1, 'chanting': 1, 'quality': 1, 'gazed': 1, 'horizon': 1, 'purplish': 1, 'spectral': 1, 'pressed': 1, 'brighter': 1, 'mistiness': 1, 'pulsation': 1, 'braced': 1, 'tensely': 1, 'imponderable': 1, 'atmosphere': 1, 'surcharged': 1, 'warning': 1, 'cracked': 1, 'leave': 1, 'yield': 1, 'acoustic': 1, 'perversions': 1, 'pit': 1, 'source': 3, 'erroneous': 1, 'ghastly': 1, 'infra': 1, 'timbre': 1, 'seats': 1, 'subtler': 1, 'indisputably': 2, 'articulate': 2, 'imagination': 1, 'suggest': 1, 'conjectural': 1, 'winced': 1, 'expectation': 1, 'ygnaiih': 2, 'thflthkh': 1, 'ngha': 1, 'croaking': 1, 'bthnk': 1, 'ehye': 1, 'grkdl': 1, 'lh': 1, 'impulse': 1, 'falter': 1, 'psychic': 1, 'struggle': 1, 'grotesquely': 1, 'silhouetted': 1, 'culmination': 1, 'wells': 1, 'acherontic': 1, 'unplumbed': 1, 'extra': 1, 'latent': 1, 'heredity': 1, 'croakings': 1, 'gather': 1, 'renewed': 1, 'stark': 1, 'utter': 1, 'ultimate': 1, 'eh': 1, 'ya': 3, 'yahaah': 1, 'e': 1, 'yaya': 1, 'yayaaaa': 1, 'ngh': 2, 'aaaa': 2, 'yuh': 2, 'ff': 3, 'pallid': 1, 'reeling': 1, 'poured': 1, 'thunderously': 1, 'vacancy': 1, 'shocking': 1, 'jumped': 1, 'terrific': 1, 'rend': 1, 'deafening': 1, 'peal': 1, 'hearer': 1, 'zenith': 1, 'tidal': 1, 'viewless': 1, 'indescribable': 1, 'swept': 1, 'whipped': 1, 'weakened': 1, 'lethal': 1, 'asphyxiate': 1, 'hurled': 1, 'foliage': 1, 'wilted': 1, 'field': 1, 'bodies': 1, 'fearsome': 1, 'regaining': 1, 'beams': 1, 'brilliant': 1, 'untainted': 1, 'reflections': 1, 'reduced': 1, 'quivering': 1, 'jumble': 1, 'reaffirmed': 1, 'originally': 1, 'exist': 1, 'impossibility': 1, 'realm': 1, 'universe': 1, 'brief': 1, 'senses': 1, 'knit': 1, 'continuity': 1, 'pick': 1, 'prostrated': 1, 'chin': 1, 'octopus': 1, 'centipede': 1, 'spider': 1, 'yards': 2, 'stared': 1, 'bewilderment': 1, 'crystallized': 1, 'wanderingly': 1, 'heretofore': 1, 'rambled': 1, 'anew': 1, 'anyhaow': 1, 'haowever': 1, 'mostly': 1, 'doesn': 1, 'belong': 1, 'acts': 1, 'laws': 1, 'calling': 1, 'wicked': 2, 'precocious': 1, 'wise': 1, 'pull': 1, 'tangibly': 1, 'purpose': 1, 'beat': 1, 'share': 1, 'outsideness': 1, 'twin': 1, 'brother': 1}

Le mieux, c'est que ça marche sans problème avec n'importe quel fichier. Les discours politiques par exemple. Pratique pour trouver si un mot ou un ensemble de mots revient régulièrement dans une campagne. Par exemple, les éléments de langage : des ensemble de mots répétés régulièrement.

Un site ( https://www.vie-publique.fr/discours publie une partie des discours.

14° Se rendre sur la page du discours Covid-19 : Conseil des ministres sur le COVID-19.

Sélectionner le texte du discours, copier-coller le tout dans Notepad++. Vérifier en bas à droite que vous avez bien UTF-8. Si ce n'est pas le cas, aller dans le menu Encodage et choisir Convertir en UTF-8. Enregistrer le fichier au format texte sous le nom exofinal.txt.

✎ 15° Modifier le nom du fichier dans notre programme. Appliquer le programme sur le fichier. Fournir le résultat de votre analyse, à savoir une copie du dictionnaire.

✎ 16° Tenter ensuite de trouver en 30 secondes chrono les mots de plus de 4 lettres qui sont les plus courants, à la main. Pas facile ?

Voilà. La prochaine fois, nous rajouterons deux choses : comment extraire des résultats (pas à la main !) et comment créer des fichiers texte automatiquement, pour stocker nos résultats.

Sachez qu'on peut créer des robots (des programmes sachant faire des requêtes Web) pour lire automatiquement les publications. Et savoir de quoi on parle dans le pays. Ou faire de même sur un compte Tweeter et autres. En quelques secondes le résultat est là !

Du coup, nous répondrons à la question 16 en 1 seconde.

Pour information, la solution :

...CORRECTION...

{'stade': 7, 'virus': 6, 'mesures': 7, 'rassemblements': 6}

Etonnant, non ?

4 - FAQ


Comment lire et fermer un fichier en toute sécurité ?

Comment nous l'avons vu, le déroulé classique d'utilisation d'un fichier est le suivant :

1 2 3 4 5
# Du code au dessus monFichier = open('nom_fichier.txt', 'r', encoding='utf-8') # Le code de vos instructions à faire avec ce fichier monFichier.close() # La suite de votre code

Un problème peut survenir si le programme stoppe avant la ligne avec la fermeture.

Il existe un moyen de faire mieux avec Python : with ... as.

En gros, on ouvre le fichier puis on exécute les instuctions tabulées sous le with.

Lorsqu'on sort de ce bloc tabulé (soit car on a fini d'exécuter les instructions, soit à cause d'une interruption), l'interpréteur Python ferme seul le fichier proprement.

1 2 3 4
# Du code au dessus with open('nom_fichier.txt', 'r', encoding='utf-8') as monFichier # Le code de vos instructions sur ce fichier : ATTENTION, il est tabulé ! # La suite de votre code

A quoi ça sert de compter les lettres ?

Pour deux raisons éventuelles. mais liées à la même raison fondamentale.

Le fichier texte n'est pas une suite de caractères !

C'est une suite d'octets (valant entre 0 et 255).

Ces octets ont été créés en utilisant une technique d'encodage particulière (ASCII, UTF-8 ect ...)

Imaginons qu'on ne connaisse pas l'encodage d'un fichier qu'on veut lire. Comment faire ?

Et bien, on peut utiliser ceci si le texte a une longueur importante : dans chaque langue, les lettres se retrouvent dans le texte avec une certaine fréquence.

Ainsi, dans un texte en français, on trouve environ 15% de e.

Si on suppose que le texte est en français et qu'on trouve un octet présent autour de 12%, on peut faie l'hypothèse qu'il s'agit de la valeur de l'octet pour le e !

Plus de renseignements : Wikipedia, un article qui traite de cela


On peut avoir plus d'explications sur le dernier programme ?

50 51 52 53 54 55 56 57 58 59 60
nbrMots = {} monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier : ligne = sans_ponctuation(ligne) tableau_mots = ligne.split(' ') for mot in tableau_mots : incrementer(nbrMots, mot.lower()) monFichier.close()
  • Ligne 54 : on lance une boucle qui va lire les lignes du fichier texte une à une.
  • Ligne 55 : Pour chaque ligne stockée actuellement, on supprime les ponctuations de la ligne dans la variable (on ne touche pas au vrai fichier, on agit uniquement sur la variable ligne).
  • Ligne 56 : on crée un tableau (type list en Python) dont les éléments sont les mots de cette ligne.
  • Ligne 57 : pour chaque élément du tableau (variable utilisée nommée mot car on sait que c'est des mots) :
  • Ligne 58 : on applique la fonction incrementer

Activité publiée le 03 03 2020
Dernière modification : 19 07 2020
Auteur : ows. h.