• Aucun résultat trouvé

Recherche de correspondances sur base d’empreintes

Dans le document Recherche de similarité dans du code source (Page 138-143)

Des codes sources peuvent être indexés en base par leurs empreintes caractéristiques géné- rées. Ces empreintes, représentées par la valeur de hachage de k-grams, peuvent être classées par l’usage d’une structure dynamique de tri. L’usage d’un arbre binaire de recherche équilibré peut nécessiter jusqu’à log2n lectures ou écritures de blocs pour l’accès, l’ajout ou la suppres- sion d’un élément avec une importante fragmentation mémorielle liée à la suppression ou mise à jour d’éléments. L’usage de structures d’arbres k-aires telle que le k-B+-tree [6], populaire pour l’implantation d’index de bases de données généralistes, limite le nombre d’opérations d’entrée-sortie coûteuses (logkn pour n empreintes indexées) ainsi que la fragmentation. Le k-B+-tree est un arbre k-aire dont chaque nœud est contenu dans un bloc : les nœuds internes possèdent entre k/2 et k nœuds enfants indexés par des clés tandis que les noeuds feuilles dis- posent de k/2 à k empreintes. Cependant, aucune relation de séquentialité ne peut être inférée

8.3. Recherche de correspondances sur base d’empreintes 138

à partir de l’arbre de tri sur la valeur de hachage contrairement à une structure d’indexation de suffixes.

L’usage d’une structure dynamique offre la possibilité de réaliser des modifications sur la base de projets ce qui peut être nécessaire pour la recherche de similitudes au sein de projets en cours de développement. Nous pouvons ainsi aussi bien ajouter que supprimer des empreintes correspondant à certaines unités du code.

8.3.2 Recherche d’un projet requête dans une base de projets

Étant donnée une unité structurelle requête q (pouvant être un projet, une unité de com- pilation, une fonction, un bloc de code...), nous cherchons à déterminer les clones (exacts ou approchés) entre ce projet et la base d’unités structurelles déjà indexées B = p1· · · pk. Nous

déterminons tout d’abord la séquence F(q) = f1f2· · · fm d’empreintes de q. Chacune des va-

leurs de hachage de ces empreintes est recherchée sur la structure d’indexation de la base : des valeurs de hachage concordantes signifient que les deux empreintes représentent potentiel- lement des morceaux de code similaires. Il est néanmoins nécessaire de vérifier si l’égalité des valeurs de hachage n’est pas liée à une collision induisant un faux-positif : le code sous-jacent représenté doit donc être comparé. Si l’espace de hachage est suffisamment important, cette étape peut être évitée. Nous faisons pour hypothèse, pour la suite, de l’usage d’une fonction de sélection locale, i.e. insensible au contexte.

Nous introduisons en figure 8.5 un exemple d’unité requête ainsi que d’unités indexées en base qui nous servira d’illustration aux méthodes de recherche de similarité décrites ci-après.

q = abcdefgh

p1 = biadcgfh

p2 = jabcdejk

p3 = abidifjg

Fig.8.5 – Exemple d’unité requêtes et d’unités indexées en base. a..j est l’alphabet des méta- lexèmes utilisés (à des fins de simplification, les méta-lexèmes sont identifiés à des k = 1- grams). Une méthode de sélection locale (non explicitée) sur une fenêtre de taille k + 2 garde les méta-lexèmes spécifiés en gras.

Détermination de métrique de similarité

Finalement nous obtenons pour chaque unité structurelle de la base pi la liste exhaustive

des empreintes F(pi) ∩ F(q) représentant des morceaux de code similaires avec des empreintes

de q. Nous pouvons ainsi en déduire une métrique de similarité ensembliste (aucune relation de séquentialité n’étant considérée sur les empreintes) basées sur le volume du code représenté par F(pi) ∩ F(q) comparé à F(pi) et F(qi) comme expliqué au chapitre 12.

La métrique de similarité ainsi déduite présente une résistance intéressante aux opérations d’édition par transposition au sein des unités structurelles mais peut occasionner des cas de fausse-positivité. L’utilisation d’une telle métrique peut alors être vue comme une technique

de présélection d’unités structurelles intéressantes de la base afin de les comparer plus inten- sivement par l’usage, par exemple, d’algorithmes d’alignement local (voir chapitre 5), soit sur les lexèmes, soit les méta-lexèmes.

Si nous considérons l’exemple indiqué en figure 8.5, nous établissons le vecteur des méta- lexèmes partagés entre q et les pi ainsi que le vecteur des volumes correspondants (chaque

méta-lexème ayant un volume de 1) :

