Académique Documents
Professionnel Documents
Culture Documents
Chap.5 Recherche Textuelle
Chap.5 Recherche Textuelle
5 Recherche textuelle
1. De quoi parle-t-on ?
1.1 Définition
Un très grand nombre de logiciels ou de navigateurs internet (traitement de texte, pyscrypter, google,
firefox, etc) possèdent une fonction de recherche textuelle, permettant de trouver un mot ou une partie d'un mot
(chaire ou sous-chaine) appelé motif.
Definition 1. L’algorithme permettant de retrouver une sous-chaîne, appelée « motif » dans une chaîne
de caractère est un algorithme de recherche textuelle
Question : le motif "vio" est-il présent dans le texte ci-dessus, si oui, en quelle(s) position(s) ? (la
numérotation d'une chaine de caractères commence à zéro et les espaces sont considérés comme des
caractères)
Réponse : on trouve le motif "vio" en position 23
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 1
L'information génétique est donc très souvent représentée par de très longues chaînes de caractères, composées
des caractères A, T, G et C.
Exemple : ATAACAGGAGTAAATAACGGCTGGAGTAAAGGCTGCTGCGGCTGCTAGGTCGG….
Principe :
On place le motif recherché au début de notre chaîne, puis on compare le motif avec la chaîne lettre par
lettre.
Si la lettre du motif coïncide avec celle de la chaîne, on regarde la lettre suivante. Si on arrive à
la dernière lettre on a détecté un motif.
Si la lettre du motif ne coïncide pas avec celle de la chaîne, on décale le motif d’une position et on
recommence…
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 2
Pseudo-code
Fonction recherche_naive(texte,motif)
Position= liste vide
m = longueur du motif.
n= longueur du texte
i=0
Tant que i<=n - m
Si motif = texte[de l’indice i… jusqu’à.l’indice.i+m-1]
Ajoute i dans Position
i = i+1
Fin du Tant que
Retourne Position
Exercice 1. Implémente ce code en Python et teste-le sur la chaîne d’ADN donnée en exemple.
Remarque : il y a deux façons en python d’implémenter le pseudo-code « Si motif=texte[de i…
jusqu’à..i+m-1] » :
On peut utiliser l’extraction de sous-chaine python L[a:b] qui retourne la sous-chaine de L de
l’indice a à l’indice b-1
On peut implémenter une fonction def occurrence (motif , texte , i) qui renvoie true s’il y a une
occurrence du motif à l’indice i dans texte et false dans le cas contraire en utilisant une boucle for. Dans ce
cas cette partie du pseudo code devient :
Cet algorithme naïf peut, selon les situations demander un très grand nombre de comparaisons, ce qui
peut entraîner un très long temps de "calcul" avec des chaînes très très longues.
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 3
3. L'algorithme de Boyer-Moore Horspool
L'algorithme de Boyer-Moore a été développé par les américains Robert Stephen Boyer et J Strother
Moore en 1977, il permet de faire beaucoup mieux en termes de comparaisons à effectuer.
Cependant cet algorithme est un peu compliqué… Dans ce cours on va étudier une version simplifiée :
L'algorithme de Boyer-Moore-Horspool. Il a été publié par Nigel Horspool en 1980.
Dans la méthode naïve, les décalages du motif vers la droite se faisaient toujours d'un "cran" à la fois.
L'intérêt de l'algorithme de Boyer_Moore-Horspool, c'est qu'il permet, dans certaines situations, d'effectuer un
décalage de plusieurs lettre en une seule fois.
3.2 Principe
Observe son fonctionnement ici.
cas n°1 : Ici la lettre G ne correspond pas à la lettre A, mais une étude du motif démontre qu’il n’y a pas
de lettre A dans le reste du motif. On peut donc faire un décalage de 6 positions.
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 4
cas n°2 : Ici la lettre G ne correspond pas à la lettre C, mais une étude du motif démontre qu’il y a une
lettre C dans le reste du motif à 2 cases de distance. On peut donc faire un décalage de 2 positions.
cas n°3 : Ici la lettre G correspond à la lettre G du texte, on étudie donc la deuxième lettre du motif, mais
on garde en mémoire le fait que le prochain G du motif se trouve à 3 cases de distance.
Ici la lettre T ne correspond pas à la lettre A, mais attention le calcul du décalage se fait sur la première
lettre. Pour aligner les deux G on fait donc un saut de 3 cases.
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 5
Dans l’algorithme de Boyer-Moore-Horspool, la calcul du décalage se fait toujours sur la dernière lettre du
motif.
On remarque que dans cet algorithme qu’en cas de non coïncidence on doit calculer à chaque fois la
prochaine occurrence de la lettre dans le motif… Ce calcul augmente considérablement le coût et le gain
obtenu par rapport à l’algorithme naïf pourrait être perdu dans ces recherches supplémentaires…
QUE FAIRE ?
La solution consiste à faire un prétraitement du motif pour éviter de recalculer le décalage à chaque
situation.
L'algorithme effectue un prétraitement du motif. Cela signifie que l'algorithme "connaît" les caractères
qui se trouvent dans le motif ce qui fait gagner beaucoup de temps dans les recherches.
L’idée est de calculer toutes les possibilités de sauts et de mémoriser ces données dans un tableau appelé
« table des sauts », ou « table des décalages » ou même « table de Horspool ».
Dans cette table on calcule dans un premier temps la position de la dernière occurrence à droite de chaque
lettre dans le motif, sauf pour la dernière lettre !
On peut faire cela très facilement avec un dictionnaire.
pos={}
for i in range(len(motif) -1) :
pos[motif[i]]=i
Exercice 2. Teste ce code sur le motif « CGGCTG » et affiche le dictionnaire pos. Celui-ci donne t-il bien la
dernière occurrence de chaque lettre ?
Dans un deuxième temps, à l’aide du dictionnaire pos, on créé la table de Horspool qui donne le décalage
à faire pour chaque lettre rencontrée dans le texte. Dans notre exemple, on obtient :
Les 3 différentes lettres du motif sont C, G, T. Si on rencontre une autre lettre dans le texte (A, B, D, E…
représenté ici par des pointillés.) le décalage sera donc maximum (ici 6 cases).
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 6
Si tu reprends les exemples précédents la table de Horspool permet d’obtenir directement le saut.
Cas n°1 : Avec un A décalage de 6 cases
Cas n°2 Avec un C décalage de 2 cases
Cas n°3 Avec un G décalage de 2 cases
Exercice 3. Pourquoi selon toi on ne prend pas en compte le dernier caractère G pour le calcul du décalage ?
Nous allons implémenter une fonction def calcul_decalage(motif) qui retourne un dictionnaire donnant
le décalage pour toute lettre :
decalage = calcul_decalage(« CGGCTG ») est un dictionnaire qui donne le décalage pour toute lettre
majuscule de l’alphabet, y compris celles qui ne sont pas dans le motif.
Rappels : le code ASCII des lettres majuscules va de 65 (A) jusqu’à 90 (B). ord(« A ») retourne 65 et
chr(65) retourne « A »
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 7
4. Le vrai algorithme de Boyer-moore
Boyer Moore Horspool est très efficace car il évite des tests de comparaison grâce au prétraitement du
motif.
Dans le vrai algorithme de Boyer Moore, la première table des décalages est la même table que celle de
Horspool mais utilisée différemment. Le calcul du décalage ne se fait plus uniquement sur le dernier caractère
mais sur le caractère où il n’y a pas coïncidence.
Observe son fonctionnement ici et regarde la vidéo qui explique son fonctionnement.
Dans l’algorithme de Boyer Moore il y a une deuxième table des sauts calculée suivant les règles du
« bon suffixe ». Cette deuxième table n’est pas explicitement au programme.
Regarde la vidéo qui explique son fonctionnement.
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 8
6. Annexes
6.1 Bibliographie :
Les sources d’inspiration pour faire ce support de cours sont trop nombreuses pour être toutes énumérées. Voici
les principales :
Livres : apprendre à programmer en Python Swinnen ; Ellipses…
Échanges avec des profs
Sites : Cours de Canopé Poitiers (professeurs de la formation au DIU) ; Cours https://pixees.fr/
… et d’autres…
Terminale/NSI/Boissac/2023-2024/LGF La Marsa/Tunisie 9