<jupyter_start><jupyter_text>Nuages de mots  Imports et stopwords<jupyter_code>from collections import Counter
from wordcloud import WordCloud
import os
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
from IPython.display import Image
# Stopwords (Idem que dans s1)
sw = stopwords.words("french")
sw += ["les", "plus", "cette", "fait", "faire", "être", "deux", "comme", "dont", "tout",
       "ils", "bien", "sans", "peut", "tous", "après", "ainsi", "donc", "cet", "sous",
       "celle", "entre", "encore", "toutes", "pendant", "moins", "dire", "cela", "non",
       "faut", "trois", "aussi", "dit", "avoir", "doit", "contre", "depuis", "autres",
       "van", "het", "autre", "jusqu", "ville", "van het", "texte texte", "membres prennent"
       , "collège van", "octobre TEXTE", "het collège", "prennent part", "van hun", "frs", 
       "membres", "décembre", "monsieur", "madame", "personnes", "nouveau", "approbation", 
       "fonctions", "mesdames", "charges", "elles", "demande", "mars", "moyen", "messieurs", "très", "concerne", "voir",
        "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "janvier", "février",
        "avril", "jour", "conditions", "extraordinaires", "charge", "raison", "pouvoir", "fourniture",
        "suite", "ans", "intervention", "proposition", "déjà", "vue", "sujet", "divers", "application",
        "relative", "leurs", "idem", "proposer", "partie", "diverses", "heures", "populations", "adoptées",
        "pris", "accord", "principe", "prix", "état", "crédit", "question", "certaines", "aide",
        "part", "taux", "services", "ordre", "aucune", "articles", "publics", "suit", "mise", "avant",
        "etat", "agit", "celui", "compte", "administration", "assistance", "société", 
       "entretien", "cours", "communale", "total", "premier", "autorité", "territoire", "donner", "caisse", "communes", 
       "echevin", "nominal", "arrêté", "cas", "toujours", "een", "voix", "actes", "lors", "adoption", "pays", "discussions",
       "monnaie", "effet", "émettre", "montant", "travail", "chaque", "augmentation", "délibération", "temps", "etc", 
       "salaires", "droit", "fonds", "voté", "commission", "favorable", "recettes", "rien", "sollicite", "renouvellement",
       "public", "faite", "groupe", "alors", "terrain", "mois", "subsides", "population", "fin", "grand", "mandat", 
       "taxes", "voie", "situation", "nouvelle", "règlement", "traitements", "avis", "devant", "lieu", "nom", "également",
       "fois", "toute", "texte", "personnel", "exercice", "rapport", "paiement", "chapitre", "normale", "nombre",
       "date", "suivant", "amendement", "décision", "qualité", "primaires", "année", "rapports", "ceux", "projet", "parce", "que",
       "point", "somme", "nomination", "certains", "supérieure", "examen", "millions", "frais", "section", "adoptés", "mais", 
       "où", "ou", "et", "donc", "or", "ni", "car", "que", "afin", "pour", "de", "sorte", "façon", "manière", "puisque", "parce", "comme", 
       "vu", "étant", "fait", "autant", "même", "si", "quoi", "quoique", "bien", "tant", "tellement", "assez", "jusqu", "lorsque", 
       "quand", "aussitôt", "sitôt", "dès", "après", "pendant", "dans", "alors", "sans", 
        "aussi", "également", "plus", "cause", "à", "a",
        "du", "dû", "moins", "ce", "cet", "cette", "cependant",
        "néanmoins", "moins", "toutefois", "par", "tandis", "abord",
        "d'", "jadis", "quand", 

        "je", "tu", "elle", "il", "nous", "vous", "elles", "ils",
        "on", "me", "te", "toi", "lui", "soi", "eux", "leur", "leurs",
        "sien", "siens", "siennes", "notre", "votre", "nos", "vos",

        "ce", "ça", "ceci", "cela", "celui", "celui-ci", "celui-là",
        "celle", "celle-ci", "celle-là", "ceux", "ceux-ci", "ceux-là",
        "aucun", "chacun", "lequel", "laquelle", "lesquelles", "personne",
        "quelque", "quelqu'", "quiconque", "rien", "tout", "aucune",
        "certes", "certains", "certaines", "beaucoup", "bon", "peu",
        "plupart", "plusieurs", "qui", "que", "quoi", "dont", "quiconque",
        "auquel", "auxquels", "auxquelles", "duquel", "desquels", "desquelles",
        "duquel", "deux", "trois", "un", "une", "quatre", "cinq", "six", "sept",
        "huit", "neuf", "dix", "ving", "trente", "quarante", "cinquante", "soixante",
        "septante", "cent", "nonante",

        "bien", "comme", "mal", "volontiers", "à nouveau", "à tort", 
        "admirablement", "ainsi", "aussi", "comment", "debout", "également", "ensemble", 
        "exprès", "mal", "mieux", "plutôt", "presque", "vite",

        "ici", "ailleurs", "alentour", "après", "arrière", "autour", "avant", "dedans", "dehors", 
        "derrière", "dessous", "devant", "là", "loin", "où", "partout", "près", "y", 
        "quelquefois", "parfois", "autrefois", "sitôt", "bientôt", "aussitôt", "tantôt", "alors", "après", 
        "ensuite", "enfin", "d'abord", "tout à coup", "premièrement", "soudain", "aujourd'hui", "demain", 
        "hier", "auparavant", "avant", "cependant", "déjà", "demain", "depuis", "désormais", "enfin", "ensuite", 
        "jadis", "jamais", "maintenant", "puis", "quand", "souvent", "toujours", "tard", "tôt", "longuement",

         "quasi", "davantage", "plus", "moins", "ainsi", "assez", "aussi", "autant", "beaucoup", 
        "combien", "encore", "environ", "fort", "guère", "presque", "peu", "si", "tant", "tellement", "tout", 
        "très", "trop",

        "ainsi", "aussi", "pourtant", "néanmoins", "toutefois", "cependant", "en effet", "puis", 
        "ensuite", "ailleurs","conséquent"

        "assurément", "certainement", "certes", "oui", "non", "peut-être", "précisément", 
        "probablement", "sans", "volontiers", "vraiment",

         "ne", "guère", "jamais", "pas", "plus", "point", "rien"
          "francs", "publique", "conseil", "bruxelles", "collège", "communal", "bourgmestre",
        "service", "rue", "franc", "article", "francs", "budget", "taxe", "dépenses", "carton", "salle", "adopté", "mises", "aménagement",
        "modifications", "quelques", "appel", "payer", "pont", "installation",
        "présents", "conclusions", "notamment", "instruction", "jours", "heure", "répond", 
        "grande", "reste", "prennent", "mettre", "appel", "soir", "propriétés", "boulevard", "concession", "art", "modification", 
           "produit", "bruxellois", "intérêts",
        "placement", "doivent", "moment", "disponibilité", "valeur", "ouverture",
        "secrétaire", "objet", "lecture", "peuvent", "conseiller", "chiffre", "politique",
        "nomme", "fabrique", "général", "pourquoi", "place", "titre", "séance",
        "installation", "bureau", "démission", "grandes", "appareils", "intérêt",
        "crois", "compétent", "majoration", "libre", "quant", "autorisation", "extraordinaire",
        "base", "président", "exploitation", "don", "matériel", "vote", "création", "pourrait",
        "ancien", "documents" ]