F(q) ∩ ... p1 p2 p3

Empreintes (méta-lexèmes) bdgf bd bdf g

Volume 4 2 4

Fig.8.6 – Vecteur de méta-lexèmes partagés entre paires d’unités

Nous normalisons ensuite chacune des valeurs par rapport à l’union des empreintes de la paire d’unités correspondante : ainsi s(q, pi) = V(F (q))+V(F (pV(F (q)∩F (pi))−V(F (q)∩F (pi)) i)). D’où les valeurs

de similarités suivantes :

i 1 2 3

s(q, pi) 4+5−44 = 45 4+5−22 = 27 4+4−44 = 1

Fig.8.7 – Similarité normalisée (unioniste) entre paires d’unités

Nous constatons que la plus forte similarité unioniste concerne la paire (q, p3) : en effet q

et p3 sont caractérisés par les mêmes méta-lexèmes sélectionnés avec des espaces lacunaires

dissemblables. p1 est également semblable à q avec des méta-lexèmes apparaissant dans un

ordre différent. Quant à p2 il présente le plus long facteur commun avec q (abcde) mais la plus

faible similarité.

Recherche de correspondances exactes

Comme vu précédemment, la détermination d’une métrique de similarité sur unité struc- turelle peut être utilisée comme technique de présélection de paires à examiner de façon approfondie. Nous nous intéressons ici à la recherche de correspondances exactes, i.e. des oc- currences de facteurs égaux, à partir de la connaissance du jeu d’empreintes de k-grams de chaque unité de la base en intersection avec les empreintes de q, F(q).

Pour ce faire, nous marquons toutes les empreintes de F(q) trouvées au moins sur une unité pi de la base. Ces empreintes sont triées par position sur q pour obtenir la séquence sq. De

même, pour chaque unité pi, les empreintes en intersection avec F(q) sont triées par position

des occurrences sur pi pour obtenir la séquence spi. Les séquences sqet leurs homologues de la

base spi sont ensuite découpées en sous-chaînes d’empreintes représentant des méta-lexèmes

consécutifs : ui,1, ui,2, · · · , ui,n.

En suivant l’exemple introduit en figure 8.5, nous pouvons relever :

L’ensemble des chaînes d’empreintes consécutives des unités de la base et de l’unité requête doivent ensuite être analysées afin d’y trouver des facteurs répétés comprenant au moins une occurrence de facteur de l’unité requête.

8.3. Recherche de correspondances sur base d’empreintes 140

sq = bdf g

sp1 = b, dgf

sp2 = bd

sp3 = bdf g

Fig. 8.8 – Sous-chaînes de méta-lexèmes partagés

Il est néanmoins nécessaire de noter que deux sous-chaînes d’empreintes consécutives à valeurs de hachage identiques peuvent ne pas représenter des k-grams et des lexèmes sous- jacents identiques. Soient γ et γ′ de telles chaînes d’empreintes de méta-lexèmes représentant

des chaînes de lexèmes sous-jacentes α[i..i′] et β[j..j]. L’égalité de γ et γimplique que les

méta-lexèmes sélectionnés soient identiques sous réserve d’une fonction de hachage n’engen- drant pas de collision. Or l’espace des méta-lexèmes est potentiellement de cardinalité plus importante que celui des valeurs de hachage générées, la fonction de hachage utilisée n’est donc pas injective et peut engendrer des collisions. Dans l’exemple traité, nous avons choisi d’ignorer cette possibilité en considérant des 1-grams (lexèmes élémentaires) en bijection avec leurs empreintes.

D’autre part, rien ne garantit pour une fenêtre de sélection de taille supérieure à 1, que les lexèmes compris entre deux k-grams consécutifs sélectionnés soient égaux : il est donc nécessaire de les vérifier. Pour s’en convaincre, on pourra considérer l’unité p3 de l’exemple

traité : sq = sp3, cependant les méta-lexèmes intermédiaires entre ceux sélectionnés diffèrent.

Nous soulignons également que si la chaîne de méta-lexèmes γ n’est, par définition, ni extensible sur la gauche, ni sur la droite3, alors s’il existe une correspondance exacte avec q

impliquant γ, celle-ci possède une longueur en nombre de lexèmes comprise entre i′− i + 1 et

i′−i+1+2(l−1) (l étant la taille de la fenêtre de sélection). En effet, la correspondance trouvée inclut nécessairement α[i..i′] : s’il existait une correspondance incluant également l lexèmes à

