20 - (Mini-projet) thème d'un texte
Vous avez vu quatre fondamentaux de la programmation (fonction, boucle bornée, instruction conditionnel et tableaux), nous allons pouvoir les utiliser en même temps pour commencer à réaliser des choses vraiment longues voire impossible à réaliser à la main.
Je présente donc ici une activité très détaillée, la plupart du temps il suffit de faire du copier-coller. Mais vous pourrez voir que vous avez bien progressé et qu'on peut maintenant faire des choses assez complexes lorsqu'on mélange toutes ces notions en même temps.
On retrouve bien entendu le principe "une tâche - une fonction".
Voyons si on peut connaître le thème d'un texte sans avoir à le lire réellement.
Evaluation ✎ : -
1 - Evaluer le thème d'un texte : les fonction basiques
Aucune des fonctionnalités vues ici n'est à connaître par coeur.
Il s'agit juste de vous le faire réaliser, pas de vous demander de savoir le refaire en DS.
Voyons comment trouver le thème d'un texte en analysant les mots qu'il contient pour tenter d'en déduire vaguement de quoi il parle. On pourrait tenter de trouver les catégories suivantes :
- compteur_amour,
- compteur_amitie,
- compteur_mort,
- compteur_guerre,
- compteur_politique,
- compteur_economie,
- compteur_famille,
- compteur_science,
- ...
Pour les textes, nous prendrons des textes de chansons par exemple. C'est assez facile à trouver sur le Web.
Pour ce TP, nous prendrons le texte d'une chanson de Stromae, comme cela tout le monde connait. Mais vous pouvez bien entendu faire la même chose avec n'importe quel texte..
Dans cette partie, nous allons voir comment réaliser deux fonctionnalités basiques :
- Le prédicat detecter_le_mot() : elle va détecter la présence d'un mot dans un texte donné et renvoyer
- La fonction generer_tableau_des_mots() : cette fonction va renvoyer un tableau contenant dans chaque case les mots contenus dans un string d'entrée :
- Si on lui envoie le string "hamburger, frite, mayo" pour détecter la malbouffe,
- elle va renvoyer le tableau ["hamburger", "frite", "mayo"]
01° Mettre le programme ci-dessous en mémoire. La constante TEXTE est un string multiligne pouvant contenir des guillemets : on utilise 3 guillemets (""") en tant que séquence d'ouverture du string et on finalise le string avec une autre séquence """.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 |
|
On retrouve les différentes parties d'un programme :
- D'abord les importations (aucune ici)
- Ensuite les CONSTANTES et les variables globales modifiées par les fonctions (uniquement le string TEXTE ici)
- Puis la déclaration des fonctions (aucune pour l'instant)
- Enfin, le programme principal en lui même.
Le programme est assez simple :
- Lignes 91 à 99 : on déclare et initialise un certain nombre de compteurs thématiques : ces variables vont s'incrémenter à chaque fois qu'un mot correspondant à un thème particulier apparaît.
- Lignes 101 à 104 : on incrémente le compteur compteur_mort si on détecte au moins une fois le string "mort" puis la même chose avec le mot "décès" car ils sont du champ lexical de la mort.
- Les lignes suivantes correspondent au même principe pour d'autres thèmes.
91
92
93
94
95
96
97
98
99 |
|
91
92
93
94 |
|
Deux mots par thème pour l'instant, ce n'est pas énorme.
02° Deux questions :
- Quels sont les deux mots associés au thème famille pour l'instant ?
- Le compteur compteur_famille devrait atteindre 2 puisque ces deux mots apparaissent dans le texte. Pourquoi le compteur n'atteint-il que 1 ?
>>> compteur_famille
>>> 1
...CORRECTION...
Les deux mots sont visibles lignes 111-113 : "papa" et "maman".
Pour le nombre, c'est facile lorsqu'on a vu le petit détail : à cause des majuscules !
Python est sensible à la casse : les strings "Papa" et "papa" sont deux strings différents.
Or, "papa" apparaît bien une fois, mais pas pas "maman". C'est "Maman" qui apparaît en ligne 8.
03° Utiliser ces instructions dans la console. Que constatez-vous sur
- le string new1 après application de la méthode lower() des strings, et
- le string new2 après application de la méthode upper() des strings ?
>>> TEXTE = "BoNJoUr à TOUS, et à tOutes !"
>>> TEXTE
'BoNJoUr à TOUS, et à tOutes !'
>>> new1 = TEXTE.lower()
>>> new1
???
>>> new2 = TEXTE.upper()
>>> new2
???
On remarquera qu'on utilise, comme avec le module turtle, des méthodes : des sortes de "fonctions" intégrées de base à certains types d'objets : ici les strings. La façon de les utiliser est toujours la même :
une_variable.une_methode()
...CORRECTION...
>>> TEXTE = "BoNJoUr à TOUS, et à tOutes !"
>>> TEXTE
'BoNJoUr à TOUS, et à tOutes !'
>>> new1 = TEXTE.lower()
>>> new1
'bonjour à tous, et à toutes !'
>>> new2 = TEXTE.upper()
>>> new2
'BONJOUR À TOUS, ET À TOUTES !'
Les deux méthodes portent donc bien leurs noms. Elles renvoient une nouvelle version du string, soit en minuscules (lowercase en anglais), soit en majuscules (uppercase en anglais).
Nous allons donc plutôt faire travailler nos recherches sur le texte transformé intégralement en minuscules pour être certain de trouver le mot : la recherche de Papa, PAPA, papa, ou pApA donnera de cette façon toujours un résulat positif puisqu'ils seront tous transformés en papa.
- "Papa".lowercase() renvoie "papa"
- "PAPA".lowercase() renvoie "papa"
- "papA".lowercase() renvoie "papa"
04° Utiliser le "nouveau" programme qui travaille sur une version en minuscules de la chanson : copier-coller et modifier uniquement les lignes 101 et plus pour modifier les anciennes lignes équivalentes. Obtient-on bien deux points pour le champ lexical de la famille ?
1
2
3
4
5
6
7
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116 |
|
...CORRECTION...
>>> famille
2
Oui, cette fois le programme a bien réussi à gérer la présence de "maman" même si il est présent sous la forme "Maman".
Par contre, vous pouvez remarquer qu'on utilise souvent le même type d'instructions sur les lignes 103 à 116. Il serait sans doute malin de réaliser une fonction pour automatiser tout cela.
05° Etude théorique, ne lancez pas le programme : Que renvoie la fonction detecter_le_mot() si le mot envoyé dans le paramètre mot est présent dans le paramètre texte ? Et si le mot n'est pas présent ?
89
90
91
92
93
94 |
|
...CORRECTION...
>>> famille
2
Si le mot est détecté, la fonction va renvoyer 1.
Si le mot n'est pas détecté, la valeur initiale de la réponse n'est pas modifiée et on renvoie donc 0.
06° Etude théorique également : on considère que le compteur compteur_famille vaut 0 initialement.
Que contient le compteur après exécution de la ligne 116 si on considère que le mot cherché est bien détecté ?
Que contient le compteur après exécution de la ligne 117 si on considère que le mot cherché est également présent ?
116
117 |
|
...CORRECTION...
En L116, on commence donc par lancer l'appel à la fonction. Elle répond 1 puisqu'on détecte le mot nous dit l'énoncé.
116 |
|
Ensuite, on évalue la variable compteur_famille qui fait référence à 0 pour l'instant.
116 |
|
Le calcul donne donc 1 et il ne reste plus qu'à l'affecter comme nouvelle valeur de la variable compteur_famille.
En L117, on commence donc par lancer l'appel à la fonction. Elle répond 1 puisqu'on détecte le mot nous dit l'énoncé.
117 |
|
Ensuite, on évalue la variable compteur_famille qui fait référence à 1 pour l'instant.
116 |
|
Le calcul donne donc 2 et il ne reste plus qu'à l'affecter comme nouvelle valeur de la variable compteur_famille.
07° Utiliser le nouveau programme pour vérifier qu'il réagit comme l'ancien. Attention à TEXTE que je n'ai pas reproduit intégralement.
1
2
3
4
5
6
7
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 |
|
Bon, c'est bien gentil deux mots par champ lexical mais si j'en veux plus ?
Dans ce cas, il va falloir taper beaucoup d'appels à la fonction detecter_le_mot()...
Comment faire mieux ? En plaçant les mots associés à un thème dans un tableau et lire une à une toutes les cases du tableau.
08° Placer ce nouveau programme en mémoire en remplacement total de l'ancien pour le moment. Répondre ensuite aux cinq questions suivantes :
1
2
3
4 |
|
- Que veut dire en français la ligne suivante en traduction "mot à mot" ?
- Que comprend l'interpréteur Python si vous tapez ceci ?
- Que comprend l'interpréteur Python lorsqu'on écrit ceci dans le programme :
- Que veut dire en français la ligne suivante en traduction "mot à mot" ?
- Expliquer pourquoi le programme affiche ceci :
3 |
|
4 |
|
4 |
|
3 |
|
guerre
conflit
arme
armement
blessé
tuerie
massacre
armée
militaire
bombe
...CORRECTION...
- Cette ligne veut dire "Pour chaque indice i variant de 0 au nombre de cases du tableau moins un".
- On le traduira plutôt par "Pour chaque indice possible du tableau"
- Avec print(i), on transmet juste i dans la fonction native print(). Python va donc comprendre qu'on lui demande d'afficher le NUMERO de la case.
- Avec print(mots_guerre[i]), on demande cette fois d'afficher le CONTENU de la case i du tableau mots_guerre.
- Puisque le tableau possède 10 cases, l'interpréteur va réaliser ceci :
3
4 | for i in range(10) : # pour i variant de 0 à 9
print(mots_guerre[i])
|
range(10) va générer l'ensemble d'indices suivant :
3
4 | for i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]: # on récupére dans i un par un les indices disponibles
print(mots_guerre[i])
|
Cela veut donc dire qu'on va exécuter la ligne 4 avec d'abord un indice de 0 :
4 | print(mots_guerre[0])
|
Puis un indice de 1 :
4 | print(mots_guerre[1])
|
Ect... jusqu'à atteindre la dernière valeur, 9 :
4 | print(mots_guerre[2])
print(mots_guerre[3])
print(mots_guerre[4])
print(mots_guerre[5])
print(mots_guerre[6])
print(mots_guerre[7])
print(mots_guerre[8])
print(mots_guerre[9])
|
09° Faire des recherches sur le Web, avec un moteur de recherche, en utilisant ces mots-clés :
- "champ lexical mort"
- "champ lexical guerre"
- "champ lexical amour"
- "champ lexical famille"
Vous devriez tomber assez facilement sur des sites proposant un ensemble de mots liés au thème cherché.
...CORRECTION...
Pour la mort, nous avons par exemple :
défunt,
cadavre,
résurrection,
tombeau,
cercueil,
agonie,
euthanasie,
vie,
dépouille,
deuil,
décès,
meurtre,
suicide,
pendu,
ressusciter,
posthume,
exécution,
Mânes,
tombe,
funèbre,
cimetière,
disparu,
supplice,
immortalité,
mourir,
vivant,
assassinat,
enterrement,
faucheuse,
autopsie,
mortel,
mortuaire,
noyé,
trépas,
enfer,
funéraire,
blessé,
perte,
strangulation,
survivant,
crémation,
éternité,
glas,
pendaison,
tué,
claqué,
noyade,
destruction,
immortel,
catastrophe,
disparition,
feu,
meurtrier,
ombre,
spiritisme,
tragique,
trépassé,
assassin,
Hadès,
paradis,
repos,
succession,
vieillesse,
corbillard,
dernier souffle,
extrême-onction,
funérailles,
funeste,
ivre,
mourant,
belle mort,
bourreau,
camarde,
fossoyeur,
inanimé,
macchabée,
mort-vivant,
Thanatos,
âme,
crevé,
désolation,
sépulture,
thanatologie,
enterré,
épitaphe,
porté disparu,
spectre,
taxidermie,
embaumement,
linceul,
martyr,
martyre,
matador,
métempsycose,
nécromancie,
religion,
Requiem,
vampire,
châtiment,
coroner,
dernier soupir,
guillotine,
mémoire,
néant,
poison,
sauver,
suicider,
apoptose,
évanoui,
infarctus du myocarde,
macabre,
nécrose,
relique,
survie,
torture,
assassiné,
bûcher,
canné,
désert,
échafaud,
fatigué,
foutu,
naze,
sépulcre,
chagrin,
charogne,
condamné,
crime,
empoisonnement,
malemort,
mort-né,
proscription,
pulsion,
puni,
régicide,
six pieds sous terre,
victime,
violente,
cénotaphe,
cinéraire,
décédé,
ensevelissement,
gisant,
limbe,
maladie,
messe,
mortalité,
nuit,
peine capitale,
pendre,
regretter,
venger,
cendre,
fosse,
gibet,
parque,
pécheur,
sommeil,
supplicié,
testament,
charnier,
commémoration,
danger,
ensevelir,
heure suprême,
piqûre,
prématurée,
purgatoire,
seuil,
veuve,
certaine,
décapité,
étranglé,
imminente,
menacer,
venin,
vie éternelle,
asphyxie,
Charon,
corps,
esprit,
exécuter,
foudroyant,
inerte,
post-mortem,
ruine,
achever,
anéantissement,
apothéose,
croque-mort,
crucifié,
crypte,
éteint,
exténué,
extinction,
fantôme,
morgue,
mors,
Nécrologie,
Odin,
péché,
pourriture,
Vallée de la mort,
attentat,
autre monde,
champ de bataille,
crématoire,
décapitation,
dernier adieu,
déterrer,
empoisonné,
génocide,
heure dernière,
inhumé,
intestat,
nécromasse,
nécrophile,
outre-tombe,
psychopompe,
regret,
repos éternel,
reste,
sarcophage,
suaire,
survivance,
valkyrie,
viatique,
accidentelle,
agonisant,
descente aux enfers,
douloureuse,
épuisé,
fin,
frôlé,
fusillade,
instantanée,
lente,
létal,
monument,
mortifère,
naissance,
nécrophilie,
oraison funèbre,
succéder,
suppression,
accident de la route,
atroces,
condamnation,
décimer,
délivrera,
élégie,
épouvante,
éternelle,
honorer,
incinération,
inhumation,
jonchée,
menace,
mort subite,
naufrage,
obsèques,
ossements,
peine,
pleurer,
présage,
souffrance,
surdose,
survenue,
terrible,
vaincu,
annoncée,
anticipée,
au-delà,
blessure,
coma,
condamnent,
cruel,
écroulement,
homicide,
horrible,
ignominie,
messager,
parricide,
sauveur,
tuant,
vengeance,
à plat,
aboutissement,
ankylosé,
apathique,
bienheureux,
bousillé,
brisé,
cassé,
chute,
conclusion,
décomposition,
défunction,
délavé,
dénouement
Pour la guerre, nous avons par exemple :
ennemi, conflit, paix, stratégie, guérilla, hostilité, bataille, militaire, artillerie, armement, tactique, expédition, famine, mobilisation, belligérant, après-guerre, armée, soldat, belliqueux, neutralité, camp, conquête, arme, invasion, lutte, guerre civile, indépendance, libération, stratégique, victoire, combat, guerroyer, croiseur, guerrier, campagne, coalition, offensive, stratège, conscription, état-major, frontière, incursion, révolution, alliance, Vichy, armistice, corsaire, cuirassé, flotte, maritime, nation, religion, sécession, territoire, attaque, belliciste, escadre, front, guerre mondiale, sous-marin, violence, catapulte, désarmement, insurrection, pacifique, Société des Nations, affrontement, amirauté, corvette, ghetto, punique, résistance, agression, civil, combattant, défense, diplomatie, djihad, extermination, génocide, impérialisme, mars, pacifiste, seconde guerre mondiale, trêve, ultimatum, belligérance, bombardement, cessez-le-feu, commandant, croisade, impérialiste, OTAN, Verdun, annexion, Arès, assaut, généralissime, infanterie, nucléaire, terrorisme, cavalerie, confédération, contre-torpilleur, dévastation, dissension, Grande Guerre, Napoléon, obus, allié, bellicisme, blocus, capitaine, déclaration de guerre, dictature, entre-deux-guerre, franco-allemande, kamikaze, munition, nationalisme, Péloponnèse, polémologie, prisonnier de guerre, Vercingétorix, bombe, envahisseur, force, fronde, galère, Hannibal, massacre, mobilisé, plan Marshall, porte-avion, propagande, représaille, Troie, bombardier, débarquement, déclarer, destroyer, gouvernement, pacifisme, aguerrir, capitulation, casus belli, fortification, fusil, guerre de Sécession, légion, meurtrière, puissance, riflette, royaume, champ de bataille, colonie, décolonisation, désastre, discorde, échec, engagement, géopolitique, guerre sainte, monarchie, ONU, opération, partisan, poilu, stalag, tomahawk, troupe, vaincre, atomique, bâtiment, commandement, conflagration, déclenchement, déclencher, destruction, fratricide, guerre d'extermination, Hitler, maréchal, occupation, perte, première guerre mondiale, prospérité, protectorat, ravagé, réparation, révolutionnaire, rivalité, sanglante, terreur, aviation, blitzkrieg, char, coloniale, combattre, Croix-Rouge, émeute, escarmouche, espionnage, exil, fascisme, harki, militarisme, Nuremberg, Pétain, renseignement, sans merci, Shoah, sino-japonaise, supériorité, torpille, Vietnam, Achille, camisard, convoi, crime, expéditionnaire, Hiroshima, lieutenant-colonel, Maginot, major, mémorial, milice, missile, nerf, parachutiste, pays, radar, ravitaillement, Rommel, superpuissance, vaincu, victorieux, agresseur, butin, chouannerie, duel, expansionniste, feu, honneur, insurgé, naval, pacification, patriotisme, pillage, soulèvement, spartiate, Armageddon, armer, collaboration, commander, disparu, division, domination, effectif, enjeu, épée, euromissile, expansion, garnison, hégémonie, indemnité, jeep, jour J, machine, martial, mener, négociation, neutre, Odin, opposition, possession, prendre, prisonnier, soutien, acharnée, aérien, approvisionnement, baïonnette, baliste, ban, Barbarossa, César, colonel, convention de Genève, déclaration, défensive, dispute, éclater, ensanglanter, épidémie, escorte, exploit, faction, forteresse, francisque
Le champs lexical de l'amour donne ceci :
amoureux, tendresse, amitié, baiser, Cupidon, Aphrodite, passion, Éros, désir, sentiment, amant, affection, idylle, Vénus, attachement, attirance, platonique, compassion, plaisir, charité, érotique, haine, relation, beauté, adoration, aimer, philtre, altruisme, amourette, bien-aimé, érotisme, joie, mariage, romantique, courtois, émotion, déesse, éternel, luxure, bonheur, conjugal, jalousie, psyché, cœur, filial, fraternel, charnel, chaste, sexualité, dévotion, ivresse, philanthropie, amour platonique, couple, fidélité, flamme, tendre, sincère, volupté, Dieu, idolâtrie, piété, souffrance, troubadour, chant, chasteté, désespoir, libertinage, romantisme, solitude, désamour, poésie, sacrifice, mépris, poème, sensualité, sexuel, chagrin, feu, loyauté, Marivaux, romance, épris, hymen, séduction, âme, dilection, lyrique, ode, thème, abnégation, bagatelle, bien-aimée, chanson, conquête, déclaration, désintéressement, fou, indifférence, passionné, adultère, amor, enchantement, femme, inceste, mystique, passionnel, paternel, respect, romanesque, concupiscence, heureux, Juliette, Musset, sonnet, tourment, tristesse, agapè, follement, fraternité, infini, mari, maternel, narcissisme, sentimental, adorable, ardeur, baise, chevaleresque, drame, égoïste, étreinte, fille, jeunesse, malheur, mélancolie, nymphe, tragique, volage, admiration, charme, coït, époux, ferveur, folie, générosité, Hélène, intrigue, Jésus, poète, tragédie, accouplement, Adonis, amour maternel, amoureusement, caprice, contemplation, coup de foudre, éprouver, héroïne, homosexuel, intimité, timide, Tristan, vénération, affective, Andromaque, aventure, confidente, coquetterie, délice, extase, galanterie, rédemption, adolescent, amante, ami, carquois, désintéressé, divin, égoïsme, enflammer, fidèle, film, gloire, hyménée, idéal, idyllique, mère, véritable, virginité, beau, cour, dévouement, garçon, immodéré, inconstance, Lancelot, naissant, récit, sensuel, aphrodisiaque, badinage, Boccace, chéri, coquin, fleurette, Héra, malheureux, mutuel, Thésée, ange, berger, croire, culte, débauche, délicatesse, effusion, élan, enivrant, enthousiasme, estime, exprimer, fée, homosexualité, Horace, inclination, mysticisme, partagé, penchant, petit copain, pulsion, relation amoureuse, rut, soupirant, sympathie, bisou, Chimène, coucher, cruel, Dante, effréné, fiançailles, foi, foutre, gaieté, Hippolyte, infidélité, inquiétude, jaloux, love, Phèdre, pitié, premier amour, Rodrigue, sacrifier, Saint-Valentin, sans espoir, sexe, sincérité, Truffaut, zoophile, Astarté, aveugle, belle âme, bonté, caresse, chérir, compagne, confidence, débordant, inaltérable, incommensurable, instinctif, intérêt, lyrisme, peinture, réciproque, rédempteur, roman, Roméo, sagesse, soufi, Stendhal, vénal, aimable, Antéros, ardent, billet doux, consume, copulation, courage, enchanteur, espérance, exaltation, fantôme, fol, folle, fusionnel, Héloïse
Pour la famille, nous avons par exemple :
parenté, filiation, familial, dynastie, généalogie, ménage, tribu, parent, clan, mère, maison, lignée, patriarche, ancêtre, entourage, oncle, enfant, sang, foyer, ordre, branche, père, souche, descendance, fratrie, frère, lignage, aîné, matriarcat, naissance, originaire, sœur, tante, grand-mère, grand-père, issu, neveu, rejeton, arbre généalogique, genre, mariage, vendetta, maisonnée, race, alliance, cousin, fille, grand-parent, prénom, sous-famille, subvenir, appartenant, beau-frère, beau-père, nièce, Benjamin, blason, héritage, mari, amérindien, caste, descendant, héréditaire, feu, inceste, nichée, belle-mère, belle-sœur, bercail, célibataire, cousine, demi-sœur, paternelle, chef de famille, membre, patrie, pension, progéniture, régnante, soutien, adoptive, amitié, dot, gendre, hôtel, modeste, nobiliaire, patricien, patronyme, propriété, bourgeoise, décès, espèce, hérédité, lien, noble, repas, résidence, aristocratique, cadette, couvée, époux, familier, patriarcat, seigneur, smala, sous-ordre, taxon, budget, communauté, composé, femme, génération, matriarche, nombreuse, nourrir, parrain, phratrie, aimante, aisée, aristocratie, condoléance, consanguinité, enfance, fief, fortune, groupe, impériale, logis, misère, oligarchie, racine, riche, surnom, bon père, caractère, de père en fils, défunt, éducation, honte, issue, orphelin, réunie, richissime, seigneurial, faire vivre, fonder, grand-oncle, hospitalité, individu, marié, monarchie, opprobre, paroisse, analogie, couple, demi-frère, fils, frères et sœurs, héritier, origine, princière, veuf, adoption, aïeul, arrière-grand-père, bru, cinéraire, classe, dernier-né, descendre, jeune, maternel, nom, orphelinat, parentèle, patrilinéaire, peuple, réunion, société, sous-espèce, tata, toit, troglodyte, union, amis, ascendance, chat, degré de parenté, déplacée, famille recomposée, fou, grand-tante, isolat, lieu, ménagère, monoparentale, portrait, proche, réveillon, sous-classe, taxinomie, tonton, venger, aînesse, cadet, chef, coutume, dans le besoin, émigrer, généalogique, gens, gouvernante, langue maternelle, matante, mononcle, noblesse, notaire, orpheline, parentalité, patriarcale, peuplade, prince, propriétaire, vacance, armoiries, attachement, catégorie, collection, décimée, deuil, fermier, fiançailles, gotha, mafieuse, médecin, nom vernaculaire, petit-fils, petits-enfants, plébéienne, précepteur, veuve, vivait, arrière-grand-mère, caveau, drame, enterrement, exil, marmaille, partager, pensionnat, persécutée, pieuse, reine, royal, Simpson, sous-genre, suite, abri, agnation, association, attroupement, belle-tante, bel-oncle, bloc, chez-soi, cognation, collectif, collège, communion, conjugal, coterie, décédé, demeure, déshonneur, ensemble, éplorée, essaim, extraction, familiariser, famille nombreuse, famille nucléaire, filleul, frère plein, garçon, gent, grappe, groupe familial, homoparentale, horde, ligne, mifa, monogamie, nettoyage, patrimoine, patronymique, peloton, portée, postérité, postnom
Voyons maintenant comment convertir ce texte (un string) en tableau : je n'ai aucunement l'intention de tout faire à la main.
Nous allons faire deux choses :
- Supprimer les virgules en le remplaçant par une chaîne vide ("," deviendrait ""). Nous utiliserons la méthode des strings nommée replace() (remplacer en français).
- Placer chaque mot dans une des cases d'un tableau avec la méthode des strings split() (séparer en français) qui permet de diviser un string en plusieurs parties en utilisant le séparateur indiqué et de placer les morceaux dans un tableau.
10° Placer ce nouveau programme en mémoire à la place de l'ancien. Lancer le programme, il permet de visualiser ce que provoque la méthode replace(). Répondre ensuite aux questions.
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
|
Le résultat que vous devez visualiser dans votre éditeur :
----AVANT----
parenté,
filiation,
familial,
dynastie,
généalogie,
ménage,
----APRES----
parenté
filiation
familial
dynastie
généalogie
ménage
Questions
- Quelle est la différence entre les deux affichages ?
- Sur quelle ligne crée-t-on le nouveau string, copie du précédent mais sans les virgules ?
- A quoi sert le \n qu'on transmet à la fonction native print() en ligne 13 ?
...CORRECTION...
- AVANT, il y a des virgules. APRES, les virgules ont été remplacées par '' et ont donc disparu.
- C'est la ligne 11 qui réalise ce remplacement :
- Le symbole \n est le caractère qui permet de représenter le passage à la ligne. C'est pour cela qu'il y a un espace entre le dernier mot de AVANT et la présence de la ligne ----APRES----.
11 |
|
13 |
|
En réalité, le string contient donc de multiples passages à la ligne encodépar \n ou même par ↲ de façon symbolique.
----APRES----
parenté\n
filiation\n
familial\n
dynastie\n
généalogie\n
ménage\n
Comment transformer ce string (qui comporte des passages à la ligne) en tableau où chaque case contient un mot. Et bien, c'est facile si on se rend compte que chaque mot est séparé des autres par le caractère de passage à la ligne. On pourra l'utiliser comme séparateur logique entre deux mots.
11° Lancer le programme ci-dessous qui vous permet de visualiser ce que provoque la méthode split(). Répondre ensuite aux questions.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 |
|
Vous devriez obtenir l'affichage suivant :
----AVANT----
parenté,
filiation,
familial,
dynastie,
généalogie,
ménage,
----APRES----
parenté
filiation
familial
dynastie
généalogie
ménage
----AU FINAL----
['parenté', 'filiation', 'familial', 'dynastie', 'généalogie', 'ménage']
Questions
- Quel est le type Python de la variable string_mots_famille ?
- Quel est le type Python de la variable tableau_mots_famille ?
- Que vaut tableau_mots_famille[0] ?
- Que vaut tableau_mots_famille[1] ?
- Les passages à la ligne sont-ils encore présents dans les données du tableau ?
...CORRECTION...
- Quel est le type Python de la variable string_mots_famille ?
- Quel est le type Python de la variable tableau_mots_famille ?
- Que vaut tableau_mots_famille[0] ?
- Que vaut tableau_mots_famille[1] ?
- Les passages à la ligne sont-ils encore présents dans les données du tableau ?
Il s'agit d'un string, le type str de Python. On peut s'en convaincre en tapant ceci dans la console :
>>> type(string_mots_famille)
Il s'agit d'un tableau qui est, en Python, le type list. On peut s'en convaincre en tapant ceci dans la console :
>>> type(tableau_mots_famille)
Cette expression doit renvoyer l'élément d'indice 0 du tableau. La première case donc. Elle contient le string 'parenté''.
Cette expression doit renvoyer l'élément d'indice 1 du tableau. La deuxiéme case donc. Elle contient le string 'filiation'.
Et non ! Les passages à la ligne ont servi de SEPARATEUR. Ils n'apparaissent donc plus dans les valeurs stockées dans le tableau.
Il nous reste à tout simplement encapsuler cela dans une fonction.
12° Réaliser la fonction generer_tableau_des_mots() qui reçoit un string nommé string_des_mots et parvient à supprimer les virgules puis crée un tableau composé de mots EN MINUSCULES, en utilisant ce qu'on a envoyé dans le paramètre separateur comme élément séparateur des mots.
Voici son prototype :
2 |
|
Voici le programme à compléter. La fonction renvoie pour l'instant systématiquement un tableau vide.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
|
...CORRECTION...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
|
Maintenant que nous savons créer un tableau contenant les mots qui nous intéresse pour surveiller un champ lexical, nous allons pouvoir créer un fonction evaluer_theme()
- qui va recevoir
- le texte qu'on veut étudier et
- un tableau contenant les mots du champ lexical voulu
- qui renvoie un compteur contenant le nombre de mots détéctés : la fonction va chercher tous les mots du thème et incrémenter un compteur dès qu'elle trouve ce mot !
2 - Evaluer un thème
Nous allons donc maintenant utiliser les deux fonctions basiques précédentes (detecter_le_mot() et generer_tableau_des_mots()) pour réaliser une tâche plus complexe : détecter automatiquement tous les mots du thème qui apparaissent dans le texte étudié.
Pour alléger un peu les choses, nous allons commencer par créer trois fichiers Python qu'il faudra placer dans un même dossier. De cette faàon, nous pourrons utiliser le principe des adresses relatives.
📁 dossier_de_votre_activite
📄 texte.py (question 13)
📄 mots.py (question 14)
📄 projet.py (question 15)
13° Créer le script Python texte.py en utilisant les lignes ci-dessous.
Attention au nom du fichier et à sa localisation !
Il faudra y placer le texte que vous voulez étudier.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 |
|
14° Télécharger le fichier mots.py. Le placer dans le même dossier que le fichier précédent.
15° Créer le script Python projet.py en utilisant les lignes ci-dessous.
Attention au nom du fichier et à sa localisation !
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 |
|
Questions
- Que contient t_famille si vous l'évaluez dans la console après avoir lancé ce programme ?
- Au début du programme (lignes 3 à 8), dans quelles CONSTANTES sont contenues les strings contenant les mots ? Avec quel mot-clé demande-t-on d'aller les chercher dans un autre fichier Python ?
- Sur quelle ligne transforme-t-on le string des mots associés à la famille en tableau de mots ?
...CORRECTION...
- Que contient t_famille si vous l'évaluez dans la console après avoir lancé ce programme ?
- Dans quoi sont contenus les strings contenant les mots ? Avec quel mot-clé demande-t-on d'aller les chercher dans un autre fichier Python ?
- Sur quelle ligne transforme-t-on le string des mots associés à la famille en tableau de mots ?
La variable contient bien la liste des mots associés à ce thème.
Dans les constantes nommés MOTS_.... Les strings ne sont d'ailleurs pas contenus dans le fichier lui-même mais dans le script nommé mot.py. On notera d'ailleurs qu'on ne place pas le .py puisqu'il doit s'agir d'un script Python. On note juste mot
Pour importer des choses depuis d'autres scripts, on utilise le mot-clé import.
33 |
|
Maintenant, vous avez un projet fonctionnel séparé en trois fichiers
- Un script contenant le texte qu'on veut étudier.
- Un script contenant les mots des champs lexicaux à surveiller.
- Un script qui contient notre programme lui-même.
16° Réaliser (à partir de la ligne 26 et plus du script projet.py) la fonction evaluer_theme() dont voici le prototype :
26 |
|
Cette fonction devra :
- Convertir le texte reçu en minuscules et placer cette nouvelle version dans texte
- Créer un compteur nb_detection qui permettra de comptabiliser le nombre de mots cherchés détectés dans le texte (n'oubliez pas qu'à chaque fois qu'on crée un compteur, il faut l'initialiser à 0, l'ordinateur ne peut pas le faire de lui-même)
- Pour chaque indice i disponible dans le tableau mots_cherches
- Incrementer le compteur nb_detection en utilisant la réponse de la fonction detecter_le_mot() sur le mot contenu dans la case i de mots_cherches : mots_cherches[i].
- Répondre en renvoyant le compteur nb_mots
Voici un exemple d'utilisation sur la chanson de Stromae :
>>> evaluer_theme(t_famille, TEXTE)
6
...CORRECTION...
1
2
3
4
5
6
7 |
|
17° Nous avons tester le champ lexical de la famille avec l'appel précédent. Réaliser maintenant les appels nécessaires à la fonction evaluer_theme de façon à parvenir à évaluer les champs lexicaux de l'amour, de la guerre, de la science et de l'économie. Parvenons nous à percevoir les thèmes principaux de la chanson de Stromae
...CORRECTION...
>>> evaluer_theme(t_famille, TEXTE)
6
>>> evaluer_theme(t_amour, TEXTE)
1
>>> evaluer_theme(t_mort, TEXTE)
4
>>> evaluer_theme(t_science, TEXTE)
3
>>> evaluer_theme(t_economie, TEXTE)
1
Les appels permettent de voir que le thème de la famille et le thème de la mort sont les deux thèmes les plus marqués. Au final, sa chanson parle bien de la cela : de la famille et de la mort de son espoir d'avoir ses deux parents.
Le programme n'est bien entendu par très performant pour le moment :
- Il ne gère que 5 thèmes
- Les mots n'ont pas du tout été vérifiés : certains mots sont présents dans certains champs lexicaux sans qu'on sache vraiment pourquoi...
- Rien n'empêche que certains mots de thème soient présents deux fois, ou trois... Cela pourrait fausser les résultats.
- On vérifie juste que la chaîne est présente : "vert" va être detecté si on rencontre le mot "vertical" dans le texte étudié.
Bref, ce n'est pas parfait. Une réalisation plus propre pourrait être l'occasion d'un vrai projet en autonomie.
18° Récupérer un article ou le texte d'un roman et lancer le programme sur votre texte. On faudra bien entendu remplacer le contenu de la constante TEXTE du fichier texte.py par votre propre texte.
A titre d'exemple, j'ai lancé le programme sur un article du CRNS parlant de la première "photo" d'un trou noir.
Voici le texte tiré du site précédent qu'on pourrait placer dans le script :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
|
Et voici le résultat de l'"analyse".
>>> evaluer_theme(t_famille, TEXTE)
17
>>> evaluer_theme(t_amour, TEXTE)
8
>>> evaluer_theme(t_mort, TEXTE)
17
>>> evaluer_theme(t_science, TEXTE)
26
>>> evaluer_theme(t_economie, TEXTE)
3
On voit bien qu'il s'agit d'un article scientifique.
A vous de jouer sur votre propre texte.
3 - -
4 - FAQ
Du coup, on peut tester le type des variables ?
Oui. Les deux manières de faire les plus courantes sont fournies ci-dessous :
Première méthode : tester le type de la variable.
>>> a = 5.0
>>> type(a) == float
True
>>> type(a) == int
False
>>> type(a) == str
False
>>> a = "5.0"
>>> type(a) == float
False
>>> type(a) == int
False
>>> type(a) == str
True
Deuxième façon de faire : utiliser la fonction native isinstance.
>>> a = 5
>>> isinstance(a, float)
False
>>> isinstance(a, int)
True
>>> isinstance(a, str)
False
Activité publiée le 13 11 2021
Dernière modification : 07 09 2024
Auteur : ows. h.