python dictionnaire

Identification

Infoforall

28 - Stocker et compter avec un dictionnaire


Ranger les données... Dans un tableau, c'est bien mais il faut connaître l'indice pour atteindre une case précise.

Parfois, l'attribution d'un indice est logique et facile à faire :

  • Le numéro peut être lié à l'ordre alphabétique pour les élèves d'une classe
  • Même chose pour les mots d'un dictionnaire
  • ...

Parfois, c'est plus compliqué :

  • Comment attribuer un indice logique aux arbres d'un parc ?
  • Comment attribuer un indice logique aux oeuvres d'un musée ?
  • Comment attribuer un indice logique aux virus et bactéries ?

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 une nouvelle structure de données : le dictionnaire.

L'objectif du jour  anlalyser un texte pour savoir de quoi il parle sans avoir à le lire vraiment.

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 :

Le principe est donc d'associer la définition du mot à "encodage" qui sert de clé permettant de localiser la définition.

Clé Valeur associée à la 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 indice numérique.

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. La codification Python consiste à donner cle: valeur.

Exemple avec un dictionnaire permettant de faire de la traduction mot à mot FRANCAIS vers ANGLAIS :

  • La clé est le mot français
  • La valeur associée est le mot anglais
1
traduction = {'encodage': "encoding", 'cryptage': "encryption"}

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

1 2 3 4
traduction = { 'encodage': "encoding", 'cryptage': "encryption" }

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

>>> traduction = {'encodage': "encoding", 'cryptage': "encryption"} >>> type(traduction) <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 couples clés-valeurs enregistrés dans un dictionnaire.

Exemple

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

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

3 - Rajouter un couple clé-valeur

On peut facilement rajouter des couples clés-valeurs dans un dictionnaire, contrairement aux tableaux statiques dans lesquels le nombre de cases est fixée à la création.

Par contre, attention à la syntaxe : on utilise bien les 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 la console. 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 la console les deux instructions permettant de rajouter que 'boucle' peut se traduire par 'loop' et 'dépassement' par 'overflow'.
Tapez ensuite l'instruction permettant de visualiser le nombre de couple clé-valeur du dictionnaire 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[uneCle] donne laValeurAssociée.

Exemple

>>> mon_dico['boucle'] 'loop' >>> mon_dico['tableau'] 'array'

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

Clé 'boucle' 'tableau'
Elément 'loop' 'array'

Attention aux clés inexistantes

Tenter d'accéder à une clé inconnue crée une erreur. C'est le même type d'erreur que lorsqu'on demande l'indice 20 d'un tableau qui ne comporte que 10 éléments.

>>> mon_dico['lapin'] 'Traceback (most recent call last): File "", line 1, in mon_dico['lapin'] KeyError: 'lapin'
5 - Que peut-on utiliser pour faire une clé ?

A peu près tout, tant que c'est immuable.

Le plus fort, c'est que les clés d'un dictionnaire n'ont pas à être du même type ! Dans un même dictionnaire, on pourrait créer des clés ayant le nom de la ville, le code postal... Par contre, sans uniformité de la clé, une information insérée serait difficilement récupérable.

Exemple : stocker des crimes

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 GPS 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.

Pas de clé muable

Un contenu muable ne peut pas faire office de clé.

Voici ce que donne la tentative d'utiliser un tableau (qui est une structure muable) en tant que clé :

>>> tab = ['bonjour'] >>> mon_dico = {tab: "non, pas possible : la list-python est muable"} 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'

Par contre, aucun problème avec un tuple (qui est une structure immuable) :

>>> tpl = ('bonjour',) >>> mon_dico = {tpl: "oui, c'est possible car le tuple est non-mutable"} >>> mon_dico {('bonjour',): "oui, c'est possible car le tuple est non-mutable"}
Exemple concrêt d'utilisation

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 pratique pour gérer un plateau sans avoir à stocker la localisation des cases vides.

Il nous reste à se persuader que les dictionnaires sont muables (comme les tableaux de Python).

03° Utiliser les instructions suivantes. Répondre ensuite à la question suivante : à quoi voit-on que les dictionnaires sont-ils muables en Python ?

