2022 MP Informatique
2022 MP Informatique
Parmi les suggestions suivantes choisissez celles qui sont des termes SQL :
(a) append.
Tronc du QCM (Statement) (b) import.
Distracteurs
(c) having.
(d) create.
Correctes
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 1/13
Toute question appartenant à un Quiz est notée sur 1 point.
Au cours du passage du Quiz un candidat doit distinguer la ou les proposition(s) qu’il juge
exacte(s) en les choisissant, de celles qu’il juge distracteurs.
À la fin du passage d’un Quiz, un score est calculé pour décider si un candidat est digne de
certification.
Le score est la somme des notes obtenues dans toutes les questions du Quiz.
Le tableau suivant présente le barème adopté pour la notation d’une question QCM.
Tableau 1 : Barème de notation d'une question QCM.
Notation Par réponse correcte Par réponse incorrecte
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 2/13
Corpus : un corpus D est une collection de documents.
D d0 , d1 , d2 , d3 , , dnskills 1
Où chaque d i contient le lexique relatif à un domaine de compétence spécifique skillsi . Par
exemple, le document d1 "else while : in while" est associé à la compétence
skills1 "python".
On convient de représenter un corpus par un dictionnaire nommé corpus où ses clés sont les
compétences skillsi et ses valeurs sont les documents associés d i .
Exemple 2 :
corpus = {"python" : "else while : in while", "sql": "select insert select
* in"}
Terme : un terme est un mot relatif à un champ lexical. Par exemple, "else" est un terme
relatif au champ lexical de la compétence "python", tandis que "in" est un terme commun
des deux champs lexicaux des compétences "python" et "sql".
À ce niveau, il est important d’introduire les formules propres aux mesures TF-IDF :
TF_IDF est une mesure qui quantifie le degré d’importance du terme t j pour le document d i
(associée à la compétence skillsi ). Elle est proportionnelle à la fréquence du terme t j dans le
document d i et inversement proportionnelle au nombre d’autres documents dk telque k i
contenant ce même terme t j . Cette mesure est calculée comme suit :
tf _ idf (t j , skillsi ) tf _ idf (t j , di ) tf (t j , di ) idf (t j )
Équation 1 : Formule TF_IDF
Équation 2 : Formule TF
nskills
idf (t j ) log
nombre de documents d k dans D contenant t j
Équation 3 : Formule IDF
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 3/13
Vocabulaire : un vocabulaire est composé de tous les termes distincts parus dans les
documents du corpus. On convient de représenter un vocabulaire par le vecteur vocab de
taille nterms.
vocab t0 t1 tnterms 1
L’application de l’étape 2 sur le corpus permet de produire le vocabulaire vocab.
Exemple 6 :
vocab = [Link](["else", "in", "insert", "select", "while"])
L’étape 4, exploite la matrice tf_idf_mat et le vecteur idf_vect qui ont été appris à partir du
corpus pour inférer les skills ciblés par une question d’un Quiz. Le texte du tronc de cette
question qtxt subit les mêmes étapes de prétraitements que les documents du corpus afin de
produire le dictionnaire qdoc, ce dernier est utilisé pour calculer le vecteur qtf en appliquant
la formule suivante :
qtf j tf (vocab j , qdoc) 0 j nterms
Équation 7 : Vecteur qtf
qtf est multiplié terme à terme avec le vecteur idf_vect afin de produire le vecteur qtf_idf :
qtf _ idf j qtf j idf _ vect j 0 j nterms
Équation 8 : Vecteur qtf_idf
Exemple 8 :
Pour une question de type QCM ayant le tronc :
qtxt = "while ... else: est une structure de :"
Les vecteurs associés sont :
qtf = [Link]([1/2, 0, 0, 0, 1/2])
qtf_idf = [Link]([[Link](2)/2, 0, 0, 0, [Link](2)/2])
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 4/13
L’étape 5, est l’étape finale d’inférence des compétences visées par le tronc d’une question
donnée. Elle consiste à récupérer dans l’ordre les skills représentés par les lignes de la matrice
tf_idf_mat selon leurs similarités par rapport au vecteur qtf_idf. Cette similarité est
quantifiée en utilisant la similarité cosinus définie par :
x, y
cos_ sim( x, y )
x. y
où :
x , y i 0
nterms 1
xi yi
: Produit scalaire entre x et y
Les différentes similarités entre les lignes de la matrice tf_idf_mat et le vecteur qtf_idf sont
stockées dans un vecteur nommé qsim de taille nskills tel que :
qsimi cos_sim(tf _ idf _ mati , qtf _ idf ) 0 i nskills
Équation 10 : vecteur qsim
Exemple 9 :
Pour les vecteurs qtf_idf et la matrice tf_idf_mat :
cos_sim(qtf_idf, tf_idf_mat[0]) donne 0.95
cos_sim(qtf_idf, tf_idf_mat[1]) donne 0
Ceci résulte :
qsim = [Link]([0.95, 0])
À partir du vecteur qsim on détermine le vecteur stochastique sqsim de taille nskills
contenant les pourcentages de certitude des compétences en appliquant la transformation
suivante :
qsimi
sqsimi nskills 1
0 i nskills
k 0
qsimk
Exemple 10 :
sqsim = [Link]([1.0, 0.0])
Ceci conduit vers la conclusion que la question qtxt vise le domaine de compétence
"python".
Travail demandé :
Dans la suite :
Les fonctions demandées seront écrites en langage Python en utilisant impérativement
la nomenclature donnée par le Tableau 2 (voir Annexe 1).
Le module numpy est importé par import numpy as np.
1. Écrire la fonction is_alpha qui prend en entrée word, retourne True si et seulement si
word est formé uniquement par des lettres alphabétiques minuscules et False sinon.
L’appel is_alpha("python") donne True.
L’appel is_alpha("ieee754") donne False.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 5/13
2. Écrire la fonction preprocess qui prend en entrée txt et vocab (paramètre
optionnel, prend None par défaut). La fonction retourne le dictionnaire doc en appliquant
les étapes suivantes :
a. transformer txt en minuscules puis le découper en une liste words contenant ses
mots ;
b. éliminer de words les mots non alphabétiques si vocab est None sinon, éliminer les
mots ne figurant pas dans vocab ;
c. construire doc où :
- les clés sont les mots de words
- les valeurs sont les fréquences divisées par le nombre total de mots dans words
(voir Équation 2).
L’appel preprocess('else while IN while a32') donne : {'else': 0.25,
'in': 0.25, 'while': 0.5 }
L’appel preprocess('else while IN while a32',[Link](["as","else",
"in"]) donne : {'else': 0.5, 'in': 0.5}
3. Écrire la fonction transform qui prend en entrée corpus et retourne le dictionnaire
tcorpus en utilisant la fonction preprocess (voir Exemples 2 et 3).
4. Écrire la fonction get_vocab qui prend en entrée tcorpus et retourne le vecteur vocab
(voir Exemple 6).
5. Écrire la fonction get_skills qui prend en entrée tcorpus et retourne le vecteur skills
(voir Exemple 1).
6. Écrire la fonction get_tf_vect qui prend en entrée vocab et doc, retourne le vecteur
tf_vect (voir Exemple 4).
7. Écrire la fonction get_tf_mat qui prend en entrée vocab, skills et tcorpus,
retourne la matrice tf_mat (voir Équation 5 & Exemple 7).
8. Écrire la fonction get_idf_vect qui prend en entrée la matrice tf_mat et retourne le
vecteur idf_vect (voir Équation 6 & Exemple 7).
9. Écrire la fonction cosine_sim qui prend en entrée tf_idf_mat et q_tf_idf,
calcule puis retourne le vecteur sqsim (voir Équations 9, 10 et 11 & Exemples 8, 9 et 10).
10. Écrire la fonction find_skills qui prend en entrée 5 paramètres : qtxt, skills,
vocab, tf_idf_mat, tf_idf et idf_vect. La fonction retourne un dictionnaire
sim_skills où :
- les clés sont les domaines des compétences du vecteur skills.
- les valeurs sont des pourcentages des similarités.
sim_skills est construit comme suit :
a. construire qdoc le texte de la question prétraitée en utilisant la fonction
preprocess appliquée sur qtxt et vocab ;
b. créer le vecteur qtf (voir Équation 7) ;
c. calculer le vecteur qtf_idf (voir Équation 8) ;
d. calculer le vecteur sqsim contenant la similarité entre qtf_idf et chaque ligne de
tf_idf_mat ;
e. utiliser sqsim pour construire le dictionnaire sim_skills.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 6/13
Partie II : Programmation orientée objet
L’objectif de cette partie est d’implémenter les deux classes :
- SearchEngine
- QCM
Description des classes :
- Classe SearchEngine :
Rôle :
Cette classe représente un moteur de recherche qui utilise le modèle TF-IDF pour représenter
les glossaires d'un corpus de compétences et expose des méthodes permettant de chercher
le(s) domaine(s) de compétences le(s) plus proche(s) d'une question donnée qtxt.
Attributs :
Vocab : vecteur contenant les termes du corpus ;
Skills : vecteur contenant les domaines de compétences du corpus ;
idf_vect : vecteur contenant les idf des termes de vocab :
tf_id_mat : matrice contenant les tf_idf de tous les termes du vocab par
rapport à chaque glossaire du corpus.
Méthodes :
__init__(…) : permet de créer une nouvelle instance à partir du dictionnaire
corpus passée en paramètre.
ml_skills(…) : qui à partir des deux paramètres qtxt et n ayant comme valeur
par défaut 3 retourne une liste de n tuples tel chaque tuple contient le domaine de
compétences le plus proches de qtxt ainsi que son pourcentage de similarités.
ml_skill(self, qtxt): qui à partir du paramètre qtxt retourne le domaine de
compétences le plus proche.
- Classe QCM :
Rôle :
Cette classe représente une question d'un Quiz avec le tronc principal de la question
(statement), les différentes propositions (props) ainsi que leurs véracités (veracities). Elle
expose des méthodes permettant d'initialiser, de représenter textuellement et de calculer le
score des tentatives de réponses.
Attributs :
skill : domaine de compétence associé à la question ;
statement : tronc principal de la question ;
props : liste contenant les différentes propositions de réponses de la question ;
veracities : liste contenant les véracités des propositions.
Méthodes :
__init__(…) : permet de créer une nouvelle instance à partir de 4 paramètres
relatifs aux attributs.
__str__(…) : permet de retourner une représentation textuelle de la question
conformément au format illustré dans la Figure 1.
score(…) : qui à partir du paramètre ans contenant les lettres alphabétiques
séparées par des espaces associées aux propositions choisies par le candidat retourne le
score de sa réponse selon la méthode de notation du Tableau 1.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 7/13
Travail demandé :
Pour la classe SearchEngine :
1. Écrire la méthode __init__.
2. Écrire la méthode ml_skills.
3. Écrire la méthode ml_skill.
Pour la classe QCM :
4. Écrire la méthode __init__.
5. Écrire la méthode __str__.
6. Écrire la méthode score.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 8/13
DetailQuiz (#idQuiz, #idQs)
La table DetailQuiz enregistre les questions relatives à un Quiz ;
- idQuiz : identifiant d’un Quiz, clé étrangère qui fait référence à la table Quiz ;
- idQs : identifiant d’une question, clé étrangère qui fait référence à la table Question ;
NB : idQuiz et idQs ensembles forment la clé primaire de la table DetailQuiz.
1.
veracite 1 Question
tronc , textProp
idQs
Proposition
2.
idQs
idQuiz 3
DetailQuiz idQs
idQuiz 20
DetailQuiz
III.2. SQL
Travail demandé :
Exprimer en SQL les requêtes suivantes permettant de :
1. Créer la table Proposition en respectant les contraintes d’intégrité spécifiées dans le
schéma relationnel.
Dans la suite on suppose que les tables sont créées et remplies.
2. Ajouter la question d’identifiant 17546 au Quiz d’identifiant 228.
3. Supprimer les questions dont les dates de création sont antérieures à l’année 2012.
4. Déterminer les informations des Quiz qui ne seront plus en vigueur à partir
d’aujourd’hui sachant qu’une date peut être comparée à la valeur de retour de la
fonction current_date qui représente la date courante.
5. Déterminer les identifiants, troncs et propositions des questions qui n’ont jamais été
assignées dans des Quiz.
6. Déterminer les troncs des questions QCM qui proposent plus que 4 réponses possibles.
7. Déterminer les identifiants des Quiz qui ne proposent pas des questions de type
Vrai/Faux.
III.3. Sqlite3
Dans ce qui suit on propose d’implémenter en Python des fonctions permettant d’élaborer des
statistiques sur la base de certification. Pour cela on ajoute au schéma relationnel précédent
les tables suivantes :
Candidat (idCand, nom, prenom, email, pwd)
La table Candidat enregistre les informations relatives aux candidats.
- idCand : identifiant du candidat de type chaîne, clé primaire ;
- nom : nom du candidat de type chaîne ;
- prenom : prénom du candidat de type chaîne ;
- email : adresse mail du candidat de type chaîne ;
- pwd : mot de passe du candidat de type chaîne ;
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 9/13
Tentative (voucher, #idCand, #idQuiz, datehDeb, datehFin, scoreG)
La table Tentative enregistre les informations générales qui concernent un passage d’un
examen de certification par un candidat suite à l’achat d’un voucher.
- voucher : identifiant délivré à tout candidat ayant payé des frais et désirant passer une
certification, de type chaîne, clé primaire ;
- idCand : identifiant d’un candidat, clé étrangère qui fait référence à la table Candidat ;
- idQuiz : identifiant d’un Quiz, clé étrangère qui fait référence à la table Quiz ;
- datehDeb : date et heure début de passage de l’examen de certif par le candidat, de
type datetime ayant le format ‘AAAA-MM-JJ hh :mm :ss’ ;
- datehFin : date et heure fin de passage de l’examen de certif par le candidat, de type
datetime ayant le format ‘AAAA-MM-JJ hh :mm :ss’ ;
- scoreG : score obtenu par le candidat sur la base de ses réponses aux questions
proposées, de type réel ;
- voucher : identifiant d’une tentative, clé étrangère qui fait référence à la table
Tentative ;
- idQs : identifiant d’une question, clé étrangère qui fait référence à la table Question ;
- idProp : identifiant d’une proposition, clé étrangère qui fait référence à la table
Proposition ;
Conditions à considérer :
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 10/13
Travail demandé :
On suppose que ces nouvelles tables sont créées et remplies.
1. Écrire la fonction Score_Question qui prend en paramètre Cur, l’identifiant V d’un
voucher et l’identifiant idQ d’une question, calcule la note obtenue par le candidat.
2. Écrire la fonction Score_Quiz qui prend en paramètre Cur, l’identifiant V d’un
voucher puis met à jour le score obtenu par le candidat.
3. Écrire la fonction Stat_Certif qui prend en paramètre Cur et renvoie une liste de
tuples. Chaque tuple est constitué de cinq éléments dont l’identifiant du Quiz et quatre
indicateurs de performance : le score maximum qui a été obtenu, le score moyen, le
minimum et l’écart type.
n
x
2
i
La formule de l’écart type est : i 1
n
xi : désigne le score d’un candidat pour un Quiz.
: désigne la moyenne des scores des candidats qui ont passé ce Quiz.
n : désigne l’effectif des candidats qui ont passé ce Quiz.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 11/13
ANNEXE 1
Tableau 2 : Nomenclature.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 12/13
ANNEXE 2– Quelques Fonctions/Méthodes Python
Sans aucune obligation, les fonctions suivantes pourraient vous être utiles.
Module numpy
- [Link] ou shape(M) retourne un tuple formé par le nombre de lignes et le nombre de
colonnes d’une matrice M.
- [Link](lst) construit une instance de la classe ndarray dont les composantes sont
initialisées à partir de la liste passée en entrée.
- [Link]() retourne la somme de tous les éléments d’un ndarray.
- [Link](M) retourne un ndarray de même forme que M contenant le logarithme terme à terme
des composantes de M.
- [Link](v2) ou [Link](v1, v2) retourne le produit scalaire entre deux vecteurs v1 et v2
(ndarray de dimension 1).
- v1 * v2 retourne le produit terme à terme de deux ndarray.
- [Link](v) retourne la norme du vecteur v.
Opérations sur les itérables (str, tuple, list, dict, etc.)
- len(it) retourne le nombre d’éléments de l’itérable it.
- range(d,f,p) retourne la séquence des valeurs entières successives comprises entre d et f, f
exclu, par pas=p.
- ord(s) retourne le code de la lettre s.
- chr(v) retourne la lettre ayant le code v.
- min(it) retourne la valeur minimale de l’itérable it.
- max(it) retourne la valeur maximale de l’itérable it.
- sum(it) retourne la somme des éléments de l’itérable it.
- x in it vérifie si x appartient à it.
- sorted(it) retourne une liste contenant les éléments de it dans l’ordre croissant.
- sorted(it, key = fct, reverse = True) retourne une liste contenant les éléments
de it dans l’ordre décroissant où la fonction key définit le critère de comparaison.
- [Link]() trie la liste lst dans l’ordre croissant.
- [Link](key = fct, reverse = True) trie la liste lst en ordre décroissant en
utilisant key comme critère de comparaison.
- [Link](val) retourne le nombre d’occurrences de val dans la liste lst.
- [Link](val) ajoute val à la fin de la liste lst.
- [Link](val) supprime la première occurrence val de la liste lst.
- [Link](val) retourne l’indice de la première occurrence val de la liste lst.
- [Link]() retourne un nouvel str contenant les mêmes lettres que source en minuscule.
- [Link]() retourne un nouvel bool indiquant si le str source est formé par des lettres
alphabétiques uniquement.
- [Link](motif) retourne une liste formée par des chaînes de caractères résultantes du
découpage de la chaîne source autour de la chaîne motif.
- [Link](itérable de chaînes) retourne une chaîne de caractères résultante de la
concaténation des éléments de l’itérable intercalés par le motif.
- [Link](paramètres) retourne une chaîne de caractères obtenue en substituant dans
l’ordre chaque caractère {} dans motif par un objet dans paramètres.
- [Link]() retourne un itérable formé par les valeurs du dictionnaire d.
- [Link]() retourne un itérable de couples (k,v) ou k est une clé du dictionnaire d et v est la
valeur associée.
- [Link](obj) ajoute obj à un ensemble s (instance de la classe set).
- [Link](obj) supprime obj de l’ensemble s (instance de la classe set).
- [Link](s2) retourne l’ensemble union des deux ensembles s1 et s2.
- [Link](s2) retourne l’ensemble différence des deux ensembles s1 et s2.
Concours (Mathématiques et Physique, Physique et Chimie et Technologie) - Session Juin 2022 Epreuve d’Informatique Page 13/13
REPUBLIQUE TUNISIENNE الجمهورية التونسية
Ministère de l'Enseignement Supérieur
et de la Recherche Scientifique وزارة التعليم العالي والبحث العلمي
Concours Nationaux d’Entrée انمناظرات انىطنية نهدخىل
إنى مراحم تكىين انمهندسين
aux Cycles de Formation d’Ingénieurs
2022 دورة
Session 2022
2. (5 points)
def preprocess(txt, vocab):
txt = [Link]()
if vocab is None:
predicate = is_alpha
else:
v = set(vocab)
predicate = lambda x : x in v
lst = [term for term in [Link]() if predicate(term)]
return {term: [Link](term)/len(lst) for term in lst}
3. (5 points)
def transform(corpus):
return {skill:preprocess(doc) for skill, doc in
[Link]()}
4. (5 points)
def get_vocab(tcorpus):
s = set()
for d in [Link]():
s |= set(d)
return [Link](sorted(s))
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 1/6
5. (5 points)
def get_skills(tcorpus):
return [Link](sorted([Link]()))
6. (5 points)
7. (5 points)
def get_tf_mat(vocab, skills ,tcorpus):
return [Link]([get_tf_vect(vocab, tcorpus[skill])for skill
in skills])
8. (5 points)
def get_idf_vect(tf_mat):
nskills , nterms = tf_mat.shape
return [Link]([[Link](nskills/(tf_mat[:,j]!=0).sum()) for j
in range(nterms)])
9. (2.5 points)
def cosine_sim(x,y):
if [Link] == 1:
return [Link](y) / [Link]([Link](x)) * [Link]([Link](y))
else:
sim = [Link]([cosine_sim(v, y) for v in x])
return sim / [Link]()
10. (2.5 points)
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 2/6
def ml_skills(self, question, n = 3):
d = find_skills(question, [Link], [Link],
self.tf_idf_mat, self.idf_vect)
skills = sorted(d, key = lambda skill : d[skill],
reverse = True)
return tuple( (skill, d[skill]) for skill in skills[:n])
class QCM:
def __str__(self):
res = [Link] + "\n"
res += "\n".join("\t({}) {}".format(chr(ord("a")+i), prop
) for i, prop in enumerate([Link]))
return res
1.
veracite 1 Question
tronc , textProp
idQs
Proposition
La liste des questions avec leurs réponses correctes (le
corrigé de la base des questions)
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 3/6
2.
idQs
idQuiz 3
DetailQuiz
idQs
idQuiz 20
DetailQuiz
Les identifiants des questions affectées à la fois aux quiz 3
et 20.
Ou bien
select *
from quiz
where datefin <current_date
5. (5 points)
select [Link],tronc,textprop
from question q,proposition p
where [Link]=[Link] and [Link] not in (select idQs from detailQuiz)
6. (5 points)
select tronc
from proposition p,Question q
where [Link]=[Link]
group by [Link]
having count(*)>=4
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 4/6
7. (2.5 points)
select distinct idQuiz
from detailQuiz
where idQuiz not in(select idQuiz
from proposition p,detailquiz dq
where [Link]=[Link] and
textprop in("Vrai","Faux"))
return ScoreQ
2.(5 points)
def Score_Quiz(Cur,V):
[Link]("select distinct IdQs
from ReponseCandidat
where Voucher='{}'".format(V))
L=[Link]()
Lq=[i[0] for i in L]
ScoreQz=0
for i in Lq:
ScoreQz+=Score_Question(Cur,V,i)
[Link]("update Tentative
set scoreG={}
where Voucher='{}'".format(ScoreQz,V))
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 5/6
3.(5 points)
from math import sqrt
def Stat_Certif(Cur):
[Link]("select idQuiz,max(scoreG),avg(scoreG)
from Tentative group by idQuiz ")
L=[Link]()
L1=[]
for i in L:
[Link]("select scoreG
from Tentative
where idQuiz={}
and scoreG is not null".format(i[0]))
LScoreGQz=[Link]()
s=0
for j in LScoreGQz:
s+=abs(j[0]-i[1])**2
Ecart=sqrt(s/len(L))
i+=(Ecart,)
[Link](i)
return(L1)
Concours (MP, PC et T) - Session Juin 2022 Correction Epreuve d’Informatique Page 6/6