Documente Academic
Documente Profesional
Documente Cultură
• Robert Viseur
• Ingénieur Civil, Mastère en Management de
l'Innovation, Docteur en Sciences Appliquées.
• Spécialisé dans les questions relatives à l'économie
des logiciels libres et aux pratiques de co-création,
ainsi que dans les technologies de recherche et de
traitement de l'information (outils d'indexation,
API,...).
• Assistant à la Faculté Polytechnique de l'Université
de Mons (www.umons.ac.be).
• Conseiller technologique au CETIC (www.cetic.be).
2
Qu'est-ce que le CETIC ?
3
De quoi allons-nous parler ?
• Plan :
• Qu'est-ce qu'un moteur de recherche ?
• Faut-il utiliser une base de données « fulltext » ou
un pur indexeur ?
• Jusqu'où est-il utile de développer soi-même ?
• Exemples : création de moteurs de recherche
spécialisés.
4
Qu'est-ce qu'un moteur de
recherche ?
5
Définition
6
Étapes de fonctionnement
• Crawler.
• Collecter automatiquement les documents que l'on souhaite chercher sur un réseau local ou sur
Internet.
• Extraire.
• Extraire le contenu textuel (texte et métadonnées) des ressources collectées.
• Enrichir.
• Trouver et ajouter de nouvelles informations sur base du contenu et de la structure du document.
• Analyser
• Analyser le contenu textuel (en vue de son indexation).
• Indexer.
• Transformer le contenu textuel en une forme facilitant la recherche par un ordinateur.
• Rechercher.
• Proposer une interface de recherche pour des utilisateurs (WUI) ou des logiciels (API).
• Composer
• Associer à un ensemble de sources de résultats complémentaires.
7
Crawler
• Réseau Internet:
• Ouvrir les pages Web issues d'un ensemble de pages
Web de départ.
• Extraire des liens présents dans les pages Web.
• Suivre ces liens (découverte automatique d'Internet).
• Réseau local:
• Suivre l'arborescence de répertoires, faire l'inventaire
des fichiers disponibles.
• Éventuellement, constituer une copie locale des
fichiers à indexer.
• Attention aux droits d'accès aux documents (sécurité)!
8
Extraire (1/5)
9
Extraire (2/5)
• Complexité variable.
• Très simple pour du texte.
• Simple pour du (X)HTML ou du XML (RSS, Atom,
FOAF, etc.).
• En pratique:
– Texte avec des balises (tags).
– Plus ou moins bien formé.
• Exemple: HTML.
10
Extraire (3/5)
11
Extraire (4/5)
(...)
13
Enrichir (1/3)
14
Enrichir (2/3)
15
Enrichir (3/3)
16
Analyser (1/2)
17
Analyser (2/2)
19
Indexer (2/3)
Index:
<mot1> <doc1> pos=1
<mot2> <doc1> pos=2
<mot3> <doc1> pos=3
<mot4> <doc2> pos=1
<mot1> <doc2> pos=2
Requêtes:
q = <mot4> -> <doc2>
q = <mot1> OR <mot4> -> <doc2>, <doc1>
20
Indexer (3/3)
21
Rechercher (1/2)
22
Rechercher (2/2)
23
Composer
24
Faut-il utiliser une base de données
« fulltext » ou un pur indexeur ?
25
Bases de données simples (1/2)
26
Bases de données simples (2/2)
27
Base de données « fulltext »
31
Approches possibles
32
Existence d'outils intégrés (1/2)
33
Existence d'outils intégrés (2/2)
34
Plusieurs de langages de
programmation adaptés au Web
• Plusieurs languages de programmation libres
adaptés au Web.
• Exemples: Python, Perl, Java, Ruby, PHP, etc.
• Possibilité de développements sur mesure...
• Basé sur des bibliothèques réutilisables
– Exemple : gestion des threads, ouverture d'URLs, analyse de
textes, analyse HTML, etc.
• Attention au syndrome NIH...
35
Existence de composants spécialisés
(1/3)
• Crawler:
• Wget.
• Extraire :
• Lecture de flux RSS ou Atom:
• Feedparser (Java, Python), Simplepie (PHP), etc.
• Extraction de texte et de métadonnées :
• Apache Tika / POI (Java), utilitaires (xls2csv, catdoc, pdfinfo,
etc.), iFilters (propriétaire, disponible sous Windows), etc.
• Extraction d'articles (contenu utile) :
• Boilerpipe (Java).
• OCR:
• GOCR, OCRAD, Tesseract, etc.
36
Existence de composants spécialisés
(2/3)
• Analyser :
• Stemming:
• Snowball (Java).
• Rétroingénierie de pages Web:
• DEiXTo, Web Harvest, etc.
• TAL:
• OpenNLP (Java), NLTK (Python), etc.
• Détection de langue:
• Language-detection (Java), NLTK (Python),
Text_LanguageDetect (PHP), etc.
• Extraction d'entités (nommées ou pas):
• OpenNLP (Java), UIMA (Java), Stanbol, etc.
37
Existence de composants spécialisés
(3/3)
• Indexer :
• Indexation (SGBD):
• MySQL, PostgreSQL, etc.
• Indexation (indexeur):
• Lucene (Java), Whoosh (Python), Zend Search (PHP), etc.
• Rechercher :
• Classification:
• Mahout (Java), NLTK (Python), Reverend (Python), etc.
• Composer :
• Métamoteur : Carrot².
• Divers :
• Bases de données:
• DBPedia (Wikipedia), Geonames (base de données géographique), etc.
• Remarque : existence de très nombreux petits projets spécialisés et parfois
très utiles.
38
Et pourquoi pas du logiciel
propriétaire ?
• Existence de technologies propriétaires reconnues pour l'indexation.
• Exemples : Dtsearch, Oracle TEXT, etc.
• Point fort : très large couverture fonctionnelle, performances de haut niveau.
• Point faible : prix, « lock-in » technique.
• Le monde Java est alimenté par des projets de recherche (publics ou
privés) en traitement de l'information.
• Exemples (logiciels libres) : UIMA, Stanbol, Nepomuk, etc.
• Existence d'alternatives en Python (parfois) et, dans une moindre mesure, en
Microsoft .Net (C#, ASPX, etc.).
39
Exemples pratiques : création de
moteurs de recherche spécialisés
40
Exemple 1 : moteur de recherche
de podcasts
• Objectif :
• Sur base d'une liste de podcasts (fichiers RSS)...
• Indexer le contenu des flux RSS...
• En distinguant...
• Les descriptifs de chaque fichier RSS et...
• Les descriptions de chaque ressource multimédia
référencée...
• Et permettre des recherches par mots-clefs.
41
Outils réutilisés
42
Résultat
43
Exemple 2 : moteur de recherche
de flux RSS
• Objectif : découvrir, indexer et rechercher des
flux RSS.
44
Outils
46
Exemple 3: moteur de recherche
d'entreprises
• Point de départ: données de l'annuaire
Logiciellibre.com.
• Objectif :
• A partir d'une base de données d'adresses
d'entreprises actives dans le logiciel libre...
• Créer un index Web spécialisé...
• Pour identifier les entreprises actives sur certaines
technologies et étudier leur environnement.
47
Outils réutilisés
• Crawl: Wget.
• Indexation: Zend Search.
• Extraction d'entités: Boilerplate, OpenNLP.
• Visualisation: WUI et DOT.
48
Wget (1/2)
• Multiples options :
• -r (crawl récursif)
• Par défaut : respect de la convention « norobots »
• -l (profondeur de récursion)
• -P (répertoire cible pour le stockage)
• -A et -R (filtrage des URLs par pattern)
• --user-agent (« user agent » imposé)
• ...
• Plus d'infos : http://www.gnu.org/software/wget/manual/ .
• Alternative : curl (puissant mais... pas de crawl
récursif).
50
Lucene (1/2)
54
Zend Search (3/4)
55
Zend Search (4/4)
• Dans PHP :
• La logique est différente de celle de Python, qui propose un
type « string » et un type « Unicode ». PHP est très faiblement
typé et travaille uniquement avec des chaines.
• La conversion entre ISO et UTF-8 se fait à l'aide des fonctions
« utf8_encode() » et « utf8_decode() ». Les autres conversions
se font via « iconv ».
• La manipulation des chaines en UTF-8 se fait à l'aide de la
bibliothèque « mbstring ».
• La détermination de l'encodage des caractères en entrée
n'est pas triviale (headers HTTP parfois erronés,
métadonnées HTML parfois absentes ou erronées, outils de
détection pas toujours fiables,...).
58
Indexation sous Zend Search (1/2)
• Optimisation de l'index :
$index->optimize();
59
Indexation sous Zend Search (2/2)
60
Divers
61
Mode de fonctionnement (1/3)
• Étape 2 :
• Détecter les éventuelles redirections, sites morts, etc
(automatisable sous PHP avec « get_headers »).
• Générer les requêtes wget correspondantes.
• Lancer le crawl avec « wget ».
• Étape 3 : lancer l'indexation des pages collectées par
« wget ».
63
Mode de fonctionnement (3/3)
• Performances :
Active index: index-fr:
Create index:
From 30-06-2011 13:39:16 to 30-06-2011 13:44:28.
Size of the index: 4299 document(s) and 35,5Mo.
Time: 258,957s. (60,237ms./doc.).
Optimization time: 49,154s.
Tests:
Search (test): 25 result(s) (max.: 25) in 10,130ms. for 'python'.
Search (test): 69 result(s) (max.: 250) in 4,425ms. for 'python'.
Search (test): 25 result(s) (max.: 25) in 11,798ms. for 'python AND plone'.
Search (test): 27 result(s) (max.: 250) in 7,111ms. for 'python AND NOT plone'.
Search (test): 102 result(s) (max.: 250) in 8,569ms. for 'python OR plone^4'.
64
Les petits plus...
• Deux exemples :
• Visualisation des relations des entreprises
(écosystème).
• Création de nuages de tags.
65
Visualisation des relations
(écosystème)
• Exemple d'application :
• Visualiser les relations entre entreprises,et entre les
entreprises et leur environnement (communautés,
organismes publics, etc.)
• Comment faire ?
66
Processus
67
Résultat
68
Création d'un nuage de tags
• Exemple d'application:
• Pour chaque site Internet repris dans l'index:
• Avoir une vue des personnes importantes (employés,
références, etc.).
• Avoir une vue globale de l'entreprise (partenaires,
technologies, normes, localisations, etc.).
• Comment faire ?
69
Processus
71
Principales difficultés
72
Conclusion
73
Conclusion (1/2)
74
Conclusion (2/2)
75
Merci!
Des questions ?
76
Ressources et liens utiles
Dr Ir Robert Viseur
Email (@CETIC) : robert.viseur@cetic.be
Email (@UMONS) : robert.viseur@umons.ac.be
78