sw = set(sw)<jupyter_output><empty_output><jupyter_text>Créer un fichier contenant le texte de tous les bulletins d'une année donnée<jupyter_code># Choisir une année
year = 1950
# Lister les fichiers de cette année
data_path = '../data'
txt_path = '../data/txt'
txts = [f for f in os.listdir(txt_path) if os.path.isfile(os.path.join(txt_path, f)) and str(year) in f]
txts
# Stocker le contenu de ces fichiers dans une liste
content_list = []
for txt in txts:
    with open(os.path.join(txt_path, txt), 'r') as f:
        content_list.append(f.read())
# Compter le nombre d'éléments (=fichiers) dans la liste
len(content_list)
# Imprimer les 200 premiers caractères du contenu du premier fichier
content_list[0][:200]
# Ecrire tout le contenu dans un fichier temporaire
temp_path = '../data/tmp'
if not os.path.exists(temp_path):
    os.mkdir(temp_path)
with open(os.path.join(temp_path, f'{year}.txt'), 'w') as f:
    f.write(' '.join(content_list))
# Imprimer le contenu du fichier et constater les "déchets"
with open(os.path.join(temp_path, f'{year}.txt'), 'r') as f:
    before = f.read()

before[:500]<jupyter_output><empty_output><jupyter_text>Nettoyer le fichier à l'aide d'une fonction de nettoyage  Créer la fonction de nettoyage (à adapter)<jupyter_code>def clean_text(year, folder=None):
    if folder is None:
        input_path = f"{year}.txt"
        output_path = f"{year}_clean.txt"
    else:
        input_path = f"{folder}/{year}.txt"
        output_path = f"{folder}/{year}_clean.txt"
    output = open(output_path, "w", encoding='utf-8')
    with open(input_path, encoding='utf-8') as f:
        text = f.read()
        words = nltk.wordpunct_tokenize(text)
        kept = [w.lower() for w in words if len(w) > 2 and w.isalpha() and w.lower() not in sw]
        kept_string = " ".join(kept)
        output.write(kept_string)
    return f'Output has been written in {output_path}!'<jupyter_output><empty_output><jupyter_text>Appliquer la fonction sur le fichier complet de l'année<jupyter_code>clean_text(year, folder=temp_path)
# Vérifier le résultat
with open(os.path.join(temp_path, f'{year}_clean.txt'), 'r') as f:
    after = f.read()

after[:500]<jupyter_output><empty_output><jupyter_text>Nuage de mots  Afficher les termes les plus fréquents<jupyter_code>frequencies = Counter(after.split())
print(frequencies.most_common(10))<jupyter_output>[('ecole', 753), ('travaux', 607), ('brunfaut', 483), ('enseignement', 413), ('élèves', 402), ('professeur', 395), ('écoles', 369), ('police', 349), ('vente', 345), ('honneur', 331)]<jupyter_text>Créer, stocker et afficher le nuage de mots<jupyter_code>cloud = WordCloud(width=2000, height=1000, background_color='white').generate_from_frequencies(frequencies)
cloud.to_file(os.path.join(temp_path, f"{year}.png"))
Image(filename=os.path.join(temp_path, f"{year}.png"))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.2269582909460834, 'fraction_numerical': 0.006205493387589013, 'mean_word_length': 4.676096997690531, 'pattern_counts': {'":': 0, '<': 24, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '6', 'dir': 'jupyter-structured-clean-dedup', 'id': '454597', 'license': 'MIT', 'n_tokens_mistral': 3910, 'n_tokens_neox': 3803, 'n_words': 896, 'path': 'module3/s2_wordcloud.ipynb', 'repo_name': 'AliochaPro/tac', 'size': '9830'}