Comment utiliser Python pour rechercher la distribution Zipf d'un fichier texte

Vous vous demandez peut-être le terme Distribution Zipf. Pour comprendre ce que nous entendons par ce terme, nous devons définir La loi de Zipf premier. Ne t'inquiète pas, je vais garder tout simple. 

Loi de Zipf

La loi de Zipf stipule simplement que, dans la mesure où un corpus (grand ensemble de textes structuré) d'énoncés en langage naturel apparaît, le mot le plus fréquent apparaît environ deux fois plus souvent que le deuxième mot le plus fréquent, trois fois le troisième mot le plus souvent utilisé. quatre fois le quatrième mot le plus fréquent, et ainsi de suite.  

Regardons un exemple de cela. Si vous regardez dans le corpus brun de l'anglais américain, vous remarquerez que le mot le plus fréquent est la (69 971 occurrences). Si nous examinons le deuxième mot le plus fréquent, c’est de, on remarquera qu'il se produit 36,411 fois.

Le mot la représente environ 7% des mots de Brown Corpus (69 971 sur un peu plus d’un million de mots). Si on arrive au mot de, on remarquera qu’il représente environ 3,6% du corpus (environ la moitié des la). Ainsi, nous pouvons noter que la loi de Zipf s'applique à cette situation.

Ainsi, la loi de Zipf tente de nous indiquer qu'un petit nombre d'éléments représente généralement l'essentiel des activités observées. Par exemple, un petit nombre de maladies (cancer, maladies cardiovasculaires) sont responsables de la majorité des décès. Ceci s'applique également aux mots qui représentent l'essentiel de toutes les occurrences de mots dans la littérature, et à de nombreux autres exemples dans nos vies..

Préparation des données

Avant d’aller de l’avant, permettez-moi de vous renvoyer aux données que nous utiliserons dans notre didacticiel. Nos données cette fois-ci proviendront de la National Library of Medicine. Nous allons télécharger ce qui s'appelle un fichier ASCII MeSH (En-tête de sujet médical), à partir d'ici. En particulier, d2016.bin (28 Mo).

Je n'entrerai pas dans les détails pour décrire ce fichier car il dépasse le cadre de ce tutoriel et nous en avons juste besoin pour expérimenter notre code..

Construire le programme

Après avoir téléchargé les données dans la section ci-dessus, commençons à construire notre script Python qui trouvera la distribution des données par Zipf dans d2016.bin.

La première étape normale à effectuer consiste à ouvrir le fichier:

open_file = open ('d2016.bin', 'r')

Afin de réaliser les opérations nécessaires sur le poubelle fichier, nous devons charger le fichier dans une variable chaîne. Ceci peut être réalisé simplement en utilisant le lis() fonction, comme suit:

file_to_string = open_file.read ()

Comme nous rechercherons un motif (par exemple des mots), les expressions régulières entrent en jeu. Nous allons donc utiliser Python module.

À ce stade, nous avons déjà lu le poubelle fichier et chargé son contenu dans une variable chaîne. Trouver la distribution de Zipf signifie trouver la fréquence d’apparition de mots dans le poubelle fichier. L’expression régulière sera donc utilisée pour localiser les mots du fichier.

La méthode que nous allons utiliser pour faire une telle correspondance est la Trouver tout() méthode. Comme mentionné dans le documentation du module sur Trouver tout(), la méthode va:

Renvoie toutes les correspondances de modèle dans chaîne, comme une liste de chaînes. le chaîne est balayé de gauche à droite et les correspondances sont renvoyées dans l’ordre trouvé. Si un ou plusieurs groupes sont présents dans le motif, retournez une liste de groupes. Ce sera une liste de tuples si le motif a plus d'un groupe. Les matchs vides sont inclus dans le résultat, sauf s'ils touchent le début d'un autre match..

Ce que nous voulons faire, c'est écrire une expression régulière qui localisera tous les mots individuels dans la variable de chaîne de texte. L'expression régulière pouvant effectuer cette tâche est:

\ b [A-Za-z] [a-z] 2,10 \ b

\ b est une ancre pour limites de mots. En Python, cela peut être représenté comme suit:

words = re.findall (r '(\ b [A-Za-z] [a-z] 2,9 \ b)', file_to_string)

Cette expression régulière nous dit en principe de rechercher tous les mots commençant par une lettre (majuscule ou minuscule) et suivis d'une séquence de lettres d'au moins 2 caractères et pas plus que 9 personnages. En d’autres termes, la taille des mots qui seront inclus dans la sortie sera comprise entre 3 à dix Longs caractères.

On peut maintenant faire une boucle qui vise à calculer la fréquence d’occurrence de chaque mot:

pour mot dans mots: nombre = fréquence.get (mot, 0) fréquence [mot] = nombre + 1

Ici, si le mot n’est pas encore trouvé dans la liste des mots, au lieu d’élever un mot KeyError, la valeur par défaut 0 est retourné. Sinon, le compte est incrémenté de 1, représentant le nombre de fois où le mot est arrivé dans la liste jusqu'à présent.

Enfin, nous allons imprimer la paire clé-valeur du dictionnaire, en affichant le mot (clé) et le nombre de fois qu’il est apparu dans la liste (valeur):

pour clé, valeur en inverse (triée (frequency.items (), clé = itemgetter (1))): clé d'impression, valeur

Cette partie trié (fréquence.items (), clé = itemgetter (1)) trie la sortie par valeur en ordre croissant, c’est-à-dire qu’elle affiche les mots de l’occurrence la moins fréquente à l’occurrence la plus fréquente. Pour lister les mots les plus fréquents au début, nous utilisons le renversé() méthode.

Mettre tous ensemble

Après avoir parcouru les différentes composantes du programme, voyons à quoi cela ressemble:

import re from operator import itemgetter frequency =  open_file = open ('d2016.bin', 'r') file_to_string = open_file.read () mots = re.findall (r '(\ b [A-Za-z] [ az] 2,9 \ b) ', file_to_string) pour le mot dans les mots: count = frequency.get (word, 0) frequency [mot] = count + 1 pour la clé, valeur en sens inverse (trié (frequency.items ( ), key = itemgetter (1))): clé d'impression, valeur

Je vais montrer ici les dix premiers mots et leurs fréquences renvoyés par le programme:

le 42602 abcdef 31913 et 30699 abbcdef 27016 était 17430 voir 16189 avec 14380 sous 13127 pour 9767 abcdefv 8694

À partir de cette distribution Zipf, nous pouvons valider la loi de Zipf en ce que certains mots (mots à haute fréquence) représentent l'essentiel des mots, comme nous pouvons le voir ci-dessus. la, et, était, pour. Ceci s'applique également aux séquences a B c d e F, abbcdef, et abcdefv qui sont des séquences de lettres très fréquentes ayant une signification particulière pour ce fichier.

Conclusion

Dans ce tutoriel, nous avons vu comment Python facilite le travail avec des concepts statistiques tels que la loi de Zipf. Python est très pratique, en particulier lorsque vous travaillez avec des fichiers texte volumineux, ce qui demanderait beaucoup de temps et d’efforts si nous recherchions la distribution de Zipf manuellement. Comme nous l'avons vu, nous avons pu rapidement charger, analyser et trouver la distribution par Zipf d'un fichier de 28 Mo. Laissez la simplicité dans le tri de la sortie grâce aux dictionnaires Python.