Créer un moteur de recherche avec des logiciels libres - Index of
Créer un moteur de recherche avec des logiciels libres - Index of
Créer un moteur de recherche avec des logiciels libres - Index of
Transformez vos PDF en papier électronique et augmentez vos revenus !
Optimisez vos papiers électroniques pour le SEO, utilisez des backlinks puissants et du contenu multimédia pour maximiser votre visibilité et vos ventes.
Qu'est-ce qu'<strong>un</strong> <strong>moteur</strong> <strong>de</strong><strong>recherche</strong> ?5
Définition« Un <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> est <strong>un</strong>e applicationpermettant <strong>de</strong> retrouver <strong>de</strong>s ressources (pagesweb, articles <strong>de</strong> forums Usenet, images, vidéo,fichiers, etc.) associées à <strong>de</strong>s mots quelconques »(Wikipedia).6
Étapes <strong>de</strong> fonctionnement• Crawler.•Collecter automatiquement les documents que l'on souhaite chercher sur <strong>un</strong> réseau local ou surInternet.• Extraire.•Extraire le contenu textuel (texte et métadonnées) <strong>de</strong>s ressources collectées.• Enrichir.•Trouver et ajouter <strong>de</strong> nouvelles informations sur base du contenu et <strong>de</strong> la structure du document.• Analyser•Analyser le contenu textuel (en vue <strong>de</strong> son in<strong>de</strong>xation).• In<strong>de</strong>xer.•Transformer le contenu textuel en <strong>un</strong>e forme facilitant la <strong>recherche</strong> par <strong>un</strong> ordinateur.• Rechercher.•Proposer <strong>un</strong>e interface <strong>de</strong> <strong>recherche</strong> pour <strong>de</strong>s utilisateurs (WUI) ou <strong>de</strong>s <strong>logiciels</strong> (API).• Composer•Associer à <strong>un</strong> ensemble <strong>de</strong> sources <strong>de</strong> résultats complémentaires.7
Crawler• Réseau Internet:• Ouvrir les pages Web issues d'<strong>un</strong> ensemble <strong>de</strong> pagesWeb <strong>de</strong> départ.• Extraire <strong>de</strong>s liens présents dans les pages Web.• Suivre ces liens (découverte automatique d'Internet).• Réseau local:• Suivre l'arborescence <strong>de</strong> répertoires, faire l'inventaire<strong>de</strong>s fichiers disponibles.• Éventuellement, constituer <strong>un</strong>e copie locale <strong>de</strong>sfichiers à in<strong>de</strong>xer.• Attention aux droits d'accès aux documents (sécurité)!8
Extraire (1/5)• L'in<strong>de</strong>xation se fait sur du texte brut (texte oumétadonnées).• Besoin d'extraire...• le contenu textuel associé au document / à laressource...• et/ou associé à son contexte (ex. : vidéo ou photoinsérée dans <strong>un</strong> document HTML).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 <strong>avec</strong> <strong>de</strong>s balises (tags).– Plus ou moins bien formé.• Exemple: HTML.10
Extraire (3/5)• Complexité variable (suite).• Besoin d'analyseurs spécialisés pour les formatsbinaires (ex. : photos, vidéos, documentsbureautiques, etc.).• Extraction <strong>de</strong>s métadonnées.– Exemple : tags ID3 dans les fichiers MP3.11
Extraire (4/5)• Complexité variable (suite).• Besoin d'analyseurs spécialisés pour les formats binaires(suite).• Extraction du texte.– Exemple : fichier dans le format ouvert ODT (fichiers XML et autresressources « zippées ».• Plus difficile si formats non documentés.12
Extraire (5/5)• Complexité variable (suite).• Beaucoup plus difficile pour les documents scannés(OCR).(...)13
Enrichir (1/3)• Il est possible d'aller plus loin que la simpleextraction <strong>de</strong>s métadonnées et du texte.• Pour les documents HTML:• Compréhension <strong>de</strong>s micr<strong>of</strong>ormats.• Exemple: hCard / vCard.14
Enrichir (2/3)• Pour les documents HTML (suite):• Rétroingénierie (extraction structurée -> redonner du sensaux informations formatées en HTML).15
Enrichir (3/3)• Pour les contenus textuels:• Extraction d'entités nommées.• Exemple : reconnaître <strong>de</strong>s noms <strong>de</strong> personnes,d'organisations, <strong>de</strong> villes, <strong>de</strong> pays, <strong>de</strong>s dates, etc.• Autre possibilité : exploiter <strong>de</strong>s <strong>logiciels</strong>, <strong>de</strong>s bases<strong>de</strong> données ou <strong>de</strong>s services externes pour enrichirle document.• Exemples: langue du document, catégorisation, etc.16
Analyser (1/2)• Généralement, cette tâche est réalisée parl'in<strong>de</strong>xeur lui-même.• Degré <strong>de</strong> sophistication variable.• Base: segmentation du texte par tokenization.• Les phrases sont décomposées en éléments simples.• Possibilité (ou non) <strong>de</strong> configurer <strong>de</strong>s règles <strong>de</strong>filtrage.• Exemple : suppression <strong>de</strong>s mots trop courts, suppression<strong>de</strong>s « stops words », etc.17
Analyser (2/2)• Degré <strong>de</strong> sophistication variable (suite).• Lemmatisation.• Transformation <strong>de</strong>s mots à in<strong>de</strong>xer en lemme (formecanonique).• Exemple: avoir = ai, as, a, avons, eussions eu, aurions, etc.• But: amélioration du rappel du <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong>(parfois au détriment <strong>de</strong> la précision).• Nécessite <strong>un</strong> dictionnaire dans la langue du document àin<strong>de</strong>xer.• Procédé voisin (plus basique) sur base <strong>de</strong> règles <strong>de</strong>troncature (stemming).• Exemple: algorithme <strong>de</strong> Porter.18
In<strong>de</strong>xer (1/3)• Création d'<strong>un</strong> in<strong>de</strong>x inversé.• Typiquement: structure mettant en correspondance<strong>de</strong>s mots <strong>avec</strong> <strong>un</strong> ensemble <strong>de</strong> documents.• La <strong>recherche</strong> d'<strong>un</strong> ou plusieurs mots permet <strong>de</strong>facilement retrouver les documents le ou lescontenant.19
In<strong>de</strong>xer (2/3)• Vue (très) simplifiée: = = In<strong>de</strong>x: pos=1 pos=2 pos=3 pos=1 pos=2Requêtes:q = -> q = OR -> , 20
In<strong>de</strong>xer (3/3)• Modèle <strong>de</strong> pertinence intégré.• Un classique: modèle TFxIDF.• La fréquence d'apparition <strong>de</strong> chaque terme dans <strong>un</strong>document est pondérée par la fréquence du terme dans lejeu <strong>de</strong> documents.• Évolutions possibles : classement fonction <strong>de</strong> lalocalisation, <strong>de</strong> la structure <strong>de</strong>s liens (cf. GooglePagerank), etc.21
Rechercher (1/2)• Proposer <strong>un</strong>e interface d'interrogation du <strong>moteur</strong>.• Pour humains (Web User Interface, WUI).• Pour logiciel (Application Programming Interface,API).• Raffinements possibles : catégorisation, clustering,facétisation, etc.22
Rechercher (2/2)• Remarque: Les <strong>moteur</strong>s <strong>de</strong> <strong>recherche</strong>commerciaux proposent <strong>un</strong>e API (Google, Bing,etc.).• Passage progressif au modèle payant.• Conditions d'utilisation parfois restrictives.• Problèmes <strong>de</strong> fiabilité (cf. webométrie).• Mais utilité:• pour initier <strong>de</strong>s crawls,• pour disposer <strong>de</strong> listes d'URLs ciblées (analyse enpr<strong>of</strong>on<strong>de</strong>ur),• pour compléter <strong>de</strong>s résultats <strong>de</strong> <strong>recherche</strong> (composition).23
Composer• Plusieurs sources <strong>de</strong> données peuvent êtrecombinées.• Exemples:• principe du méta<strong>moteur</strong>,• lien <strong>avec</strong> <strong>de</strong>s bases <strong>de</strong> données sémantiques.24
Faut-il utiliser <strong>un</strong>e base <strong>de</strong> données« fulltext » ou <strong>un</strong> pur in<strong>de</strong>xeur ?25
Bases <strong>de</strong> données simples (1/2)• Base <strong>de</strong> données = tables <strong>de</strong> données (lignes /colonnes) liées (via <strong>de</strong>s clefs / i<strong>de</strong>ntifiants).• Typage <strong>de</strong>s données, contraintes d'intégrité.• Language d'interrogation standardisé proche dulanguage humain (SQL).• Large disponibilité d'outils <strong>de</strong> création.• Par défaut, pas <strong>de</strong> fonctionnalité « fulltext ».26
Bases <strong>de</strong> données simples (2/2)• Recherche <strong>de</strong> texte possible par:• Recherche <strong>de</strong> sous-chaînes <strong>de</strong> caractères via "LIKE".• Sous-chaînes != mots.– Filtrage nécessaire avant affichage.• Recherche possible via <strong>de</strong>s expressions régulières.-> pas adapté à <strong>de</strong> gros volumes <strong>de</strong> données (>100.000 lignes par table).27
Base <strong>de</strong> données « fulltext »• Mêmes caractéristiques que pour la base <strong>de</strong> donnéessimple, mais...• Création automatique d'<strong>un</strong> in<strong>de</strong>x inversé.• Performances variables:• volume <strong>de</strong> données supporté (nombre d'enregistrements,longueur du texte),• finesse d'analyse du texte (lemmatisation ou non,personnalisation <strong>de</strong> l'analyse ou non, etc.),• richesse variable du langage d'interrogation,• support variable <strong>de</strong>s langues (si lemmatisation).• Le langage d'interrogation <strong>de</strong> l'in<strong>de</strong>x « fulltext » varied'<strong>un</strong> SGBG à <strong>un</strong> autre.28
Pur in<strong>de</strong>xeur• Outil dédié <strong>un</strong>iquement à la <strong>recherche</strong> fulltext.• Plus <strong>de</strong> structure tabulaire, <strong>de</strong> contraintesd'intégrité, ni <strong>de</strong> language d'interrogation<strong>un</strong>iversel.• En général:• conçu pour gérer <strong>de</strong> gros volumes <strong>de</strong> texte,• facilement embarquable dans <strong>un</strong> logiciel,• possibilités <strong>de</strong> personnalisation du comportement,• syntaxe d'interrogation riche,• notion <strong>de</strong> champs (sans contrainte).29
Technologies <strong>libres</strong>• Bases <strong>de</strong> données « fulltext » :• MySQL (mo<strong>de</strong> « fulltext »), PostgreSQL (Tsearch2),Sphynx Search (extension pour MySQL et PostgreSQL).• Pur in<strong>de</strong>xeur :• Lucene, ports Lucene, Xapian, Whoosh, etc.• Rapi<strong>de</strong> comparatif :• Remarque: couvertures fonctionnelles variables.30
Jusqu'où est-il utile <strong>de</strong> développersoi-même ?31
Approches possibles• Trois approches possibles :• Utilisation d'outils intégrés.• A utiliser s'ils sont adaptés.• Développement ex nihilo (DIY).• A démarrer si <strong>un</strong> avantage fonctionnel peut être trouvé.• Développement sur base <strong>de</strong> composants <strong>libres</strong>.• A privilégier si pas d'outil intégré disponible.• Suite : présentation non exhaustive <strong>de</strong> <strong>logiciels</strong><strong>libres</strong> disponibles.32
Existence d'outils intégrés (1/2)• Serveur d'in<strong>de</strong>xation: SolR (lucene.apache.org/solr/).• Comprend: extracteurs (Apache Tika), in<strong>de</strong>xeur(Lucene), API (JSON ou REST).• Méta<strong>moteur</strong>s:• Carrot² (méta<strong>moteur</strong>, clustering; carrot2.org).• Seeks (méta<strong>moteur</strong>, P2P; seeks-project.info).33
Existence d'outils intégrés (2/2)• Moteur <strong>de</strong> <strong>recherche</strong> intégré:• Nutch (nutch.apache.org).• Comprend: crawleur, extracteurs, in<strong>de</strong>xeur, WUI et API.• Basé sur SolR.• Fonctionnel <strong>avec</strong> Internet ou Intranet.• Moteur <strong>de</strong> <strong>recherche</strong> complet décentralisé (P2P):• YaCy (yacy.net).• Comprend: crawleur, extracteurs, in<strong>de</strong>xeur, WUI et API(OpenSearch).34
Plusieurs <strong>de</strong> langages <strong>de</strong>programmation adaptés au Web• Plusieurs languages <strong>de</strong> programmation <strong>libres</strong>adaptés au Web.• Exemples: Python, Perl, Java, Ruby, PHP, etc.• Possibilité <strong>de</strong> développements sur mesure...• Basé sur <strong>de</strong>s bibliothèques réutilisables– Exemple : gestion <strong>de</strong>s threads, ouverture d'URLs, analyse <strong>de</strong>textes, analyse HTML, etc.• Attention au syndrome NIH...35
Existence <strong>de</strong> composants spécialisés• Crawler:• Wget.• Extraire :• Lecture <strong>de</strong> flux RSS ou Atom:• Feedparser (Java, Python), Simplepie (PHP), etc.• Extraction <strong>de</strong> texte et <strong>de</strong> métadonnées :(1/3)• 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 <strong>de</strong> composants spécialisés• Analyser :• Stemming:• Snowball (Java).• Rétroingénierie <strong>de</strong> pages Web:• TAL:• DEiXTo, Web Harvest, etc.• OpenNLP (Java), NLTK (Python), etc.• Détection <strong>de</strong> langue:• Language-<strong>de</strong>tection (Java), NLTK (Python),Text_LanguageDetect (PHP), etc.• Extraction d'entités (nommées ou pas):• OpenNLP (Java), UIMA (Java), Stanbol, etc.(2/3)37
• In<strong>de</strong>xer :Existence <strong>de</strong> composants spécialisés• In<strong>de</strong>xation (SGBD):• MySQL, PostgreSQL, etc.• In<strong>de</strong>xation (in<strong>de</strong>xeur):• Lucene (Java), Whoosh (Python), Zend Search (PHP), etc.• Rechercher :• Classification:• Mahout (Java), NLTK (Python), Reverend (Python), etc.• Composer :• Méta<strong>moteur</strong> : Carrot².• Divers :• Bases <strong>de</strong> données:• DBPedia (Wikipedia), Geonames (base <strong>de</strong> données géographique), etc.(3/3)• Remarque : existence <strong>de</strong> très nombreux petits projets spécialisés et parfoistrès utiles.38
Et pourquoi pas du logicielpropriétaire ?• Existence <strong>de</strong> technologies propriétaires reconnues pour l'in<strong>de</strong>xation.• Exemples : Dtsearch, Oracle TEXT, etc.• Point fort : très large couverture fonctionnelle, performances <strong>de</strong> haut niveau.• Point faible : prix, « lock-in » technique.• Le mon<strong>de</strong> Java est alimenté par <strong>de</strong>s projets <strong>de</strong> <strong>recherche</strong> (publics ouprivés) en traitement <strong>de</strong> l'information.• Exemples (<strong>logiciels</strong> <strong>libres</strong>) : UIMA, Stanbol, Nepomuk, etc.• Existence d'alternatives en Python (parfois) et, dans <strong>un</strong>e moindre mesure, enMicros<strong>of</strong>t .Net (C#, ASPX, etc.).• Existence d'outils gratuits (mais non <strong>libres</strong>).• Exemples : TreeTagger, Sentiwordnet, etc.39
Exemples pratiques : création <strong>de</strong><strong>moteur</strong>s <strong>de</strong> <strong>recherche</strong> spécialisés40
Exemple 1 : <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong><strong>de</strong> podcasts• Objectif :• Sur base d'<strong>un</strong>e liste <strong>de</strong> podcasts (fichiers RSS)...• In<strong>de</strong>xer le contenu <strong>de</strong>s flux RSS...• En distinguant...• Les <strong>de</strong>scriptifs <strong>de</strong> chaque fichier RSS et...• Les <strong>de</strong>scriptions <strong>de</strong> chaque ressource multimédiaréférencée...• Et permettre <strong>de</strong>s <strong>recherche</strong>s par mots-clefs.41
Outils réutilisés• Lecture RSS : Feedparser (Python).• In<strong>de</strong>xation : MySQL (fulltext).• Fonctionnement simple (extension du SQL) :• Création <strong>de</strong> la table <strong>avec</strong> in<strong>de</strong>x :– CREATE TABLE news ( id INT UNSIGNEDAUTO_INCREMENT NOT NULL PRIMARY KEY, titleVARCHAR(256), content TEXT, FULLTEXT (title,content) )• Recherche par mot-clef :– SELECT id, title, content, MATCH(title,content) AGAINST ('linux') AS scoreFROM news WHERE MATCH (title,title) AGAINST('linux') ORDER BY score42
Résultat• Exemples <strong>de</strong> résultat <strong>de</strong> <strong>recherche</strong> :43
Exemple 2 : <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong><strong>de</strong> flux RSS• Objectif : découvrir, in<strong>de</strong>xer et <strong>recherche</strong>r <strong>de</strong>sflux RSS.44
Outils• In<strong>de</strong>xation via Zend Search (voir exemple 3).• Développement spécifique: crawler.• Développement Python utilisant « urllib », « string »,« sgmlparser » et « threading ».• Crawler (Python) spécialisé dans la découverte <strong>de</strong> flux RSS.• Principe: sur base d'<strong>un</strong>e liste d'URL (amorce),• le crawler (multi-thread) ouvre les pages d'accueil,• i<strong>de</strong>ntifie les flux RSS et Atom (et les ajoute à <strong>un</strong>e liste),• extrait les noms <strong>de</strong> domaine <strong>de</strong>s liens sortants,• et ajoute ces noms <strong>de</strong> domaine aux URLs à visiter.• But: explorer peu <strong>de</strong> pages HTML mais trouver <strong>un</strong> maximum<strong>de</strong> flux <strong>de</strong> syndication en <strong>un</strong> minimum <strong>de</strong> temps et <strong>avec</strong> <strong>un</strong>minimum <strong>de</strong> ban<strong>de</strong> passante.45
Résultat• Collecte aisée <strong>de</strong> plusieurs dizaines <strong>de</strong> milliers <strong>de</strong>flux RSS et Atom, en français, anglais, néerlandaiset espagnol.• Recherche avancée : par mots-clefs, par pays, parlangue, restriction possible aux podcasts.46
Exemple 3: <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong>• Point <strong>de</strong> départ: données <strong>de</strong> l'annuaireLogiciellibre.com.• Objectif :d'entreprises• A partir d'<strong>un</strong>e base <strong>de</strong> données d'adressesd'entreprises actives dans le logiciel libre...• Créer <strong>un</strong> in<strong>de</strong>x Web spécialisé...• Pour i<strong>de</strong>ntifier les entreprises actives sur certainestechnologies et étudier leur environnement.47
Outils réutilisés• Crawl: Wget.• In<strong>de</strong>xation: Zend Search.• Extraction d'entités: Boilerplate, OpenNLP.• Visualisation: WUI et DOT.48
Wget (1/2)• Utilitaire GNU en ligne <strong>de</strong> comman<strong>de</strong>, compatibleLinux ou Cygwin, permettant <strong>de</strong> récupérer <strong>de</strong>sfichiers en utilisant HTTP, HTTPS et FTP.• Comman<strong>de</strong> <strong>de</strong> base :• wget www.cetic.be• Stocke localement la page située à l'adresse« www.cetic.be ».• Comman<strong>de</strong> pour <strong>un</strong> crawl :• wget -r -l2 -P www -R jpg,gif,png 'http://www.cetic.be'• Crawl récursif <strong>de</strong> pr<strong>of</strong>on<strong>de</strong>ur 2 pour le site« http://www.cetic.be » et résultats du crawl dans le répertoire« www » (+ rejet <strong>de</strong>s photos).49
Wget (2/2)• Multiples options :• -r (crawl récursif)• Par défaut : respect <strong>de</strong> la convention « norobots »• -l (pr<strong>of</strong>on<strong>de</strong>ur <strong>de</strong> récursion)• -P (répertoire cible pour le stockage)• -A et -R (filtrage <strong>de</strong>s URLs par pattern)• --user-agent (« user agent » imposé)• ...• Plus d'infos : http://www.gnu.org/s<strong>of</strong>tware/wget/manual/ .• Alternative : curl (puissant mais... pas <strong>de</strong> crawlrécursif).50
Lucene (1/2)• Outil d'in<strong>de</strong>xation supporté par la fondation Apache(lucene.apache.org).• Ecosystème étendu :• Utilisé dans Alfresco, Jahia, Liferay,...• Extension au cloud (ex. : CouchDB-lucene).• Beaucoup d'outils tiers : Luke (lecture d'<strong>un</strong> in<strong>de</strong>x),Solr (serveur <strong>de</strong> <strong>recherche</strong> ; sans crawler), Nutch(<strong>moteur</strong> <strong>de</strong> <strong>recherche</strong> <strong>avec</strong> crawler), Carrot2(interface <strong>de</strong> <strong>recherche</strong> compatible OpenSearch etSolr),...• Cf. http://wiki.apache.org/lucene-java/PoweredBy .51
Lucene (2/2)• Le format d'in<strong>de</strong>x est <strong>de</strong>venu <strong>un</strong>e sorte <strong>de</strong>standard.• Nombreux portages : Lucene.Net (. Net), PyLucene(Python), CLucene (C++) Plucene (Perl), ZendSearch (PHP),...• Différents types <strong>de</strong> portages : par traductionlittérale (compatibilité d'API d'abord), partraduction optimisée pour le langage cible(performances d'abord) et par binding (Python).• Points à surveiller : couverture fonctionnelle,version <strong>de</strong> l'in<strong>de</strong>x,...52
Zend Search (1/4)• Portage <strong>de</strong> Lucene en PHP.• API spécifique.• Support <strong>de</strong> la version d'in<strong>de</strong>x 2.3 (<strong>de</strong>puis ZendFramework 1.6).• Support <strong>de</strong> l'UTF-8 en interne.• Intégré au framework Zend mais utilisableséparément (taille sur disque : 734,3 ko).• Taille d'in<strong>de</strong>x théorique maximum = 2GB (système 32bits).• Facilement hébergeable (installable sur <strong>un</strong>hébergement mutualisé type OVH ou Lost Oasis).53
Zend Search (2/4)• Plusieurs types <strong>de</strong> champs supportés :« Keyword », « UnIn<strong>de</strong>xed », « Binary », « Text »et « UnStored ».54
Zend Search (3/4)• Syntaxe supportée lors <strong>de</strong>s <strong>recherche</strong>s :• Opérateurs booléens (« OR » ou « || », « AND » ou « && »,« NOT » ou « ! », « + », « - »),• indicateur <strong>de</strong> champs (« title: »),• jokers (« ? » ou « * »),• <strong>recherche</strong> par intervalle (dates ou chaines),• <strong>recherche</strong> floue (« ~ »),• <strong>recherche</strong>s <strong>de</strong> proximité (« ~ »),• facteur <strong>de</strong> boost (« ^ »).• Possibilité <strong>de</strong> trier par champs.• Cf. http://framework.zend.com/manual/fr/zend.search.lucene.searching.html ethttp://framework.zend.com/manual/fr/zend.search.lucene.query-language.html .55
Zend Search (4/4)• Possibilité <strong>de</strong> personnaliser l'analyse <strong>de</strong>s documents :• Utilisation d'<strong>un</strong> analyseur par défaut(Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive).• Possibilité <strong>de</strong> choisir <strong>un</strong> analyseur (compatible UTF-8,compatible <strong>avec</strong> les nombres,...).• Possibilité <strong>de</strong> configurer <strong>de</strong>s filtres (« lowercase »,« stop words », « short words »).• Possibilité <strong>de</strong> créer son propre analyseur.• Cf. http://framework.zend.com/manual/fr/zend.search.lucene.extending.html .• Possibilité <strong>de</strong> chargement direct <strong>de</strong> documents :formats HTML, MS Word / Powerpoint / Excel,...56
Encodage UTF-8 sous PHP (1/2)• PHP 5 (et
Encodage UTF-8 sous PHP (2/2)• Dans PHP :• La logique est différente <strong>de</strong> celle <strong>de</strong> Python, qui propose <strong>un</strong>type « string » et <strong>un</strong> type « Unico<strong>de</strong> ». PHP est très faiblementtypé et travaille <strong>un</strong>iquement <strong>avec</strong> <strong>de</strong>s chaines.• La conversion entre ISO et UTF-8 se fait à l'ai<strong>de</strong> <strong>de</strong>s fonctions« utf8_enco<strong>de</strong>() » et « utf8_<strong>de</strong>co<strong>de</strong>() ». Les autres conversionsse font via « iconv ».• La manipulation <strong>de</strong>s chaines en UTF-8 se fait à l'ai<strong>de</strong> <strong>de</strong> labibliothèque « mbstring ».• La détermination <strong>de</strong> l'encodage <strong>de</strong>s caractères en entréen'est pas triviale (hea<strong>de</strong>rs HTTP parfois erronés,métadonnées HTML parfois absentes ou erronées, outils <strong>de</strong>détection pas toujours fiables,...).58
In<strong>de</strong>xation sous Zend Search (1/2)• Création d'<strong>un</strong> in<strong>de</strong>x et insertion :$in<strong>de</strong>x = Zend_Search_Lucene::create('/data/my-in<strong>de</strong>x');$doc = new Zend_Search_Lucene_Document();$doc->addField(Zend_Search_Lucene_Field::Text('title', $docTitle));$doc->addField(Zend_Search_Lucene_Field::UnIn<strong>de</strong>xed('url', $docUrl));$doc->addField(Zend_Search_Lucene_Field::UnStored('content',$docContent));$in<strong>de</strong>x->addDocument($doc);$in<strong>de</strong>x->commit() ;• Optimisation <strong>de</strong> l'in<strong>de</strong>x :$in<strong>de</strong>x->optimize();59
In<strong>de</strong>xation sous Zend Search (2/2)• Ouverture d'<strong>un</strong> in<strong>de</strong>x et <strong>recherche</strong> :$in<strong>de</strong>x = Zend_Search_Lucene::open('/data/my-in<strong>de</strong>x') ;$query = Zend_Search_Lucene_Search_QueryParser::parse($input);$hits = $in<strong>de</strong>x->find($query);foreach ($hits as $hit) {echo $hit->score;echo $hit->title;echo $hit->url;}• Paramètres : opérateur par défaut, encodage <strong>de</strong>sdonnées,...60
Divers• Attention : wget affecte conventionnellement le nom « in<strong>de</strong>x.html » àl'adresse « / ».• Analyse <strong>de</strong>s documents HTML :• native (cf. « Zend_Search_Lucene_Document_Html »),• manuelle non structurée (extraction <strong>de</strong>s métadonnées -title, <strong>de</strong>scription,...-par expressions régulières et nettoyage du via « strip_tags ») ou...• manuelle structurée (extraction structurée par expression régulière ou Xpath).• Lucene ne gère pas les contraintes d'intégrité.• Les doublons ne peuvent donc pas être évités via <strong>un</strong> champ « UNIQUE ».• Or, hash utile sur l'URL, voire sur le contenu (duplicate content).• Solutions possibles : test sur <strong>un</strong> champ <strong>un</strong>ique dans l'in<strong>de</strong>x ou test sur based'<strong>un</strong>e table externe (ex. : hash dans SQLite).61
Mo<strong>de</strong> <strong>de</strong> fonctionnement (1/3)• Étape 1 : constituer <strong>un</strong>e base <strong>de</strong> données d'URLs (basé surlogiciellibre.com).• Étape 2 :• Détecter les éventuelles redirections, sites morts, etc(automatisable sous PHP <strong>avec</strong> « get_hea<strong>de</strong>rs »).• Générer les requêtes wget correspondantes.• Lancer le crawl <strong>avec</strong> « wget ».• Étape 3 : lancer l'in<strong>de</strong>xation <strong>de</strong>s pages collectées par« wget ».• Utilité : i<strong>de</strong>ntifier les prestataires actifs sur <strong>un</strong>e ou plusieurstechnologies particulières.62
Mo<strong>de</strong> <strong>de</strong> fonctionnement (2/3)63
Mo<strong>de</strong> <strong>de</strong> fonctionnement (3/3)• Performances :Active in<strong>de</strong>x: in<strong>de</strong>x-fr:Create in<strong>de</strong>x:From 30-06-2011 13:39:16 to 30-06-2011 13:44:28.Size <strong>of</strong> the in<strong>de</strong>x: 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 <strong>de</strong>s relations <strong>de</strong>s entreprises(écosystème).• Création <strong>de</strong> nuages <strong>de</strong> tags.65
• Exemple d'application :Visualisation <strong>de</strong>s relations(écosystème)• Visualiser les relations entre entreprises,et entre lesentreprises et leur environnement (comm<strong>un</strong>autés,organismes publics, etc.)• Comment faire ?66
Processus• Sur base <strong>de</strong>s liens hypertextes entre les sites.• Comptabilisation <strong>de</strong>s relations <strong>de</strong> page à page.• Utilisation du format DOT pour représenter legraphe <strong>de</strong> relations.• Utilisation du logiciel en ligne <strong>de</strong> comman<strong>de</strong> Dot.• Remarque : existence d'outils plus évolués: Gephi(gephi.org), Tulip (tulip.labri.fr), etc.67
Résultat68
Création d'<strong>un</strong> nuage <strong>de</strong> tags• Exemple d'application:• Pour chaque site Internet repris dans l'in<strong>de</strong>x:• Avoir <strong>un</strong>e vue <strong>de</strong>s personnes importantes (employés,références, etc.).• Avoir <strong>un</strong>e vue globale <strong>de</strong> l'entreprise (partenaires,technologies, normes, localisations, etc.).• Comment faire ?69
Processus• Base: copie locale <strong>de</strong>s sites obtenue par wget.• Pour chaque page HTML d'<strong>un</strong> site Web:1. Extraction du contenu textuel utile <strong>avec</strong>Boilerplate.2. Analyse du contenu textuel <strong>avec</strong> OpenNLP.●●Extraction <strong>de</strong>s noms <strong>de</strong> personnes.Étiquetage grammatical.●Extraction <strong>de</strong>s noms propres (personnes, entreprises,technologies, normes, etc.).3. Tri (filtrage : fréquence, « patterns »).4. Création <strong>de</strong>s nuages <strong>de</strong> tags.70
Résultat71
Principales difficultés• Principalement liées à OpenNLP• Fiabilité globalement correcte mais...• Sensibilité vis-à-vis du texte donné en entrée.– Exemple : Andy Gibbs 1 FelipeContreras 1 Fre<strong>de</strong>rik Pasch 1 Heiko Zuerker 1 JavierViguera 1 Luca Ceresoli 1 MarceloRoberto Jimenez 1 Marcus Osdoba 1 Matt Johnson 1 Paul Burton 1 Paul Jones 1 – Importance <strong>de</strong> la conversion HTML -> texte.• Nombre limité <strong>de</strong> fichiers d'entrainement.– Exemple: étiquetage grammatical (disponible en anglais, néerlandais ouespagnol, mais pas en français).• Le filtrage sur base <strong>de</strong> la fréquence d'apparition limite laprésence <strong>de</strong> tags peu pertinents.72
Conclusion73
Conclusion (1/2)• Large variété d'outils <strong>libres</strong> disponibles:• <strong>logiciels</strong> intégrés,• Composants réutilisables,• bibliothèques <strong>de</strong> base.• Capacité <strong>de</strong>s outils <strong>libres</strong> à répondre à <strong>de</strong>s besoinsvariés mais...• Concepts <strong>de</strong> base à maîtriser.• Intégration (souvent) moindre comparé à <strong>de</strong>séquivalents propriétaires (ex.: Oracle Text).74
Conclusion (2/2)• Sujets peu ou prou abordés :• Problématique <strong>de</strong> passage à l'échelle.• Temps <strong>de</strong>s crawls (et leur ciblage).• Temps d'analyse <strong>de</strong>s contenus.• Gestion <strong>de</strong>s grands volumes <strong>de</strong> données (> million <strong>de</strong>documents).• Technologies Cloud (ex.: bases NoSQL, Hadoop, etc.).• Développement <strong>de</strong> <strong>moteur</strong>s <strong>de</strong> <strong>recherche</strong>sémantiques.• Cf. Fauconnier et Roumier (2011).75
Merci!Merci pour votre attention.Des questions ?76
Ressources et liens utiles• Robert Viseur (2012). « De l'annuaire <strong>de</strong> sites à la <strong>recherche</strong>sociale: 15 ans d'évolution! ». Etudiant Polytech d'<strong>un</strong> jour(UMONS). URL : http://www.robertviseur.be/news-20120225.php .• Robert Viseur (2011). « Développement d'<strong>un</strong> <strong>moteur</strong> <strong>de</strong> <strong>recherche</strong><strong>avec</strong> Zend Search ». RMLL 2011. URL : http://www.robertviseur.be/news-20110721.php .• Jean-Philippe Fauconnier et Joseph Roumier (2011). SemanticSearch Engine Dedicated to Music & Musicians. Music Linked DataWorkshop, London, May 12, 2011. URL : http://shrl.be/000092 .• Robert Viseur (2010). « Introduction to libre « fulltext »technology ». RMLL 2010. URL : http://www.robertviseur.be/news-20100710.php .• Erik Hatcher et Otis Gospodnetić (2004). « Lucene in Action ».Manning Publications Co.• Soumen Chakrabarti (2003). « Mining the Web - DiscoveringKnowledge from Hypertext Data ». Morgan Kaufmann.77
ContactDr Ir Robert ViseurEmail (@CETIC) :Email (@UMONS) :robert.viseur@cetic.berobert.viseur@umons.ac.beTéléphone : 0032 (0) 479 66 08 76Internet :www.robertviseur.beCette présentation est diffusée sous licence « CC-BY-ND ».78