• Aucun résultat trouvé

Sélection d’empreintes

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

Lexème for lpar id eq 0 ; lt MAX ++ rpar

Valeur 1 2 3 4 5 6 7 8 9 10

(a) Identificateurs numériques des lexèmes

4-gram ui Calcul de h(ui) Valeur de hachage (b = 33, mod 16)

u1= for lpar id eq ((v(for) ∗ b + v(lpar)) ∗ b + v(id)) ∗ b + v(eq) 10

u2= lpar id eq 0 h(u1)∗ b − v(for) ∗ b4+ v(0) 14

u3= id eq 0 ; ; h(u2)∗ b − v(lpar) ∗ b4+ v(;) 2

u4= eq 0 ; id ; h(u3)∗ b − v(id) ∗ b4+ v(id) 2

u5= 0 ; id lt h(u4)∗ b − v(eq) ∗ b4+ v(lt) 5

u6= ; id lt MAX h(u5)∗ b − v(0) ∗ b4+ v(MAX) 8

u7= id lt MAX ; h(u6)∗ b − v(;) ∗ b4+ v(;) 8

u8= lt MAX ; id h(u7)∗ b − v(id) ∗ b4+ v(id) 8

u9= MAX ; id ++ h(u8)∗ b − v(lt) ∗ b4+ v(++) 10

u10= ; id ++ rpar h(u9)∗ b − v(MAX) ∗ b4+ v(rpar) 12

(b) Valeurs de hachage des 4-grams

Fig. 8.2 – Séquence de k = 4-grams u et valeurs de hachage de la chaînes de lexèmes for lpar id eq 0 ; id lt MAX ; id ++ rpar, b = 33

De manière générale, le calcul de fpb(u) à partir de f pb(v) et f pb(w) est réalisable en temps

équivalent à log2k′′ afin de réaliser l’exponentiation rapide de b. Cependant, si l’on suppose k′′ fixé, le coût initial de l’exponentiation est amorti sur toutes les instances calculées.

8.2 Sélection d’empreintes

Le souci d’économie de mémoire de masse pour le stockage de la base des empreintes de k- grams nous conduit à ne prélever qu’un échantillon représentatif d’empreintes. Nous utilisons à cet effet des méthodes de sélection d’empreintes dont certaines sont décrites ci-après. 8.2.1 Quelques définitions

Définition 8.4. (Fonction de sélection d’empreintes) Soit une chaîne de méta-lexèmes u1u2· · ·

un représentées par des empreintes que nous confondons avec les méta-lexèmes. Une fonction

de sélection d’empreintes S associe à la sous-chaîne uiui+1· · · uj une sous-séquence de q méta-

lexèmes sélectionnés S(uiui+1· · · uj) = up1up2· · · upq avec i ≤ p1 ≤ p2 ≤ · · · ≤ pq ≤ j. On

note ρ = q

j−i+1 la densité de sélection de cette fonction sur ui· · · uj.

Définition 8.5. (Seuil de garantie) Une fonction de sélection d’empreintes de k-grams pré- sente un seuil de garantie t = l + k − 1 ssi il existe au moins une empreinte sélectionnée pour toute chaîne de l k-grams (représentant une chaîne sous-jacente de l + k − 1 lexèmes). Définition 8.6. (Localité) Une fonction de sélection d’empreintes S est locale ssi pour toutes chaînes uiui+1· · · ujet toutes chaînes contextuelles de méta-lexèmes c1, c2, c3, c4, S(c1uiui+1· · ·

ujc2) et S(c3uiui+1· · · ujc4) sélectionnent les mêmes méta-lexèmes centraux de ui· · · uj (une

des sélections pouvant comporter des méta-lexèmes supplémentaires sélectionnés au début et/ou à la fin de ui· · · uj).

Fonction Seuil de garantie Densité de sélection Localité Sélection aléatoire (8.2.3) Probabiliste ρ fixé Oui Sélection par position (8.2.4) 1

ρ+ k − 1 ρ fixé Non