gauche de cette chaîne, au moins une empreinte de k-gram aurait été sélectionnée sur la fenêtre de position [i − l..i − 1]. Par contre si une correspondance incluait l − 1 lexèmes à gauche, il est possible qu’aucune empreinte k-gram ne commençant aux positions [i − l + 1..i − 1] soit sélectionnée, ce cas survenant uniquement si l’empreinte de k-gram de position i est localement minimale. Une remarque similaire s’applique pour les lexèmes à droite. Pour l’exemple traité, la sous-chaîne bd de p2 est effectivement impliquée dans une correspondance exacte avec q.

Un méta-lexème concordant c est présent entre b et d et une extension de un méta-lexème peut être réalisée aussi bien sur la gauche que la droite pour obtenir la correspondance exacte abcde.

De ces observations, nous créons une structure d’indexation de suffixes pour les chaînes de lexèmes représentées par les chaînes d’empreintes consécutives de valeurs de hachage comprises dans Fq. Ces chaînes sont augmentées de l − 1 lexèmes à gauche et à droite afin de compenser

l’ « aveuglement » possible dû à la procédure de sélection.

3

Ce qui signifie que les empreintes précédant et suivant γ n’ont pas de valeur de hachage commune avec celles de F(q).

Pour l’exemple de la figure 8.5, nous obtenons en utilisant les sous-chaînes de méta-lexèmes sélectionnées les chaînes de lexèmes développées suivantes (on rappelle que l’on manipule des 1-grams à des fin de simplification) :

sq = abcdef gh

sp1 = bi, adcgf h

sp2 = abcde

sp3 = abidif jg

Fig. 8.9 – Chaînes de lexèmes développées à indexer

Nous pouvons ainsi utiliser une table de suffixes et un arbre d’intervalle afin de déceler les facteurs répétés de lexèmes à partir des chaînes de lexèmes précédemment obtenues et ainsi calculer leur farmax. Cette procédure garantit que les facteurs répétés de longueur supérieure au seuil de détection de l + k − 1 lexèmes (générant au moins une empreinte de k-gram sélectionnée) soient exhaustivement reportés. Cette remarque n’est cependant valide que si le critère de sélection des empreintes est cohérent pour l’ensemble des unités indexées de la base et de l’unité requête. Ainsi, si le critère de sélection est basé sur la fréquence d’apparition du k-gram, le vecteur de fréquence d’apparition doit être constant et non évolutif pour chaque unité indexée.

Pour l’exemple cité, nous pouvons calculer le farmax des chaînes de lexèmes d’intérêt trouvées en figure 8.9. Celui-ci comporte deux facteurs de volume d’au moins k + 1 (k = 1) : abcde et ab.

La méthode exposée peut donc être rapprochée d’une indexation exhaustive de tous les suffixes des unités manipulées. L’utilisation d’empreintes de k-grams sélectionnés et indexés permet cependant de ne construire qu’à la demande une structure d’indexation de suffixes (telle qu’une table de suffixes) portant uniquement sur des zones dont la similarité est fortement suspectée par l’existence de k-grams communs. L’utilisation d’un critère de sélection pertinent telle que la fréquence des k-grams permet de réduire la fausse positivité liée à des séquences d’empreintes de k-grams sélectionnés similaires. Le volume de la base d’empreintes de k- grams sélectionnés sur fenêtre de l lexèmes est de l’ordre de N(b + log2(N ))/l bits pour des empreintes de b bits avec des unités totalisant N lexèmes alors qu’un arbre de suffixes incrémental nécessiterait au moins 10N octets. Toutefois, contrairement à un arbre de suffixes dont le seuil de détection peut être paramétré à l’utilisation, aucun facteur répété de longueur inférieure à k lexèmes ne peut être trouvé et des facteurs de taille inférieure à l + k − 1 lexèmes peuvent être potentiellement ignorés.

Les paires d’unités syntaxiques présentant au moins deux facteurs répétés communs peuvent ensuite faire l’objet d’un procédé d’extension des correspondances exactes pour créer des cor- respondances approchées consolidées en utilisant des méthodes d’alignement local présentées en 5.4. Si ces méthodes permettent de consolider des macro-similarités, elles ne permettent toutefois pas de pallier l’éventuelle absence de détection de correspondances liée à la pré- sence d’opérations d’édition très localisées portant sur quelques lexèmes. De telles opérations peuvent modifier quelques empreintes de k-grams sur une fenêtre de sélection et donc in fine les empreintes sélectionnées ou alors au contraire n’avoir d’impact que sur des k-grams non

Dans le document Recherche de similarité dans du code source (Page 138-143)