<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Reconstruction de synonymes - énoncé
Ce notebook est plus un jeu. On récupère d'abord des synonymes via la base WOLF. On ne garde que les synonymes composé d'un seul mot. On prend ensuite un texte quelconque qu'on découpe en phrase. Pour chaque phrase qu'on rencontre, on remplace des mots au hasard par leur synonymes. Chaque phrase sera présente une fois à l'identique et plusieurs fois avec des synonymes différents. L'objectif est alors de proposer une méthode pour reconstruire la base de synonymes.
Step1:  Construction de la base de synonymes
Step2:  On passe en revue toute la basse (il y a environ 120.000 lignes) et on s'arrête après 10000 synonymes car sinon, cela prend un temps fou.
Step3:  On affiche les premiers groupes 
Step4:  Génération d'une base de phrases modifiées
On utilise Zadig.
Step5:  On découpe en mot.
Step6:  On génère les phrases modifiées 
Step7:  On traite tous les mots 
Step8:  Exercice 
<ASSISTANT_TASK:>
Python Code:
from jyquickhelper import add_notebook_menu
add_notebook_menu()
Explanation: Reconstruction de synonymes - énoncé
Ce notebook est plus un jeu. On récupère d'abord des synonymes via la base WOLF. On ne garde que les synonymes composé d'un seul mot. On prend ensuite un texte quelconque qu'on découpe en phrase. Pour chaque phrase qu'on rencontre, on remplace des mots au hasard par leur synonymes. Chaque phrase sera présente une fois à l'identique et plusieurs fois avec des synonymes différents. L'objectif est alors de proposer une méthode pour reconstruire la base de synonymes.
End of explanation
from actuariat_python.data import wolf_xml
wolf_xml()
import os
if not os.path.exists("wolf-1.0b4.xml"):
    raise FileNotFoundError("wolf-1.0b4.xml")
if os.stat("wolf-1.0b4.xml").st_size < 3000000:
    raise FileNotFoundError("Size of 'wolf-1.0b4.xml' is very small: {0}".format(os.stat("wolf-1.0b4.xml").st_size))
from actuariat_python.data import enumerate_wolf_synonyms
for syn in enumerate_wolf_synonyms("wolf-1.0b4.xml", errors="ignore"):
    print(syn)
    break
Explanation: Construction de la base de synonymes
End of explanation
allsyn = {}
for line, syn in enumerate(enumerate_wolf_synonyms("wolf-1.0b4.xml")):
    if line % 10000 == 0: print("line", line, "allsyn", len(allsyn))
    clean = [_.lower() for _ in syn if " " not in _]
    if len(clean) > 1:
        for word in clean:
            if word not in allsyn:
                allsyn[word] = set(clean)
                continue
            else:
                for cl in clean:
                    allsyn[word].add(cl)
    if len(allsyn) > 10000:
        break
len(allsyn)
Explanation: On passe en revue toute la basse (il y a environ 120.000 lignes) et on s'arrête après 10000 synonymes car sinon, cela prend un temps fou.
End of explanation
i = 0
for k, v in allsyn.items():
    print(k,v)
    i += 1
    if i > 10:
        break
Explanation: On affiche les premiers groupes :
End of explanation
import urllib.request
with urllib.request.urlopen("http://www.gutenberg.org/cache/epub/4647/pg4647.txt") as u:
    content = u.read()
char = content.decode(encoding="utf-8")
Explanation: Génération d'une base de phrases modifiées
On utilise Zadig.
End of explanation
import re
reg = re.compile("([- a-zA-Zâàäéèëêîïôöùûü']+)")
phrases = [_.lower() for _ in reg.findall(char)]
for i, phrase in enumerate(phrases):
    if i >= 990:
        print(phrase)
    if i >= 1000:
        break
Explanation: On découpe en mot.
End of explanation
import random
def modification(phrase, allsyn, nmax=10):
    mots = phrase.split()
    options = []
    nb = 1
    for mot in mots:
        if mot in allsyn:
            options.append(list(set([mot] + list(allsyn[mot]))))
        else:
            options.append([mot])
        nb *= len(options[-1])
    if nb == 1:
        return [phrase]
    else:
        res = []
        for i in range(0, min(nmax, nb//2+1, nb)):
            sol = []
            for mot in options:
                h = random.randint(0, len(mot)-1)
                sol.append(mot[h])
            res.append(sol)
        return res
            
modification("chatouiller le cérébral", allsyn)
Explanation: On génère les phrases modifiées :
End of explanation
len(phrases)
with open("zadig_augmente.txt", "w", encoding="utf-8") as f:
    total = 0
    init = 0
    for i, phrase in enumerate(phrases):
        augm = modification(phrase, allsyn)
        init += 1
        for au in augm:
            f.write(" ".join(au) + "\n")
            total += 1
"total", total, "initial", init
Explanation: On traite tous les mots :
End of explanation
from pyensae.datasource import download_data
download_data("zadig_augmente.zip")
Explanation: Exercice : retrouver une partie des synonymes à partir du dernier fichier créé
Le fichier utilisé peut être généré à partir du code précédent ou utiliser cette version : zadig_augmente.zip.
End of explanation
<END_TASK>