Sélection sur fenêtre glissante de l lexèmes...

...d’empreintes minimales (8.2.5) l + k − 1 En moyenne ρ = 2

l+1 Oui

...d’empreintes les moins fréquentes (8.2.5) Possiblea a

Présente un caractère local ssi les fréquences sont figées.

Fig. 8.3 – Caractéristiques principales de fonctions de sélection

Une fonction de sélection idéale serait donc locale pour produire un résultat de sélection homogène pour une même sous-chaîne au sein de contextes différents, permettrait de minimiser le seuil de garantie pour permettre une détection de petits facteurs similaires tout en minimi- sant la densité de sélection. Un récapitulatif des différentes fonctions introduites ci-après est présenté avec leurs principales caractéristiques en figure 8.3

8.2.2 Filtrage syntaxique préalable

Aussi bien la langue naturelle que le code source respectent une certaine

✿✿✿✿✿✿✿✿✿✿✿✿✿

construction

✿✿✿✿✿✿✿✿✿✿✿✿

syntaxique.

✿✿✿L’utilisation de séquences de lexèmes fait perdre toute information syntaxique.

Ainsi la génération de suites de k-grams à partir de telles séquences de lexèmes peut faire ap- paraître des k-grams non signifiants. Par exemple pour le début de ce paragraphe, un 4-gram chevauchant la première et la deuxième phrase et étant souligné est composé des lexèmes (construction,syntaxique,.,l’). Pour un code source, il s’agirait de k-grams englobant plusieurs structures syntaxiques (intersectant deux instructions par exemple). Si une analyse syntaxique permet de délimiter précisément les entités syntaxiques, il est également possible, dans le cadre d’une approche moins coûteuse, de définir des lexèmes interdits Σf pour les

k-grams (typiquement des symboles de fin d’instruction ou de délimitation de blocs). Tout k-gram contenant au moins un lexème interdit est alors ignoré. Cette remarque n’est valable que pour des valeurs faibles de k n’englobant que des fractions d’unité syntaxique élémentaire (par exemple l’instruction) : pour des valeurs plus importantes de k il est nécessaire de consi- dérer des unités syntaxiques de plus haut niveau. Si l’on souhaite alors supprimer des k-grams chevauchant plusieurs unités, une analyse syntaxique légère peut être nécessaire.

8.2.3 Sélection aléatoire

Afin de réduire le volume d’empreintes à indexer, une première approche consiste à sélection- ner un ratio ρ d’empreintes à conserver à l’aide d’un générateur de nombres pseudo-aléatoire2.

Cette approche présente néanmoins l’inconvénient majeur de ne pas garantir qu’un certain fac- teur de la séquence de lexèmes, quel que soit sa longueur, puisse être représenté par au moins une empreinte de k-grams. Dans cette situation le facteur devient « invisible » pour un procédé de recherche de similitudes. Cette situation peut être rencontrée lorsque la dispersibilité de la fonction de hachage choisie est mauvaise.

2

Considérant une bonne dispersibilité de la fonction de hachage, il est également possible de ne garder que les valeurs de hachage dont le modulo par 1/ρ est nul.

8.2. Sélection d’empreintes 136 8.2.4 Sélection par position

Une autre méthode simple de sélection consiste à ne conserver que les empreintes de k- grams débutant aux positions 0 mod (1/ρ) de la séquence de lexèmes afin d’obtenir un ratio de sélection de ρ. Cela permet également de garantir que tout facteur de plus d’au moins

1

ρ + k − 1 lexèmes puisse être représenté par au moins une empreinte sélectionnée. Cette

méthode présente néanmoins l’inconvénient de ne pas être locale (un décalage d’une sous- chaîne produisant des sélections différentes).

8.2.5 Sélection sur fenêtre

Les méthodes de sélection d’empreintes sur fenêtre ont pour objectif de garantir qu’au-delà d’une certaine longueur, tout facteur sera représenté par au moins une empreinte sélectionnée tout en conservant un mode de sélection local, indépendant du contexte global.

