<jupyter_start><jupyter_text>Un traducteur anglais-français très imparfaitL’objectif de cet exercice est de fournir, à partir de WordNet et d’une liste de tokens au format mot/étiquette, la traduction d’un terme anglais en français.Le premier paragraphe du *The Cat in the Hat* du Dr. Seuss servira de référence :<jupyter_code>text = "The/DT sun/NN did/VBD not/RB shine/VB ./. It/PRP was/VB too/RB wet/JJ to/TO play/VB ./."<jupyter_output><empty_output><jupyter_text>TokenisationLe paragraphe dans l’objet `text` étant déjà étiqueté, la tokenisation est nettement simplifiée. En utilisant la méthode `split()`, produisez une variable `tokens` qui enregistre les différents tokens du paragraphe dans une liste de tuples au format `(word, tag)`.<jupyter_code># Your code here
from nltk.tag import str2tuple
tokens = [ str2tuple(t) for t in text.split() ]<jupyter_output><empty_output><jupyter_text>LemmatisationWordNet permet de lemmatiser un mot à partir de son étiquette grammaticale, à partir du moment où elle fait partie des quatre grandes catégories : *a* (adjectif), *n* (nom), *r* (adverbe), *v* (verbe).En vous aidant de la fonction `map_pos()` qui fait la correspondance entre les étiquettes par défaut et celles prises en compte par WordNet, obtenez une liste de tuples sous la forme `(lemma, tag)`.<jupyter_code>def map_pos(tag):
    """Map a treebank tag with the WordNet part-of-speech tags.

    tag -- tag in treebank style
    """
    if tag.startswith('J'):
        return 'a'
    elif tag.startswith('V'):
        return 'v'
    elif tag.startswith('N'):
        return 'n'
    elif tag.startswith('R'):
        return 'r'
    else:
        return False
# Your code here
from nltk.stem import WordNetLemmatizer

# Instanciate a lemmatizer
lemmatizer = WordNetLemmatizer()

lemmas = list()

for word, tag in tokens:
    tag = map_pos(tag)
    if tag:
        lemma = lemmatizer.lemmatize(word, pos=tag)
        lemmas.append( (lemma, tag) )<jupyter_output><empty_output><jupyter_text>Une liste de synsetsLes *synsets* de WordNet étant traduits en français, construisez un dictionnaire avec, pour chaque lemme, la liste de ses *synsets*.<jupyter_code># Your code here
from nltk.corpus import wordnet

d = {
    lemma: wordnet.synsets(lemma, pos=tag)
    for lemma, tag in lemmas
}<jupyter_output><empty_output><jupyter_text>TraductionIl ne reste plus, pour chaque lemme, qu’à traduire ses *synsets* en français. Intégrez le tout dans un dictionnaire où, pour chaque lemme anglais, on a une liste de traductions possibles.<jupyter_code># Your code here
from collections import defaultdict

translations = defaultdict(list)

for lemma, synsets in d.items():
    for synset in synsets:
        translations[lemma] = synset.lemma_names('fra')<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.09198706431908013, 'fraction_numerical': 0.0007186489399928135, 'mean_word_length': 4.458823529411765, 'pattern_counts': {'":': 0, '<': 21, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '5', 'dir': 'jupyter-structured-clean-dedup', 'id': '326427', 'license': 'MIT', 'n_tokens_mistral': 955, 'n_tokens_neox': 960, 'n_words': 327, 'path': '6.text-processing/answers/4.a-very-defective-translator.ipynb', 'repo_name': 'mdjamina/python-M1TAL', 'size': '2783'}