Votre traitement de texte retrouve un mot dans un document de mille pages en un clin d'œil. Comment fait-il ?
Le fait de faire "une recherche textuelle" signifie chercher une séquence ordonnée de caractères dans une chaîne de caractères plus grande.
Programmer la fonction recherche_textu_basique(sequence, texte, affiche_indices=False) qui prend en paramètres deux chaînes de caractères :
sequence : la sous-chaîne que l’on cherche ;texte : la longue chaîne dans laquelle on cherche.affiche_indices est un booléen.La fonction doit retourner True si sequence est présente dans texte et False sinon.
Exemple : recherche_textu_basique("coucou", "Bonjour, coucou!") doit retourner True.
Si la séquence n’est pas trouvée la fonction retourne False.
Si le paramètre affiche_indices est égal à True, la fonction affichera une liste de deux nombres de type int correspondant à l'indice du début et à l'indice de fin où a été trouvée la séquence dans le texte en cas de succès.
L'algorithme de Boyer Moore permet d'optimiser cette recherche.
Il fonctionne à l'aide d'un pré-traitement de la séquence à chercher.
Une vidéo Youtube explique cela.
Observe l'animation ci-dessous : le dictionnaire des décalages est d'abord construit, puis la séquence est comparée au texte de droite à gauche. Dès qu'une lettre ne correspond pas, le dictionnaire indique de combien de cases on peut sauter d'un coup : c'est là que l'algorithme gagne son temps.
Clique sur « Démarrer / Redémarrer » pour lancer l'animation.
Programmer la fonction constru_dico(sequence) qui prend en paramètre un string sequence.
Cette fonction retournera le dictionnaire des décalages (heuristique du « mauvais caractère » version Horspool) pour l’algorithme de Boyer–Moore : pour chaque caractère apparaissant dans sequence sauf la dernière position, on associe la distance entre cette position (la plus à droite possible) et la dernière case (indice len(sequence)-1).
Exemple : constru_dico("coucou") doit renvoyer {'c': 2, 'o': 1, 'u': 3}.
Compléter la fonction recherche_BOYER_MOORE(sequence,texte) qui prend en paramètres deux strings.
Cette fonction retournera un booléen selon l'appartenance ou non de sequence à texte.
Par exemple, recherche_BOYER_MOORE("coucou","Bonjour, coucou!") retournera True.
Ce fichier contient l'ensemble du roman "Le Horla" de "Guy de Maupassant".
Le code suivant permet d'ouvrir ce genre de fichier et de mettre le contenu du roman dans la variable contenu.
import os
os.chdir("u:\\") # à modifier
with open("le_horla_guy_de_maupassant.txt", "r", encoding="utf-8") as f:
contenu = f.read()
Dans un IDE Python, tester les fonctions vues précédemment sur ce roman.
À faire dans le cahier.
Cet exercice porte sur le langage SQL, sur la programmation en Python et la recherche textuelle.
Le sujet d'une étude porte sur les papillons, la corrélation entre leur présence et celle de certaines plantes ainsi que sur la classification de nouvelles espèces.
Dans cet exercice, on pourra utiliser les clauses du langage SQL pour :
SELECT, FROM, WHERE
(avec les opérateurs logiques AND, OR), JOIN … ON ;UPDATE, INSERT.Dans le cadre de cette étude, une base de données faune_flore.db a été créée pour étudier la
corrélation entre la présence d'espèces de papillons et celle de certaines plantes. Cette base de données regroupe les
tables papillon, plante et zone_geographique.
La table papillon comporte les informations suivantes :
num) ;nomCo) ;nomSc) ;taille) ;habitat) ;zone). Cet attribut fait référence à
l'attribut num de la table zone_geographique.Un extrait de cette table est donné ci-après.
| num | nomCo | nomSc | taille | habitat | zone |
|---|---|---|---|---|---|
| 458 | Monarque | Danaus plexippu | 100 | Prairies | 3 |
| 459 | Citron de Provence | Gonepteryx cleopatra | 30 | Prairies | 1 |
| 460 | Paon-du-jour | Aglais io | 6 | Jardins | 6 |
| 461 | Machaon | Papilio machaon | 85 | Forêts | 2 |
| 462 | Petite Tortue | Aglais urticae | 30 | Prairies | 5 |
| 463 | Robert-le-Diable | Polygonia c-album | 25 | Forêts | 4 |
La table plante comporte les informations suivantes :
num) ;nomCo) ;nomSc) ;habitat) ;zone). Cet attribut fait référence à l'attribut
num de la table zone_geographique.Un extrait de la table plante est donné ci-dessous.
| num | nomCo | nomSc | habitat | zone |
|---|---|---|---|---|
| 128 | Orchidée Phalaenopsis | Phalaenopsis | Forêts | 5 |
| 129 | Bambou | Bambusoideae | Forêts | 3 |
| 130 | Rose | Rosa | Haies | 2 |
| 131 | Lilas | Syringa | Haies | 6 |
| 132 | Coquelicot | Papaver rhoeas | Jardins | 4 |
| 133 | Lavande | Lavandula | Collines | 1 |
La table zone_geographique contient les informations suivantes :
num) ;zone).Un extrait de la table zone_geographique est donné ci-après.
| num | zone |
|---|---|
| 1 | Afrique du Nord |
| 2 | Amérique du Nord |
| 3 | Amérique du Sud |
| 4 | Asie |
| 5 | Asie du Sud |
| 6 | Europe |
habitat de la table papillon ne peut pas être une clé
primaire.SELECT taille
FROM papillon
WHERE nomCo='Machaon'
Après avoir mesuré l'envergure de plusieurs papillons Petite Tortue, un des scientifiques de l'étude a calculé la nouvelle moyenne des tailles pour ce papillon, qui est maintenant de 50 mm.
papillon, suite au calcul de cette nouvelle moyenne.SELECT nomSc
FROM plante
JOIN zone_geographique
ON plante.zone = zone_geographique.num
WHERE zone_geographique.zone = 'Asie'
SELECT papillon.nomCo, plante.nomCo
FROM papillon
JOIN zone_geographique
ON papillon.zone = zone_geographique.num
JOIN plante
ON plante.zone = zone_geographique.num
WHERE zone_geographique.zone = 'Europe'
Les espèces de papillons sont regroupées dans une liste de dictionnaires. Pour simplifier, seuls les attributs
num (l'identifiant du papillon), nomCo (son nom commun), nomSc (son nom
scientifique) et taille (sa taille) seront considérés dans cette partie. Une partie de la liste
papillon est donnée ci-dessous :
papillon = [
{'num': 458, 'nomCo': 'Monarque',
'nomSc': 'Danaus plexippu', 'taille': 100},
{'num': 459, 'nomCo': 'Citron de Provence',
'nomSc': 'Gonepteryx cleopatra', 'taille': 30},
{'num': 460, 'nomCo': 'Paon-du-jour',
'nomSc': 'Aglais io', 'taille': 6},
{'num': 461, 'nomCo': 'Machaon',
'nomSc': 'Papilio machaon', 'taille': 85},
{'num': 462, 'nomCo': 'Petite Tortue',
'nomSc': 'Aglais urticae', 'taille': 50},
{'num': 463, 'nomCo': 'Robert-le-Diable',
'nomSc': 'Polygonia c-album', 'taille': 25}
]
Le but de cette partie est de trier la liste des papillons par ordre croissant de taille et de classifier une nouvelle espèce photographiée.
La fonction tri_collec renvoie la liste de dictionnaires des papillons triée par ordre croissant de
taille.
1 def tri_collec(collec):
2 """Renvoie la collection des papillons triées
3 par ordre croissant de leur taille.
4 Paramètre:
5 collec : liste de dictionnaires des papillons
6 Renvoie:
7 liste triée par ordre croissant des tailles
8 des papillons.
9 """
10 for i in range(1, len(collec)):
11 pap = collec[i]
12 j = ...
13 while j > 0 and collec[j - 1]['taille'] > ...:
14 collec[j] = collec[j - 1]
15 j = ...
16 collec[j] = pap
17 return ...
tri_collec.n : linéaire, quadratique, logarithmique ou exponentiel.L'algorithme des k plus proches voisins est utilisé pour classifier la nouvelle espèce photographiée.
Cette nouvelle espèce montre beaucoup de ressemblance avec l'espèce 'Aglais io' mais diffère par la taille et la couleur des motifs des ailes.
Pour vérifier l'hypothèse que la nouvelle espèce est l'espèce 'Aglais io' comportant une mutation génétique, une
recherche naïve d'une séquence caractéristique des papillons 'Aglais io' est réalisée sur la chaîne d'ADN extraite de
la nouvelle espèce. Une chaîne d'ADN est représentée en Python par une chaine de caractères. Cette recherche utilise
la fonction recherche_seq(seq, chaine) qui renvoie l'indice du premier caractère de seq si
la séquence seq est présente dans la chaîne d'ADN chaine et -1 sinon.
recherche_seq.
1 def recherche_seq(seq, chaine):
2 """Renvoie l'indice du premier caractère de
3 chaine où commence `seq` si la séquence `seq`
4 se trouve dans la chaine de caractères chaine,
5 -1 sinon
6 Paramètres:
7 seq : séquence à rechercher
8 chaine : chaine d'ADN
9 Renvoie:
10 indice du premier caractère de seq dans
11 la chaine, -1 sinon.
12 """
13 for i in range(len(chaine)-len(seq) + 1):
14 j = 0
15 while j < len(seq) and ...:
16 j += 1
17 if ...:
18 return i
19 return -1
La fonction recherche_BMH(seq, chaine), donnée ci-dessous, implémente l'algorithme de Boyer-Moore
Horspool.
1 def dico_lettres(seq):
2 d = {}
3 for i in range(len(seq)-1):
4 d[seq[i]] = i
5 return d
6
7 def recherche_BMH(seq, chaine):
8 decalage = dico_lettres(seq)
9 i = 0
10 n = len(seq)
11 while i <= len(chaine) - n:
12 j = n-1
13 while j >= 0 and chaine[i + j] == seq[j]:
14 j -= 1
15 if j == -1:
16 return i
17 else:
18 if chaine[i + n - 1] in decalage:
19 i += n - decalage[chaine[i + n-1]] - 1
20 else:
21 i += n
22 return -1
recherche_seq.