• Aucun résultat trouvé

Les activités de détection et de reconnaissance de niveau 2

3 Contribution à la détection et à la reconnaissance des données ouvertes tabulaires

Exemple 3. La Figure II.6 montre un enchaînement de détection de blocs par l’application des quatre

3.2.3 Les activités de détection et de reconnaissance de niveau 2

Les activités de niveau 2 ont pour objectif de détecter et de reconnaître les entêtes de lignes et de colonnes ainsi que les composants spatio-temporels. Comme le montre la Figure II.5, nous avons quatre activités dans le deuxième niveau : (1) activité dédiée aux entêtes de lignes, (2) activité dédiée aux entêtes de colonnes, (3) activité dédiée aux composants géographiques (ou spatiaux) et (4) activité dédiée aux composants temporels. Chaque acti-vité détecte les composants en se basant sur les résultats des actiacti-vités de niveau 1. Chaque activité précise également les annotations topologiques et/ou sémantiques de chaque com-posant détecté.

3.2.3.1 L’activité dédiée aux entêtes de lignes

L’activité de détection des entêtes de lignes permet d’identifier les entêtes de lignes StubHead de chaque UnitNumBloc. Ces entêtes sont situées à gauche du bloc numérique

unitaire et doivent se trouver dans l’un des OtherBloc ayant comme annotation intrinsèque Label que nous avons identifié au niveau 1 par l’activité "Détection Label". Ainsi l’exécution de l’activité de détection de StubHead dépend de l’exécution des activités de détection des labels et des numériques comme le montre la Figure II.5. L’algorithme II.3 résume le dé-roulement de l’activité de détection des StubHead. En effet, cet algorithme commence par chercher chaque bloc numérique b dans la liste des blocs B construit par les activités de ni-veau 1. Pour chaque bloc numérique b, nous parcourons B à la recherche d’un bloc de label b0 dont la colonne de fin (b’.FC) est inférieure à la colonne de début de b (b.DC) (lignes 7). Si le bloc b0existe, nous cherchons s’il contient une colonne vide qui permettra de délimiter le stubhead. En effet, les délimitations de lignes (DL et FL) du stubhead sont celles du bloc numérique b indexé par ce dernier. Les délimitations de colonnes (DC et FC) du stubhead sont celles de l’indexe de la colVide et la dernière colonne de b0 (lignes 8-16). Nous décou-pons par la suite le bloc b0selon les délimitations du stubhead et nous mettons à jour la liste des blocs B (lignes 17-18). La relation estIndexéPar et son inverse indexe sont créés entre le stubhead et le bloc b.

Algorithme II.3 — Détection de StubHead

Input: l’ensemble de blocs B 1: for each bB do

2: if b.I A =Numérique then 3: stubNotDetect←true 4: i←1

5: while B6=∅ and stubNotDetect do 6: b0 ← B[i] 7: if(b0.I A=Label et b0.FC< b.DC)then 8: colVide←PremiereColonneVide(b’) 9: if colVide>b0.DC then 10: stubhead.DC←colVide+1 11: else 12: stubhead.DC←b0.DC 13: end if 14: stubhead.FC←b0.FC 15: stubhead.DL←b.DL 16: stubhead.FL←b.FL 17: B←B∪Decouper(b’, stubhead) 18: B←B\b0 19: stubNotDetect← f alse 20: end if 21: i←i+1 22: end while 23: end if 24: end for

3.2.3.2 L’activité dédiée aux entêtes de colonnes

L’activité de détection des entêtes de colonnes permet d’identifier les entêtes de colonnes (BoxHead) de chaque UnitNumBloc. Ces entêtes sont situées au-dessus du bloc numérique unitaire et doivent se trouver dans l’un des OtherBloc ayant comme annotation intrinsèque Label que nous avons identifié au niveau 1 par l’activité "Détection Label". L’algorithme II.4 de cette activité est très similaire à celui de l’activité de détection de StubHead, la seule diffé-rence est un raisonnement sur les lignes plutôt que sur les colonnes. La relation estIndexéPar et son inverse indexe sont créées entre le boxhead et le bloc numérique unitaire b.

Algorithme II.4 — Détection de BoxHead

Input: l’ensemble de blocs B 1: for each bB do

2: if b.I A=Numérique then 3: boxNotDetect ←true 4: i←1

5: while B 6=∅ and boxNotDetect do 6: b0 ←B[i] 7: if(b0.I A= Label et b0.FL< b.DL)then 8: ligneVide←PremiereLigneVide(b’) 9: if ligneVide>b0.DL then 10: boxhead.DL←ligneVide+1 11: else 12: boxhead.DL←b0.DL 13: end if 14: boxhead.FL←b0.FL 15: boxhead.DC ←b.DC 16: boxhead.FC←b.FC 17: B← B∪Decouper(b’, boxhead) 18: B← B\b0 19: boxNotDetect← f alse 20: end if 21: i←i+1 22: end while 23: end if 24: end for

3.2.3.3 L’activité dédiée aux composants géographiques

L’activité de détection géographique permet de rajouter des annotations sémantiques aux StructData, aux NumData et aux blocs qui les contiennent détectés par les activités de niveau 1. Nous utilisons des noms d’entités géographiques qui correspondent à une hié-rarchie géographique dépendante du pays. Par exemple, si nous analysons les données ouvertes de la France nous utilisons le découpage géographique organisé en hiérarchie

comme suit : commune→canton→arrondissement→département→région. Les anno-tations seront {Géographique.Commune, Géographique.Canton, Géographique.Arrondissement , Géographique.Département, Géographique.Région}.

Nous avons récolté des listes d’instances de chaque niveau géographique de la base Geonames11. Nous comparons le contenu des données de nos sources avec ces listes pour identifier l’annotation sémantique des données. Si le processus de reconnaissance est posi-tif, nous rajoutons une annotation sémantique géographique au StructData et au bloc qui la contient. Si nous identifiions des données géographiques dans les NumData, nous les trans-formons en StructData, nous attribuons l’annotation géographique correspondante et enfin nous découpons le bloc numérique qui contenait les NumData en un bloc StructData et un autre bloc de NumData dont on lui met à jour ces délimitations.

3.2.3.4 L’activité dédiée aux composants temporels

L’activité dédiée aux composants temporels permet de rajouter des annotations séman-tiques aux StructData de type Date ou aux NumData instances de données temporelles. Les annotations temporelles sont les noms des niveaux de dimensions. Les annotations relles sont de la forme "Temporal. Nom du niveau de dimension". Les dimensions tempo-relles présentées par [Mansmann et Scholl, 2007] dans la Figure II.7 peuvent par exemple servir comme annotations. Nous avons proposé des expressions régulières pour détecter les données temporelles. Ces expressions sont appliquées sur les données numériques ou sur les données dates extraites respectivement par les activités de détection de numérique et de date du niveau 1.

Si nous détectons une colonne ou une ligne de données numériques respectant l’une des expressions régulières, les données NumData se transforment en données StructData. Elles gardent leurs annotations intrinsèques de type numérique et leurs annotations topo-logiques sont modifiées par l’identifiant du nouveau bloc de StructData. Les annotations sémantiques ("Temporal.Nom du niveau de dimension") sont remplacées par les valeurs de l’expression régulière correspondante. Ensuite, les délimitations de l’ancien bloc qui conte-nait ces données doivent être modifiées pour qu’il ne se chevauche pas avec le nouveau bloc de StructData. Dans le cas où nous détectons une colonne ou une ligne de données de type date, où ces dernières font déjà partie d’un bloc StructData, nous avons uniquement à ajouter l’annotation sémantique Temporal.Date pour ces données.