• Aucun résultat trouvé

Inférence de grammaires

1.3 Organisation du manuscrit

2.1.5 Systèmes de génération de wrappers

2.1.5.2 Inférence de grammaires

La génération de wrappers dans RoadRunner consiste à inférer une grammaire (ensemble d’expressions régulières) pour le code HTML en utilisant un ensemble de pages HTML. RoadRunner infère le wrapper en fonction des similarités et des différences dans les pages. Il compare deux pages à la fois (un wrapper et une page), en alignant les tokens et en capturant les différences (mismatches). Dans la première itération, une simple page est utilisée comme wrapper (Figure 2.7). Ce sont ces mismatches qui vont guider l’algorithme, afin d’inférer le schéma de données (template). Il y a deux types possibles : – String mismatches : ils sont utilisés pour découvrir les attributs (les données à

extraire). Cela se produit lorsque la même position au sein du wrapper et la page contient des chaînes de caractères différentes.

– Tag mismatches : ils sont utilisés pour découvrir les parties itératives (+) et optionnelles ( ?). Cela se produit lorsque la même position au sein du wrapper et de la page contient soit différentes balises HTML ou l’un a une balise et l’autre a une chaîne de caractères.

Figure 2.7 – Exemple d’exécution de l’algorithme RoadRunner

Un exemple d’exécution de l’algorithme est illustré dans la Figure 2.7. Durant l’analyse des deux pages, le wrapper et les données à extraire sont inférés. Plus précisément,

1. les strings mismatches sont découverts afin de détecter les données à extraire, par exemple, la chaine de caractère “John Smith” et “Paul Jones” (ligne 4 ). Le wrapper est généré en marquant les nouveaux champs découverts, en remplaçant la chaine “John Smith” par #PCDATA (vu que c’est la première page qui est utilisée comme wrapper dans cette exemple). Le même scénario se produit pour les chaines “DB Primer” et “XML at Work”. En ce qui concerne les chaines similaires, comme “Books of :” (ligne 2 ), le wrapper ne génère pas de nouveaux champs. Ces chaines sont plutôt considérées comme étant des informations qui feront partie du template. Sachant que dans chaque étape le wrapper est généralisé avant de reprendre l’analyse des pages.

2. les tags mismaches sont découverts à leur tour, afin de déterminer les parties optionnelles et itératives. Dans cette exemple, le premier tag mismatch apparait sur les balises <UL> et <IMG.../> (ligne 6 ). Dans ce cas, le wrapper est généralisé en introduisant un pattern de la forme (src=.../> <IMG)?. En ce qui concerne

les parties itératives, dans cet exemple, les deux pages HTML contiennent chacune nom d’auteur et une liste des titres de livres. Durant l’analyse, le tag mismatch apparait sur les balises <UL> et <LI> (ligne 19 et 20 respectivement). Ce mis- match provient de la différence des cardinalités pour les listes de livres (deux livres pour le wrapper et trois livres pour la page). Ainsi le pattern répétitif est <LI><I>Title:</I>#PCDATA</LI>. Dans ce cas, le wrapper est généralisé en intro- duisant un pattern de la forme (<LI><I>Title:</I>#PCDATA</LI>)+. Le wrapper final dans cet exemple contient à la fois une partie itérative et optionnelle.

G-STM [JL10]

Les algorithmes de tree matching cités précédemment échouent dans le traitement des listes imbriquées ayant des patterns répétitifs. Pour pallier ce problème G-STM (Generalized-STM), inspiré par l’algorithme STM [Yan91](Simple Tree Matching), intègre de nouvelles heuristiques qui permettent la détection de listes, en se basant sur la génération de grammaires. GST-M est l’un des systèmes les plus récents, avec des performances qui dépassent celles des systèmes précédents.

D’une manière récursive, à chaque niveau de l’arbre DOM, G-STM attribue un symbole pour les nœuds en fonction de leurs mesures de similarité. Les nœuds similaires recevront le même symbole, respectivement, les nœuds différents recevront des symboles différents. Par conséquent, deux strings de symboles sont créés, un pour chaque arbre. Ces strings sont ensuite utilisés pour la génération de grammaires et permettent la détection de listes. Théoriquement, dans cette étape les listes sont détectées, et sont représentées par une partie itérative (+) dans la grammaire. Puis, les parties itératives dans les deux grammaires sont comparées. Si elles sont équivalentes, leurs éléments sont transformés et réunis donnant une mesure de similarité plus précise. En outre, chaque symbole est un

mapping des nœuds structurels équivalents.

Un pseudo-code est fourni dans Algorithme 1. Un mapping M, entre un arbre A de taille k et un arbre B de taille n est un ensemble de paires (i, j), un pour chaque arbre, satisfont les conditions suivantes pour chaque (i1, j1) et (i2, j2) ∈ M :

– i1 = i2 ssi j1 = j2

– si i1 est sur la gauche de i2, alors j1 est sur la gauche de j2 – si i1 est l’ancêtre de i2, alors j1 est l’ancêtre de j2

La correspondance maximale entre les deux arbres est le nombre maximum de paires (i, j) équivalentes. Afin de détecter les listes, pour chaque paire de nœuds de A et B,

l’algorithme retourne le tuple (score, nodesA, nodesB), où le score est leurs scores de

Algorithm 1 Algorithme G-STM

1: if les racines des deux arbres A et B contiennent des symboles différents (nom des balises) then

2: return (0, nodesA, nodesB)

3: else

4: Initialisation : m[i, 0] ← 0 for i = 0, . . . k ; m[i, 0] ← 0 for j = 0, . . . n ; 5: for i = 1 to k do

6: for i = 1 to n do

7: W [i][j] = G − ST M (Ai, Bj)

8: end for

9: end for

10: (W, nodesA, nodesB) ← DetectLists(W, A, B)

11: for i = 1 to k do 12: for i = 1 to n do

13: m[i][j] = max(m[i − 1][j], m[i][j − 1], m[i − 1][j − 1] + W [i][j].score)

14: end for

15: end for

16: return (m[k][n] + 1, nodesA, nodesB)

17: end if

L’algorithme sauvegarde le score et le nombre de nœuds dans la matrice W . Chaque cellule de la matrice contient trois valeurs : le score, la taille de l’arbre au iième fils du

sous-arbre A, respectivement, la taille de l’arbre au jième fils du sous-arbre B.

2.1.5.3 Fréquence d’apparition des tokens

Documents relatifs