>>> ascii = {'A':65, 'B':66, 'C':67} >>> ascii {'A': 65, 'B': 66, 'C': 67} >>> id(ascii) 140578584342600 >>> ascii['A'] = 75 >>> id(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.

6 - Le dictionnaire Python est muable

Les objets dict sont des structures de données muables : on peut modifier leur contenu sans modifier la référence de l'objet en lui-même. Comme les tableaux. On peut ainsi modifier un dictionnaire qu'on passe en paramètre à une fonction par effet de bord.

On peut modifier un dictionnaire de trois façons :

  1. On peut insérer un nouveau couple clé-valeur si la clé n'existe pas encore.
  2. >>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> mon_dico['dépassement'] = 'overflaw' >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflaw'}
  3. On peut modifier la valeur associée à un couple clé-valeur qui existe déjà.
  4. Un exemple avec le remplacement de overflaw par overflow :

    >>> mon_dico['dépassement'] = 'overflow' >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflow'}
  5. On peut supprimer un couple clé-valeur qui existe déjà.
  6. >>> mon_dico {'boucle': 'loop', 'dépassement': 'overflow'} >>> del mon_dico['boucle'] >>> mon_dico {'dépassement': 'overflow'}

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 (qui veut dire "dans" en anglais)

Version implicite de la question

Il suffit d'évaluer l'expression suivante : cleVoulue in monDict : l'interpréteur Python va renvoyer un booléen : True si la clé existe ou False si elle n'existe pas.

Un exemple :

>>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> 'boucle' in mon_dico True >>> 'loop' in mon_dico False

On notera donc qu'on teste l'existence de la clé et pas l'existence d'une valeur. Pour le savoir, il faut connaître Python. Ce n'est donc pas très explicite.

Version explicite la question

En réalité, il s'agit d'un raccourci pour l'expression suivante plus explicite que nous allons voir dans la partie suivante : cleVoulue in monDict.keys(). Autant taper la version explicite mais vous risquez de tomber souvent sur la version implicite.

Un exemple :

>>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> 'boucle' in mon_dico.keys() True >>> 'loop' in mon_dico.keys() False

Vérifier l'existence d'une valeur

On peut connaître l'existence d'une valeur dans un dictionnaire en utilisant le mot-clé in associé à la méthode values().

>>> mon_dico = {} >>> mon_dico['boucle'] = 'loop' >>> 'boucle' in mon_dico.values() False >>> 'loop' in mon_dico.values() True

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 la console 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
def incrementer(d, c): """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 1 :: param d(dict) :: le dictionnaire sur lequel on veut agir :: param c(?) :: la clé qu'on veut tester :: return (bool) :: True si d[c] existe .. effet de bord .. On modifie le contenu de d :: 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 c in d.keys(): d[c] = d[c] + 1 return True else: # si on arrive ici c'est que c'est que la clé n'existait pas avant d[c] = 1 return False
>>> monDico = {} >>> incrementer(monDico, 'a') >>> incrementer(monDico, 'a') >>> incrementer(monDico, 't') >>> monDico {'a':2, 't':1}

✎ 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, enreguisrer la cible du lien sous ou 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 répertoire que vous parviendrez facilement à retrouver : il va falloir placer un autre fichier au même endroit.

Attention : il faut garder le nom du fichier, à savoir dunwich_horror-lovecraft.txt.

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 (un seul type de e, pas besoin de dure que si 'e' ou 'é' ou 'ê' est détécté, on rajoute 1 à la valeur de la clé 'e').

07° Enregistrer ce 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 la console le texte de cette oeuvre, ligne par ligne.

Pourquoi au même endroit ? Simplement car le nom du fichier texte donné sur la ligne 1 est une adresse relative à la position du fichier Python : seul le nom est donné, les deux fichiers doivent donc être au même endroit.

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. 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.
Quelques explications rapides : fonctions open() et close()

La fonction-constructeur native open() de Python permet de créer une variable Python en RAM permettant d'agir sur le fichier texte enregistré sur le disque-dur.

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

L'argument 'w' (write) signale qu'on donne un accès en écriture : on écrase le contenu précédent par le nouveau contenu.

L'argument 'a' (append) signale qu'on donne un accès en 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 transmettre la technique d'encodage/décodage des octets-caractères à utiliser. Ici, il s'agit du standard actuel 'utf-8'.

La méthode close() permet ensuite de fermer le fichier.

Nous allons utiliser notre fonction permettant de rajouter 1 à chaque fois qu'on lit une lettre. Comme cela, nous aurons notre compte de lettres dans ce grand document texte.

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 la console 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.

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

✎ 09° Tapez ceci dans la console :

>>> import string >>> string.ascii_letters

On importe le module string et on y cherche la variable 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. Répondre aux deux questions suivantes :

  • Que contient le dictionnaire nb_lettres après exécution ?
  • Le contenu des clés est-il dans l'ordre d'apparition des clés ou dans l'ordre alphabétique des lettres dans le texte ?
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
# Importation import string # Déclaration des fonctions def incrementer(d, c): """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 1 :: param d(dic) :: le dictionnaire sur lequel on veut agir :: param c(?) :: la clé qu'on veut tester :: return (bool) :: True si d[c] existe :: exemples :: >>> nb_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nb_lettres, 'z') False >>> nb_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} """ if c in d.keys(): d[c] = d[c] + 1 return True else: d[c] = 1 return False # Programme nb_lettres = {} 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(nb_lettres, caractere) monFichier.close() print(nb_lettres)

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
# Importation import string # Déclaration des fonctions def incrementer(d, c): """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 1 :: param d(dic) :: le dictionnaire sur lequel on veut agir :: param c(?) :: la clé qu'on veut tester :: return (bool) :: True si d[c] existe :: exemples :: >>> nb_lettres = {'a':45, 'b':12, 'd':5} >>> incrementer(nb_lettres, 'z') False >>> nb_lettres {'a': 45, 'b': 12, 'd': 5, 'z': 1} """ if c in d.keys(): d[c] = d[c] + 1 return True else: d[c] = 1 return False # Programme nb_lettres = {} 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(nb_lettres, caractere.lower()) monFichier.close() print(nb_lettres)

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 la console l'instruction len(nb_lettres) pour savoir si les 26 lettres de l'alphabet ont été utilisées. Quel doit-être le nombre de couple clé-valeur permettant d'affirmer que toutes les lettres sont présentes ?

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 l'argument ' ' à 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 remplaçant les ponctuations 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
# Importation import string # Déclaration des fonctions def sans_ponctuation(s): """Renvoie une copie de s en remplaçant la ponctuation par des espaces :: s(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: s = s.replace(ponctuation, ' ') s = s.replace('\n', ' ') # new ligne s = s.replace('\r', ' ') # retour chariot s = s.replace('\t', ' ') # tabulation return s def incrementer(d, c): """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 1 :: param d(dic) :: le dictionnaire sur lequel on veut agir :: param c(?) :: la clé qu'on veut tester :: return (bool) :: True si d[c] 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 c in d.keys(): d[c] = d[c] + 1 return True else: d[c] = 1 return False # Programme nb_mots = {} monFichier = open('dunwich_horror-lovecraft.txt', 'r', encoding='utf-8') for ligne in monFichier: ligne = sans_ponctuation(ligne) # on supprime la ponctuation du string tableau_mots = ligne.split(' ') # on crée un tableau des mots for mot in tableau_mots: incrementer(nb_mots, mot.lower()) monFichier.close() print(nb_mots)

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.

Réaliser la séquence d'action suivante :

  1. Sélectionner le texte du discours,
  2. copier-coller le tout dans Notepad++.
  3. 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.
  4. Enregistrer le fichier au format texte sous le nom exofinal.txt.

✎ 15° Modifier le nom du fichier dans notre programme à la ligne 52. 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, une solution :

...CORRECTION...

Vous pourriez créer un tableau par compréhension en ne récupérant que les clés dont les valeurs (le nombre d'apparitions) sont supérieures à 5 par exemple.

>>> souvent = [c for c in nb_mots.keys() if nb_mots[c] > 5] >>> souvent ['stade', 'virus', 'mesures', 'rassemblements']

Et en réalité, nous pourrions même créer un dictionnaire par compréhension :

>>> souvent2 = {c:nb_mots[c] for c in nb_mots if nb_mots[c] > 5} >>> souvent2 {'stade': 7, 'virus': 6, 'mesures': 7, 'rassemblements': 6}

Etonnant, non ? On peut voir sans le lire que le discours parle de mesures sanitaires dans les stades et autres rassemblements au tout début de l'épidémie de Covid.

Si vous voulez extraire la liste des mots automatiquement, le plus simple est donc de partir sur une création par compréhension.

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 : 05 12 2020
Auteur : ows. h.