[ Jeudis du Libre, Mons – Mercredi 16 mai 2012 ]Créer un moteur de recherche avec                des logiciels libres     ...
Qui suis-je ?• Robert Viseur  • Ingénieur Civil, Mastère en Management de    lInnovation, Docteur en Sciences Appliquées. ...
Quest-ce que le CETIC ?• Centre dExcellence en Technologies de lInformation et  de la Communication basé à Charleroi (Belg...
De quoi allons-nous parler ?• Sujet : comment créer un moteur de recherche à  base de logiciels libres ?• Plan :   • Quest...
Quest-ce quun moteur de               recherche ?                         5
Définition  « Un moteur de recherche est une application permettant de retrouver des ressources (pages web, articles de fo...
Étapes de fonctionnement• Crawler.   • Collecter automatiquement les documents que lon souhaite chercher sur un réseau loc...
Crawler• Réseau Internet:    • Ouvrir les pages Web issues dun ensemble de pages      Web de départ.    • Extraire des lie...
Extraire (1/5)• Lindexation se fait sur du texte brut (texte ou  métadonnées).• Besoin dextraire...   • le contenu textuel...
Extraire (2/5)• Complexité variable.  • Très simple pour du texte.  • Simple pour du (X)HTML ou du XML (RSS, Atom,    FOAF...
Extraire (3/5)• Complexité variable (suite).   • Besoin danalyseurs spécialisés pour les formats     binaires (ex. : photo...
Extraire (4/5)• Complexité variable (suite).   • Besoin danalyseurs spécialisés pour les formats binaires     (suite).    ...
Extraire (5/5)• Complexité variable (suite).   • Beaucoup plus difficile pour les documents scannés     (OCR).            ...
Enrichir (1/3)• Il est possible daller plus loin que la simple  extraction des métadonnées et du texte.• Pour les document...
Enrichir (2/3)• Pour les documents HTML (suite):     • Rétroingénierie (extraction structurée -> redonner du sens       au...
Enrichir (3/3)• Pour les contenus textuels:   • Extraction dentités nommées.      • Exemple : reconnaître des noms de pers...
Analyser (1/2)• Généralement, cette tâche est réalisée par  lindexeur lui-même.• Degré de sophistication variable.  • Base...
Analyser (2/2)• Degré de sophistication variable (suite).   • Lemmatisation.      • Transformation des mots à indexer en l...
Indexer (1/3)• Création dun index inversé.   • Typiquement: structure mettant en correspondance     des mots avec un ensem...
Indexer (2/3)• Vue (très) simplifiée:   <doc1> = <mot1> <mot2> <mot3>   <doc2> = <mot4> <mot1>  Index:  <mot1>   <doc1>   ...
Indexer (3/3)• Modèle de pertinence intégré.  • Un classique: modèle TFxIDF.     • La fréquence dapparition de chaque term...
Rechercher (1/2)• Proposer une interface dinterrogation du moteur.   • Pour humains (Web User Interface, WUI).   • Pour lo...
Rechercher (2/2)• Remarque: Les moteurs de recherche  commerciaux proposent une API (Google, Bing,  etc.).  •   Passage pr...
Composer• Plusieurs sources de données peuvent être  combinées.• Exemples:  • principe du métamoteur,  • lien avec des bas...
Faut-il utiliser une base de données  « fulltext » ou un pur indexeur ?                                   25
Bases de données simples (1/2)• Base de données = tables de données (lignes /  colonnes) liées (via des clefs / identifian...
Bases de données simples (2/2)• Recherche de texte possible par:  • Recherche de sous-chaînes de caractères via "LIKE".   ...
Base de données « fulltext »• Mêmes caractéristiques que pour la base de données  simple, mais...  • Création automatique ...
Pur indexeur• Outil dédié uniquement à la recherche fulltext.• Plus de structure tabulaire, de contraintes  dintégrité, ni...
Technologies libres• Bases de données « fulltext » :   • MySQL (mode « fulltext »), PostgreSQL (Tsearch2),     Sphynx Sear...
Jusquoù est-il utile de développer                         soi-même ?                                  31
Approches possibles• Trois approches possibles :   • Utilisation doutils intégrés.      • A utiliser sils sont adaptés.   ...
Existence doutils intégrés (1/2)• Serveur dindexation: SolR (lucene.apache.org/solr/).   • Comprend: extracteurs (Apache T...
Existence doutils intégrés (2/2)•   Moteur de recherche intégré:    • Nutch (nutch.apache.org).       • Comprend: crawleur...
Plusieurs de langages de          programmation adaptés au Web• Plusieurs languages de programmation libres  adaptés au We...
Existence de composants spécialisés                                 (1/3)• Crawler:   • Wget.• Extraire :   • Lecture de f...
Existence de composants spécialisés                                 (2/3)• Analyser :   • Stemming:      • Snowball (Java)...
Existence de composants spécialisés                                   (3/3)• Indexer :   • Indexation (SGBD):      • MySQL...
Et pourquoi pas du logiciel                                         propriétaire ?• Existence de technologies propriétaire...
Exemples pratiques : création demoteurs de recherche spécialisés                               40
Exemple 1 : moteur de recherche                            de podcasts• Objectif :   • Sur base dune liste de podcasts (fi...
Outils réutilisés• Lecture RSS : Feedparser (Python).• Indexation : MySQL (fulltext).  • Fonctionnement simple (extension ...
Résultat• Exemples de résultat de recherche :                                               43
Exemple 2 : moteur de recherche                            de flux RSS• Objectif : découvrir, indexer et rechercher des  f...
Outils• Indexation via Zend Search (voir exemple 3).• Développement spécifique: crawler.   • Développement Python utilisan...
Résultat• Collecte aisée de plusieurs dizaines de milliers de  flux RSS et Atom, en français, anglais, néerlandais  et esp...
Exemple 3: moteur de recherche                           dentreprises• Point de départ: données de lannuaire  Logiciellibr...
Outils réutilisés•   Crawl: Wget.•   Indexation: Zend Search.•   Extraction dentités: Boilerplate, OpenNLP.•   Visualisati...
Wget (1/2)• Utilitaire GNU en ligne de commande, compatible  Linux ou Cygwin, permettant de récupérer des  fichiers en uti...
Wget (2/2)• Multiples options :   • -r (crawl récursif)        • Par défaut : respect de la convention « norobots »   •   ...
Lucene (1/2)• Outil dindexation supporté par la fondation Apache  (lucene.apache.org).• Ecosystème étendu :   • Utilisé da...
Lucene (2/2)• Le format dindex est devenu une sorte de  standard.  • Nombreux portages : Lucene.Net (. Net), PyLucene    (...
Zend Search (1/4)• Portage de Lucene en PHP.  • API spécifique.  • Support de la version dindex 2.3 (depuis Zend    Framew...
Zend Search (2/4)• Plusieurs types de champs supportés :  « Keyword », « UnIndexed », « Binary », « Text »  et « UnStored ...
Zend Search (3/4)• Syntaxe supportée lors des recherches :    • Opérateurs booléens (« OR » ou « || », « AND » ou « && », ...
Zend Search (4/4)• Possibilité de personnaliser lanalyse des documents :   • Utilisation dun analyseur par défaut     (Zen...
Encodage UTF-8 sous PHP (1/2)• PHP 5 (et <5) travaille en ISO-8859-1.• Problème ?   • LUTF-8 permet de présenter davantage...
Encodage UTF-8 sous PHP (2/2)• Dans PHP :  • La logique est différente de celle de Python, qui propose un    type « string...
Indexation sous Zend Search (1/2)• Création dun index et insertion :     $index = Zend_Search_Lucene::create(/data/my-inde...
Indexation sous Zend Search (2/2)• Ouverture dun index et recherche :   $index = Zend_Search_Lucene::open(/data/my-index) ...
Divers• Attention : wget affecte conventionnellement le nom « index.html » à  ladresse « / ».• Analyse des documents HTML ...
Mode de fonctionnement (1/3)• Étape 1 : constituer une base de données dURLs (basé sur  logiciellibre.com).• Étape 2 :   •...
Mode de fonctionnement (2/3)                           63
Mode de fonctionnement (3/3)• Performances :Active index: index-fr: Create index:   From 30-06-2011 13:39:16 to 30-06-2011...
Les petits plus...• Deux exemples :  • Visualisation des relations des entreprises    (écosystème).  • Création de nuages ...
Visualisation des relations                                 (écosystème)• Exemple dapplication :   • Visualiser les relati...
Processus• Sur base des liens hypertextes entre les sites.   • Comptabilisation des relations de page à page.   • Utilisat...
Résultat       68
Création dun nuage de tags• Exemple dapplication:    • Pour chaque site Internet repris dans lindex:       • Avoir une vue...
Processus• Base: copie locale des sites obtenue par wget.• Pour chaque page HTML dun site Web:   1. Extraction du contenu ...
Résultat       71
Principales difficultés• Principalement liées à OpenNLP  • Fiabilité globalement correcte mais...     • Sensibilité vis-à-...
Conclusion         73
Conclusion (1/2)•   Large variété doutils libres disponibles:    • logiciels intégrés,    • Composants réutilisables,    •...
Conclusion (2/2)• Sujets peu ou prou abordés :  • Problématique de passage à léchelle.     • Temps des crawls (et leur cib...
Merci!Merci pour votre attention.     Des questions ?                                   76
Ressources et liens utiles• Robert Viseur (2012). « De lannuaire de sites à la recherche  sociale: 15 ans dévolution! ». E...
ContactDr Ir Robert Viseur Email (@CETIC) :             robert.viseur@cetic.be Email (@UMONS) :             robert.viseur@...
Prochain SlideShare
Chargement dans…5
×

Créer un moteur de recherche avec des logiciels libres

6 142 vues

Publié le

Lorsque l’on parle de moteur de recherche, les noms de Google, Bing ou Yahoo! viennent immédiatement à l’esprit. La taille de ces moteurs (plusieurs milliards de pages indexées), l’importance des infrastructures (grands centres de données) et la pertinence des résultats de recherche peuvent donner l’impression que les développements spécifiques sont devenus impossibles ou sans intérêt.

La création de moteurs de recherche spécialisés reste cependant possible, et utile pour certains usages particuliers (ex.: moteurs de recherche d’entreprise, mise en place de systèmes de veille, etc.). Pour ce faire, le développeur peut s’appuyer sur les interfaces de programmation (API) généralement mises à disposition par les moteurs de recherche commerciaux mais aussi sur les très nombreux composants et logiciels libres existants. Ces derniers couvrent la collecte des données textuelles, leur analyse, leur indexation et leur présentation.

La présentation détaille les différentes étapes de création d’un moteur de recherche. Les outils libres disponibles, ainsi que leurs limites et cadres d’utilisation privilégiés, sont ensuite présentés.

Publié dans : Technologie
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
6 142
Sur SlideShare
0
Issues des intégrations
0
Intégrations
186
Actions
Partages
0
Téléchargements
107
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Créer un moteur de recherche avec des logiciels libres

  1. 1. [ Jeudis du Libre, Mons – Mercredi 16 mai 2012 ]Créer un moteur de recherche avec des logiciels libres Auteur : Dr Ir Robert Viseur
  2. 2. Qui suis-je ?• Robert Viseur • Ingénieur Civil, Mastère en Management de lInnovation, 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 linformation (outils dindexation, API,...). • Assistant à la Faculté Polytechnique de lUniversité de Mons (www.umons.ac.be). • Conseiller technologique au CETIC (www.cetic.be). 2
  3. 3. Quest-ce que le CETIC ?• Centre dExcellence en Technologies de lInformation et de la Communication basé à Charleroi (Belgique).• Trois départements (et types de services) : • Software & System Engineering : qualité logicielle (fiabilité, sécurité, respect des normes internationales, processus,...). • Software & Services Technologies : architectures orientées services et sémantique. • Embedded & Communication Systems : prototypage de systèmes embarqués communicants et nouvelles technologies électroniques. 3
  4. 4. De quoi allons-nous parler ?• Sujet : comment créer un moteur de recherche à base de logiciels libres ?• Plan : • Quest-ce quun moteur de recherche ? • Faut-il utiliser une base de données « fulltext » ou un pur indexeur ? • Jusquoù est-il utile de développer soi-même ? • Exemples : création de moteurs de recherche spécialisés. 4
  5. 5. Quest-ce quun moteur de recherche ? 5
  6. 6. Définition « Un moteur de recherche est une application permettant de retrouver des ressources (pages web, articles de forums Usenet, images, vidéo,fichiers, etc.) associées à des mots quelconques » (Wikipedia). 6
  7. 7. Étapes de fonctionnement• Crawler. • Collecter automatiquement les documents que lon 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
  8. 8. Crawler• Réseau Internet: • Ouvrir les pages Web issues dun ensemble de pages Web de départ. • Extraire des liens présents dans les pages Web. • Suivre ces liens (découverte automatique dInternet).• Réseau local: • Suivre larborescence de répertoires, faire linventaire des fichiers disponibles. • Éventuellement, constituer une copie locale des fichiers à indexer. • Attention aux droits daccès aux documents (sécurité)! 8
  9. 9. Extraire (1/5)• Lindexation se fait sur du texte brut (texte ou métadonnées).• Besoin dextraire... • le contenu textuel associé au document / à la ressource... • et/ou associé à son contexte (ex. : vidéo ou photo insérée dans un document HTML). 9
  10. 10. 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
  11. 11. Extraire (3/5)• Complexité variable (suite). • Besoin danalyseurs spécialisés pour les formats binaires (ex. : photos, vidéos, documents bureautiques, etc.). • Extraction des métadonnées. – Exemple : tags ID3 dans les fichiers MP3. 11
  12. 12. Extraire (4/5)• Complexité variable (suite). • Besoin danalyseurs spécialisés pour les formats binaires (suite). • Extraction du texte. – Exemple : fichier dans le format ouvert ODT (fichiers XML et autres ressources « zippées ». • Plus difficile si formats non documentés. 12
  13. 13. Extraire (5/5)• Complexité variable (suite). • Beaucoup plus difficile pour les documents scannés (OCR). (...) 13
  14. 14. Enrichir (1/3)• Il est possible daller plus loin que la simple extraction des métadonnées et du texte.• Pour les documents HTML: • Compréhension des microformats. • Exemple: hCard / vCard. 14
  15. 15. Enrichir (2/3)• Pour les documents HTML (suite): • Rétroingénierie (extraction structurée -> redonner du sens aux informations formatées en HTML). 15
  16. 16. Enrichir (3/3)• Pour les contenus textuels: • Extraction dentités nommées. • Exemple : reconnaître des noms de personnes, dorganisations, de villes, de pays, des dates, etc.• Autre possibilité : exploiter des logiciels, des bases de données ou des services externes pour enrichir le document. • Exemples: langue du document, catégorisation, etc. 16
  17. 17. Analyser (1/2)• Généralement, cette tâche est réalisée par lindexeur lui-même.• Degré de sophistication variable. • Base: segmentation du texte par tokenization. • Les phrases sont décomposées en éléments simples. • Possibilité (ou non) de configurer des règles de filtrage. • Exemple : suppression des mots trop courts, suppression des « stops words », etc. 17
  18. 18. Analyser (2/2)• Degré de sophistication variable (suite). • Lemmatisation. • Transformation des mots à indexer en lemme (forme canonique). • Exemple: avoir = ai, as, a, avons, eussions eu, aurions, etc. • But: amélioration du rappel du moteur de recherche (parfois au détriment de la précision). • Nécessite un dictionnaire dans la langue du document à indexer. • Procédé voisin (plus basique) sur base de règles de troncature (stemming). • Exemple: algorithme de Porter. 18
  19. 19. Indexer (1/3)• Création dun index inversé. • Typiquement: structure mettant en correspondance des mots avec un ensemble de documents. • La recherche dun ou plusieurs mots permet de facilement retrouver les documents le ou les contenant. 19
  20. 20. Indexer (2/3)• Vue (très) simplifiée: <doc1> = <mot1> <mot2> <mot3> <doc2> = <mot4> <mot1> 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
  21. 21. Indexer (3/3)• Modèle de pertinence intégré. • Un classique: modèle TFxIDF. • La fréquence dapparition de chaque terme dans un document est pondérée par la fréquence du terme dans le jeu de documents. • Évolutions possibles : classement fonction de la localisation, de la structure des liens (cf. Google Pagerank), etc. 21
  22. 22. Rechercher (1/2)• Proposer une interface dinterrogation du moteur. • Pour humains (Web User Interface, WUI). • Pour logiciel (Application Programming Interface, API).• Raffinements possibles : catégorisation, clustering, facétisation, etc. 22
  23. 23. Rechercher (2/2)• Remarque: Les moteurs de recherche commerciaux proposent une API (Google, Bing, etc.). • Passage progressif au modèle payant. • Conditions dutilisation parfois restrictives. • Problèmes de fiabilité (cf. webométrie). • Mais utilité: • pour initier des crawls, • pour disposer de listes dURLs ciblées (analyse en profondeur), • pour compléter des résultats de recherche (composition). 23
  24. 24. Composer• Plusieurs sources de données peuvent être combinées.• Exemples: • principe du métamoteur, • lien avec des bases de données sémantiques. 24
  25. 25. Faut-il utiliser une base de données « fulltext » ou un pur indexeur ? 25
  26. 26. Bases de données simples (1/2)• Base de données = tables de données (lignes / colonnes) liées (via des clefs / identifiants).• Typage des données, contraintes dintégrité.• Language dinterrogation standardisé proche du language humain (SQL).• Large disponibilité doutils de création.• Par défaut, pas de fonctionnalité « fulltext ». 26
  27. 27. Bases de données simples (2/2)• Recherche de texte possible par: • Recherche de sous-chaînes de caractères via "LIKE". • Sous-chaînes != mots. – Filtrage nécessaire avant affichage. • Recherche possible via des expressions régulières.-> pas adapté à de gros volumes de données (>100.000 lignes par table). 27
  28. 28. Base de données « fulltext »• Mêmes caractéristiques que pour la base de données simple, mais... • Création automatique dun index inversé. • Performances variables: • volume de données supporté (nombre denregistrements, longueur du texte), • finesse danalyse du texte (lemmatisation ou non, personnalisation de lanalyse ou non, etc.), • richesse variable du langage dinterrogation, • support variable des langues (si lemmatisation). • Le langage dinterrogation de lindex « fulltext » varie dun SGBG à un autre. 28
  29. 29. Pur indexeur• Outil dédié uniquement à la recherche fulltext.• Plus de structure tabulaire, de contraintes dintégrité, ni de language dinterrogation universel.• En général: • conçu pour gérer de gros volumes de texte, • facilement embarquable dans un logiciel, • possibilités de personnalisation du comportement, • syntaxe dinterrogation riche, • notion de champs (sans contrainte). 29
  30. 30. Technologies libres• Bases de données « fulltext » : • MySQL (mode « fulltext »), PostgreSQL (Tsearch2), Sphynx Search (extension pour MySQL et PostgreSQL).• Pur indexeur : • Lucene, ports Lucene, Xapian, Whoosh, etc.• Rapide comparatif :• Remarque: couvertures fonctionnelles variables. 30
  31. 31. Jusquoù est-il utile de développer soi-même ? 31
  32. 32. Approches possibles• Trois approches possibles : • Utilisation doutils intégrés. • A utiliser sils sont adaptés. • Développement ex nihilo (DIY). • A démarrer si un avantage fonctionnel peut être trouvé. • Développement sur base de composants libres. • A privilégier si pas doutil intégré disponible.• Suite : présentation non exhaustive de logiciels libres disponibles. 32
  33. 33. Existence doutils intégrés (1/2)• Serveur dindexation: SolR (lucene.apache.org/solr/). • Comprend: extracteurs (Apache Tika), indexeur (Lucene), API (JSON ou REST).• Métamoteurs: • Carrot² (métamoteur, clustering; carrot2.org). • Seeks (métamoteur, P2P; seeks-project.info). 33
  34. 34. Existence doutils intégrés (2/2)• Moteur de recherche intégré: • Nutch (nutch.apache.org). • Comprend: crawleur, extracteurs, indexeur, WUI et API. • Basé sur SolR. • Fonctionnel avec Internet ou Intranet.• Moteur de recherche complet décentralisé (P2P): • YaCy (yacy.net). • Comprend: crawleur, extracteurs, indexeur, WUI et API (OpenSearch). 34
  35. 35. 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 dURLs, analyse de textes, analyse HTML, etc. • Attention au syndrome NIH... 35
  36. 36. 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 darticles (contenu utile) : • Boilerpipe (Java). • OCR: • GOCR, OCRAD, Tesseract, etc. 36
  37. 37. 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 dentités (nommées ou pas): • OpenNLP (Java), UIMA (Java), Stanbol, etc. 37
  38. 38. 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
  39. 39. Et pourquoi pas du logiciel propriétaire ?• Existence de technologies propriétaires reconnues pour lindexation. • 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 linformation. • Exemples (logiciels libres) : UIMA, Stanbol, Nepomuk, etc. • Existence dalternatives en Python (parfois) et, dans une moindre mesure, en Microsoft .Net (C#, ASPX, etc.).• Existence doutils gratuits (mais non libres). • Exemples : TreeTagger, Sentiwordnet, etc. 39
  40. 40. Exemples pratiques : création demoteurs de recherche spécialisés 40
  41. 41. Exemple 1 : moteur de recherche de podcasts• Objectif : • Sur base dune 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
  42. 42. Outils réutilisés• Lecture RSS : Feedparser (Python).• Indexation : MySQL (fulltext). • Fonctionnement simple (extension du SQL) : • Création de la table avec index : – CREATE TABLE news ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(256), content TEXT, FULLTEXT (title, content) ) • Recherche par mot-clef : – SELECT id, title, content, MATCH (title,content) AGAINST (linux) AS score FROM news WHERE MATCH (title,title) AGAINST (linux) ORDER BY score 42
  43. 43. Résultat• Exemples de résultat de recherche : 43
  44. 44. Exemple 2 : moteur de recherche de flux RSS• Objectif : découvrir, indexer et rechercher des flux RSS. 44
  45. 45. Outils• Indexation 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 de flux RSS. • Principe: sur base dune liste dURL (amorce), • le crawler (multi-thread) ouvre les pages daccueil, • identifie les flux RSS et Atom (et les ajoute à une liste), • extrait les noms de domaine des liens sortants, • et ajoute ces noms de domaine aux URLs à visiter. • But: explorer peu de pages HTML mais trouver un maximum de flux de syndication en un minimum de temps et avec un minimum de bande passante. 45
  46. 46. Résultat• Collecte aisée de plusieurs dizaines de milliers de flux RSS et Atom, en français, anglais, néerlandais et espagnol.• Recherche avancée : par mots-clefs, par pays, par langue, restriction possible aux podcasts. 46
  47. 47. Exemple 3: moteur de recherche dentreprises• Point de départ: données de lannuaire Logiciellibre.com.• Objectif : • A partir dune base de données dadresses dentreprises 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
  48. 48. Outils réutilisés• Crawl: Wget.• Indexation: Zend Search.• Extraction dentités: Boilerplate, OpenNLP.• Visualisation: WUI et DOT. 48
  49. 49. Wget (1/2)• Utilitaire GNU en ligne de commande, compatible Linux ou Cygwin, permettant de récupérer des fichiers en utilisant HTTP, HTTPS et FTP.• Commande de base : • wget www.cetic.be • Stocke localement la page située à ladresse « www.cetic.be ».• Commande pour un crawl : • wget -r -l2 -P www -R jpg,gif,png http://www.cetic.be • Crawl récursif de profondeur 2 pour le site « http://www.cetic.be » et résultats du crawl dans le répertoire « www » (+ rejet des photos). 49
  50. 50. Wget (2/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 dinfos : http://www.gnu.org/software/wget/manual/ .• Alternative : curl (puissant mais... pas de crawl récursif). 50
  51. 51. Lucene (1/2)• Outil dindexation supporté par la fondation Apache (lucene.apache.org).• Ecosystème étendu : • Utilisé dans Alfresco, Jahia, Liferay,... • Extension au cloud (ex. : CouchDB-lucene). • Beaucoup doutils tiers : Luke (lecture dun index), Solr (serveur de recherche ; sans crawler), Nutch (moteur de recherche avec crawler), Carrot2 (interface de recherche compatible OpenSearch et Solr),... • Cf. http://wiki.apache.org/lucene-java/PoweredBy . 51
  52. 52. Lucene (2/2)• Le format dindex est devenu une sorte de standard. • Nombreux portages : Lucene.Net (. Net), PyLucene (Python), CLucene (C++) Plucene (Perl), Zend Search (PHP),... • Différents types de portages : par traduction littérale (compatibilité dAPI dabord), par traduction optimisée pour le langage cible (performances dabord) et par binding (Python). • Points à surveiller : couverture fonctionnelle, version de lindex,... 52
  53. 53. Zend Search (1/4)• Portage de Lucene en PHP. • API spécifique. • Support de la version dindex 2.3 (depuis Zend Framework 1.6). • Support de lUTF-8 en interne. • Intégré au framework Zend mais utilisable séparément (taille sur disque : 734,3 ko). • Taille dindex théorique maximum = 2GB (système 32 bits). • Facilement hébergeable (installable sur un hébergement mutualisé type OVH ou Lost Oasis). 53
  54. 54. Zend Search (2/4)• Plusieurs types de champs supportés : « Keyword », « UnIndexed », « Binary », « Text » et « UnStored ». 54
  55. 55. Zend Search (3/4)• Syntaxe supportée lors des recherches : • Opérateurs booléens (« OR » ou « || », « AND » ou « && », « NOT » ou «  ! », « + », « - »), • indicateur de champs (« title: »), • jokers (« ? » ou « * »), • recherche par intervalle (dates ou chaines), • recherche floue (« ~ »), • recherches de proximité (« ~ »), • facteur de boost (« ^ »).• Possibilité de trier par champs.• Cf. http://framework.zend.com/manual/fr/zend.search.lucene.searching.html et http://framework.zend.com/manual/fr/zend.search.lucene.query-language.html . 55
  56. 56. Zend Search (4/4)• Possibilité de personnaliser lanalyse des documents : • Utilisation dun analyseur par défaut (Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive). • Possibilité de choisir un analyseur (compatible UTF-8, compatible avec les nombres,...). • Possibilité de configurer des filtres (« lowercase », « stop words », « short words »). • Possibilité de créer son propre analyseur. • Cf. http://framework.zend.com/manual/fr/zend.search.lucene.extending.html .• Possibilité de chargement direct de documents : formats HTML, MS Word / Powerpoint / Excel,... 56
  57. 57. Encodage UTF-8 sous PHP (1/2)• PHP 5 (et <5) travaille en ISO-8859-1.• Problème ? • LUTF-8 permet de présenter davantage de jeux de caractères que lISO 8859-1 mais... • LUTF-8 stocke les caractères sur 1 ou plusieurs octets (1 seul en ISO- 8859-1).• Donc ? • LUTF-8 est mieux adapté à lInternet. • La chaîne doutils utilisés (éditeur, langage de script, base de données, navigateur,...) doit connaître lencodage utilisé pour comprendre les chaînes. • Exemple de problème : « Archive — Little I dreamed of being like L©guman ... now I eat carrots ».• Cf. http://openweb.eu.org/articles/jeux_caracteres . 57
  58. 58. Encodage UTF-8 sous PHP (2/2)• 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 à laide des fonctions « utf8_encode() » et « utf8_decode() ». Les autres conversions se font via « iconv ». • La manipulation des chaines en UTF-8 se fait à laide de la bibliothèque « mbstring ».• La détermination de lencodage des caractères en entrée nest pas triviale (headers HTTP parfois erronés, métadonnées HTML parfois absentes ou erronées, outils de détection pas toujours fiables,...). 58
  59. 59. Indexation sous Zend Search (1/2)• Création dun index et insertion : $index = Zend_Search_Lucene::create(/data/my-index); $doc = new Zend_Search_Lucene_Document(); $doc->addField(Zend_Search_Lucene_Field::Text(title, $docTitle)); $doc->addField(Zend_Search_Lucene_Field::UnIndexed(url, $docUrl)); $doc->addField(Zend_Search_Lucene_Field::UnStored(content,$docContent)); $index->addDocument($doc); $index->commit() ;• Optimisation de lindex : $index->optimize(); 59
  60. 60. Indexation sous Zend Search (2/2)• Ouverture dun index et recherche : $index = Zend_Search_Lucene::open(/data/my-index) ; $query = Zend_Search_Lucene_Search_QueryParser::parse($input); $hits = $index->find($query); foreach ($hits as $hit) { echo $hit->score; echo $hit->title; echo $hit->url; }• Paramètres : opérateur par défaut, encodage des données,... 60
  61. 61. Divers• Attention : wget affecte conventionnellement le nom « index.html » à ladresse « / ».• Analyse des documents HTML : • native (cf. « Zend_Search_Lucene_Document_Html »), • manuelle non structurée (extraction des métadonnées -title, description,...- par expressions régulières et nettoyage du <body> via « strip_tags ») ou... • manuelle structurée (extraction structurée par expression régulière ou Xpath).• Lucene ne gère pas les contraintes dintégrité. • Les doublons ne peuvent donc pas être évités via un champ « UNIQUE ». • Or, hash utile sur lURL, voire sur le contenu (duplicate content). • Solutions possibles : test sur un champ unique dans lindex ou test sur base dune table externe (ex. : hash dans SQLite). 61
  62. 62. Mode de fonctionnement (1/3)• Étape 1 : constituer une base de données dURLs (basé sur logiciellibre.com).• É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 lindexation des pages collectées par « wget ».• Utilité : identifier les prestataires actifs sur une ou plusieurs technologies particulières. 62
  63. 63. Mode de fonctionnement (2/3) 63
  64. 64. 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
  65. 65. Les petits plus...• Deux exemples : • Visualisation des relations des entreprises (écosystème). • Création de nuages de tags. 65
  66. 66. Visualisation des relations (écosystème)• Exemple dapplication : • Visualiser les relations entre entreprises,et entre les entreprises et leur environnement (communautés, organismes publics, etc.)• Comment faire ? 66
  67. 67. Processus• Sur base des liens hypertextes entre les sites. • Comptabilisation des relations de page à page. • Utilisation du format DOT pour représenter le graphe de relations. • Utilisation du logiciel en ligne de commande Dot. • Remarque : existence doutils plus évolués: Gephi (gephi.org), Tulip (tulip.labri.fr), etc. 67
  68. 68. Résultat 68
  69. 69. Création dun nuage de tags• Exemple dapplication: • Pour chaque site Internet repris dans lindex: • Avoir une vue des personnes importantes (employés, références, etc.). • Avoir une vue globale de lentreprise (partenaires, technologies, normes, localisations, etc.).• Comment faire ? 69
  70. 70. Processus• Base: copie locale des sites obtenue par wget.• Pour chaque page HTML dun site Web: 1. Extraction du contenu textuel utile avec Boilerplate. 2. Analyse du contenu textuel avec OpenNLP. ● Extraction des noms de personnes. ● Étiquetage grammatical. ● Extraction des noms propres (personnes, entreprises, technologies, normes, etc.). 3. Tri (filtrage : fréquence, « patterns »). 4. Création des nuages de tags. 70
  71. 71. Résultat 71
  72. 72. Principales difficultés• Principalement liées à OpenNLP • Fiabilité globalement correcte mais... • Sensibilité vis-à-vis du texte donné en entrée. – Exemple : <START:person> Andy Gibbs 1 <END> Felipe Contreras 1 Frederik Pasch 1 Heiko Zuerker 1 Javier Viguera <START:person> 1 <END> Luca Ceresoli 1 Marcelo Roberto Jimenez 1 Marcus Osdoba 1 Matt Johnson 1 <START:person> Paul Burton 1 Paul Jones 1 <END> – Importance de la conversion HTML -> texte. • Nombre limité de fichiers dentrainement. – Exemple: étiquetage grammatical (disponible en anglais, néerlandais ou espagnol, mais pas en français). • Le filtrage sur base de la fréquence dapparition limite la présence de tags peu pertinents. 72
  73. 73. Conclusion 73
  74. 74. Conclusion (1/2)• Large variété doutils libres disponibles: • logiciels intégrés, • Composants réutilisables, • bibliothèques de base.• Capacité des outils libres à répondre à des besoins variés mais... • Concepts de base à maîtriser. • Intégration (souvent) moindre comparé à des équivalents propriétaires (ex.: Oracle Text). 74
  75. 75. Conclusion (2/2)• Sujets peu ou prou abordés : • Problématique de passage à léchelle. • Temps des crawls (et leur ciblage). • Temps danalyse des contenus. • Gestion des grands volumes de données (> million de documents). • Technologies Cloud (ex.: bases NoSQL, Hadoop, etc.). • Développement de moteurs de recherche sémantiques. • Cf. Fauconnier et Roumier (2011). 75
  76. 76. Merci!Merci pour votre attention. Des questions ? 76
  77. 77. Ressources et liens utiles• Robert Viseur (2012). « De lannuaire de sites à la recherche sociale: 15 ans dévolution! ». Etudiant Polytech dun jour (UMONS). URL : http://www.robertviseur.be/news-20120225.php .• Robert Viseur (2011). « Développement dun moteur de recherche avec Zend Search ». RMLL 2011. URL : http://www.robertviseur.be/news-20110721.php .• Jean-Philippe Fauconnier et Joseph Roumier (2011). Semantic Search Engine Dedicated to Music & Musicians. Music Linked Data Workshop, 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 - Discovering Knowledge from Hypertext Data ». Morgan Kaufmann. 77
  78. 78. ContactDr Ir Robert Viseur Email (@CETIC) : robert.viseur@cetic.be Email (@UMONS) : robert.viseur@umons.ac.be Téléphone : 0032 (0) 479 66 08 76 Internet : www.robertviseur.be Cette présentation est diffusée sous licence « CC-BY-ND ». 78

×