Principe Les méthodes de sélection d’empreintes sur fenêtre utilisent une fenêtre glissante sur la séquence d’empreintes issues du hachage de k-grams. L’objectif est alors de sélectionner sur chaque position de la fenêtre un nombre fixe d’empreintes. Ainsi, sur une fenêtre de l empreintes de k-grams, s’il est décidé de sélectionner α empreintes, nous pouvons garantir que toute portion de k + l − 1 lexèmes de la séquence originelle est représentée exactement par α empreintes de k-grams. Pour un processus futur de recherche de similitudes, k est considéré comme le seuil de bruit — aucune similarité portant sur moins de k lexèmes ne peut être détectée — tandis que k + l − 1 est le seuil de garantie de détection — aucune similarité portant sur au moins l + k − 1 (α ≥ 1) lexèmes ne peut être ignorée car représentée par au moins α empreintes —. Il reste à définir une fonction f : Nl−→ [1..l]αde sélection sur fenêtre.

Typiquement une telle fonction a un coût temporel en O(l) pour son premier appel : les appels suivants sur les fenêtres translatées pourrait être menés incrémentalement en temps constant (selon la méthode de sélection).

Fonction de sélection arbitraire

La méthode de sélection sur fenêtre Winnowing [56] implantée par Moss [94] utilise une fonction de sélection arbitraire se basant sur la valeur de l’empreinte : par exemple sur chaque position de fenêtre, la fonction de sélection choisit les α (généralement α = 1) empreintes de valeur minimale. En cas d’égalité, les empreintes de valeur minimale sont départagées par leur position (choix de l’empreinte de plus grande position). La figure 8.4 présente un exemple de sélection sur fenêtre. Dans le pire des cas, si la suite des valeurs de hachage est strictement croissante, la densité de sélection ρ (ratio du nombre d’empreintes sélectionnées sur le nombre total d’empreintes) est de 1, l’empreinte sélectionnée à chaque position de fenêtre étant la première. [56] montre que la densité moyenne de sélection sur fenêtre pour un critère parfaitement aléatoire est de ρ = α 2

l+1. Un processus de sélection aléatoire d’une empreinte

de probabilité ρ permet d’obtenir la même densité moyenne de sélection mais sans seuil de garantie (il existe une probabilité (1 − ρ)i qu’une séquence de i k-grams ne soit représentée

par aucune empreinte). D’autre part, cette méthode de sélection est bien locale, la sélection étant réalisée sur des fenêtres avec un critère de sélection indépendant du contexte.

u1 u2 u3 u4 u5 u6 u7 u8 u9 u10

10 14 2 2 5 8 8 8 10 12

2

5

8

Empreintes sélectionnées : h(u4), h(u5), h(u8)

Densité de sélection : ρ = 3 10

Fig. 8.4 – Sélection d’empreintes sur fenêtre de type Winnowing (α = 1) Fonction de sélection objective

Une méthode de sélection plus objective que le choix des empreintes de valeur de hachage minimale peut consister à considérer des propriétés statistiques des empreintes. En particulier, nous pouvons précalculer sur des corpus de code source conséquents les fréquences d’apparition de certains k-grams ou alors les déterminer incrémentalement durant le processus d’indexation. Il est alors judicieux de sélectionner sur fenêtre les empreintes correspondant aux k-grams les moins fréquents car étant plus caractéristiques. Une séquence de lexèmes est alors représentée par les k-grams les plus spécifiques ce qui permet de limiter les résultats faux-positifs lors de requêtes sur bases d’empreintes tout en maintenant un seuil de garantie. Ce procédé est notamment utilisé par [77] mais uniquement pour extraire les empreintes de k-grams les plus rares d’instructions individuelles et non à l’aide d’une fenêtre glissante.

On note que si l’usage de fréquences d’apparition constantes permet d’obtenir une méthode de sélection locale, ce n’est pas le cas lorsque les fréquences sont variables (calcul incrémental).

8.3 Recherche de correspondances sur base d’empreintes

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