<jupyter_start><jupyter_text>TP2  Extraction de Keywords  Imports<jupyter_code>import os
import yake<jupyter_output><empty_output><jupyter_text>Extraire les mots clés d'un document avec Yake https://github.com/LIAAD/yake<jupyter_code># Création d'une liste de mots à ignorer
ignored = set(["conseil communal", "conseil général", "bruxelles"])
ignored
# Instantier l'extracteur de mots clés
kw_extractor = yake.KeywordExtractor(lan="fr", top=50)
kw_extractor
# Lister les Fichiers
data_path = "../data/txt/"
files = os.listdir(data_path)
# Tous les fichiers de l'année 1959
files[1849:1887]
# Enlever les fichiers qui ne commencent pas par Bxl_
bxl_files = [f for f in files if f.startswith('Bxl_')]
len(bxl_files)
# Choisir un fichier
this_file = bxl_files[1849]
this_file
# Récupérer le texte du fichier
text = open(os.path.join(data_path, this_file), 'r').read()
text[:500]
# Extraire les mots clés de ce texte
keywords = kw_extractor.extract_keywords(text)
keywords
# Ne garder que les bigrammes
kept = []
for kw, score in keywords:
    words = kw.split()
    if len(words) == 2 and kw.lower() not in ignored:
        kept.append(kw)
kept<jupyter_output><empty_output><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", "faire", "deux", "bien", "après", "ainsi", "cet",
       "celle", "entre", "toutes", "pendant", "dire", "non", "faut", "trois", 
       "aussi", "dit", "contre", "autres", "van", "het", "autre", "jusqu", "ville", 
       "alors", "juste", "sujet", "au", "la", "sur", "aucuns", "le", "ta", "tandis", 
       "leur", "tellement", "avant", "là", "tels", "avec", "ma", "tes","avoir", 
       "maintenant", "ton", "bon", "car", "mais", "tous", "cela", "mes", "tout", "ce", 
       "mien", "trop", "moins", "très", "mon", "tu", "mot", "ces", "chaque", "voient", 
       "même", "vont", "ceux", "ni", "votre", "ci", "nommés", "vous", "comment", "comme", 
       "notre", "vu", "dans",  "nous", "ça", "des", "ou", "étaient", "dedans", "du", "où", 
       "état", "par",  "étions", "dehors", "parce", "été", "depuis", "pas", "être", "devrait", 
       "peut",  "doit", "peu", "donc", "plupart", "dos", "pour", "début", "pourquoi", "elle",  
       "quand", "elles", "que", "on", "quel", "encore", "quelle", "essai", "quelles",  "et", 
       "quels", "est", "qui", "eu", "sa", "fait", "son", "faites", "ses", "fois",  "seulement", 
       "font", "si", "hors", "sien", "ici", "sans", "il", "sont", "ils",  "sous", "je", "soyez"]
sw = set(sw)<jupyter_output><empty_output><jupyter_text>Créer un fichier contenant le texte de tous les bulletins de l'année 1959<jupyter_code># Choisir une année
year = 1959
# 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<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}!'
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>Afficher les termes les plus fréquents<jupyter_code>frequencies = Counter(after.split())
print(frequencies.most_common(10))
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><jupyter_text>Reconnaissance d'entités nommées avec SpaCy  Imports<jupyter_code>from collections import defaultdict
import sys
import spacy
from spacy.lang.fr.examples import sentences
nlp = spacy.load('fr_core_news_md')
# Charger le texte
data_path = "../data/txt/"
n=1849
text = open("../data/all.txt", encoding='utf-8').read()[:n]
%%time
# Traiter le texte

doc = nlp(text)
# Compter les entités
people = defaultdict(int)
for ent in doc.ents:
    if ent.label_ == "PER" and len(ent.text) > 3:
        people[ent.text] += 1
# Trier et imprimer

sorted_people = sorted(people.items(), key=lambda kv: kv[1], reverse=True)

for person, freq in sorted_people[:50]:
    print(f"{person} apparait {freq} fois dans le corpus")<jupyter_output><empty_output><jupyter_text>Sentiment analysis avec Textblob-FR  Imports<jupyter_code>import sys
from textblob import Blobber
from textblob_fr import PatternTagger, PatternAnalyzer<jupyter_output><empty_output><jupyter_text>Fonction<jupyter_code>tb = Blobber(pos_tagger=PatternTagger(), analyzer=PatternAnalyzer())

def get_sentiment(input_text):
    blob = tb(input_text)
    polarity, subjectivity = blob.sentiment
    polarity_perc = f"{100*abs(polarity):.0f}"
    subjectivity_perc = f"{100*subjectivity:.0f}"
    if polarity > 0:
        polarity_str = f"{polarity_perc}% positive"
    elif polarity < 0:
        polarity_str = f"{polarity_perc}% negative"
    else:
        polarity_str = "neutral"
    if subjectivity > 0:
        subjectivity_str = f"{subjectivity}% subjective"
    else:
        subjectivity_str = "perfectly objective"
    print(f"This text is {polarity_str} and {subjectivity_str}.")
get_sentiment("les multiples actes s'achèvent favorablement.")
get_sentiment("Le Centre a ainsi pu collaborer à l'intéressante initiative de la Ville de Bruxelles dans la rénovation et l'ajustement de son enseignement technique et professionnel")
get_sentiment("Les affections congénitales ont été rééduquées mais les traitements sont à poursuivre")
get_sentiment("le Collège mérite des félicitations pour cela")
get_sentiment("je reconnais volontiers que le problème de la circulation là-bas est extrêmement difficile")
get_sentiment("Les dirigeants du Centre de Jeunesse sont très favorables à ce projet.")
get_sentiment("Mais ces 8 millions n'ont pas été employés")
get_sentiment("Il serait utile de lier à ces projets l'étude des agrandissements de la Cuisine Centrale et d'alerter en ce sens les services compétents")
get_sentiment("Il ne faut pas confier cela à des mains quelconques")
get_sentiment("est-ce bien vous qui donnez le mauvais exemple de fumer ?")<jupyter_output>This text is 36% negative and 0.5% subjective.
{'fraction_non_alphanumeric': 0.1479826353421859, 'fraction_numerical': 0.010725229826353423, 'mean_word_length': 4.947608200455581, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 40, 'https://': 1, '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': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '57671', 'license': 'MIT', 'n_tokens_mistral': 2977, 'n_tokens_neox': 2878, 'n_words': 768, 'path': 'tp2/tp2.ipynb', 'repo_name': 'imenbrh/tac', 'size': '7832'}