78
[ Jeudis du Libre, Mons – Mercredi 16 mai 2012 ] Créer un moteur de recherche avec des logiciels libres Auteur : Dr Ir Robert Viseur

Créer un moteur de recherche avec des logiciels libres

Embed Size (px)

DESCRIPTION

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.

Citation preview

Page 1: Créer un moteur de recherche avec des logiciels libres

[ Jeudis du Libre, Mons – Mercredi 16 mai 2012 ]

Créer un moteur de recherche avec des logiciels libresAuteur : Dr Ir Robert Viseur

Page 2: Créer un moteur de recherche avec des logiciels libres

2

Qui suis-je ?

• 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).

Page 3: Créer un moteur de recherche avec des logiciels libres

3

Qu'est-ce que le CETIC ?

• Centre d'Excellence en Technologies de l'Information 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.

Page 4: Créer un moteur de recherche avec des logiciels libres

4

De quoi allons-nous parler ?

• Sujet : comment créer un moteur de recherche à base de logiciels libres ?

• 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.

Page 5: Créer un moteur de recherche avec des logiciels libres

5

Qu'est-ce qu'un moteur de recherche ?

Page 6: Créer un moteur de recherche avec des logiciels libres

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).

Page 7: Créer un moteur de recherche avec des logiciels libres

7

É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.

Page 8: Créer un moteur de recherche avec des logiciels libres

8

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é)!

Page 9: Créer un moteur de recherche avec des logiciels libres

9

Extraire (1/5)

• L'indexation se fait sur du texte brut (texte ou métadonnées).

• Besoin d'extraire...• 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).

Page 10: Créer un moteur de recherche avec des logiciels libres

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.

Page 11: Créer un moteur de recherche avec des logiciels libres

11

Extraire (3/5)

• Complexité variable (suite).• Besoin d'analyseurs 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.

Page 12: Créer un moteur de recherche avec des logiciels libres

12

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 autres ressources « zippées ».

• Plus difficile si formats non documentés.

Page 13: Créer un moteur de recherche avec des logiciels libres

13

Extraire (5/5)

• Complexité variable (suite).• Beaucoup plus difficile pour les documents scannés

(OCR).

(...)

Page 14: Créer un moteur de recherche avec des logiciels libres

14

Enrichir (1/3)

• Il est possible d'aller plus loin que la simple extraction des métadonnées et du texte.

• Pour les documents HTML:• Compréhension des microformats.

• Exemple: hCard / vCard.

Page 15: Créer un moteur de recherche avec des logiciels libres

15

Enrichir (2/3)

• Pour les documents HTML (suite):• Rétroingénierie (extraction structurée -> redonner du sens

aux informations formatées en HTML).

Page 16: Créer un moteur de recherche avec des logiciels libres

16

Enrichir (3/3)

• Pour les contenus textuels: • Extraction d'entités nommées.

• Exemple : reconnaître des noms de personnes, d'organisations, 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.

Page 17: Créer un moteur de recherche avec des logiciels libres

17

Analyser (1/2)

• Généralement, cette tâche est réalisée par l'indexeur 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.

Page 18: Créer un moteur de recherche avec des logiciels libres

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.

Page 19: Créer un moteur de recherche avec des logiciels libres

19

Indexer (1/3)

• Création d'un index inversé.• Typiquement: structure mettant en correspondance

des mots avec un ensemble de documents.• La recherche d'un ou plusieurs mots permet de

facilement retrouver les documents le ou les contenant.

Page 20: Créer un moteur de recherche avec des logiciels libres

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>

Page 21: Créer un moteur de recherche avec des logiciels libres

21

Indexer (3/3)

• Modèle de pertinence intégré. • Un classique: modèle TFxIDF.

• La fréquence d'apparition 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.

Page 22: Créer un moteur de recherche avec des logiciels libres

22

Rechercher (1/2)

• Proposer une interface d'interrogation du moteur.• Pour humains (Web User Interface, WUI).• Pour logiciel (Application Programming Interface,

API).

• Raffinements possibles : catégorisation, clustering, facétisation, etc.

Page 23: Créer un moteur de recherche avec des logiciels libres

23

Rechercher (2/2)

• Remarque: Les moteurs de recherche commerciaux proposent une API (Google, Bing, etc.).• Passage progressif au modèle payant.• Conditions d'utilisation parfois restrictives.• Problèmes de fiabilité (cf. webométrie).• Mais utilité:

• pour initier des crawls,• pour disposer de listes d'URLs ciblées (analyse en

profondeur), • pour compléter des résultats de recherche (composition).

Page 24: Créer un moteur de recherche avec des logiciels libres

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.

Page 25: Créer un moteur de recherche avec des logiciels libres

25

Faut-il utiliser une base de données « fulltext » ou un pur indexeur ?

Page 26: Créer un moteur de recherche avec des logiciels libres

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 d'intégrité.• Language d'interrogation standardisé proche du

language humain (SQL).• Large disponibilité d'outils de création.• Par défaut, pas de fonctionnalité « fulltext ».

Page 27: Créer un moteur de recherche avec des logiciels libres

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).

Page 28: Créer un moteur de recherche avec des logiciels libres

28

Base de données « fulltext »

• Mêmes caractéristiques que pour la base de données simple, mais...• Création automatique d'un index inversé.• Performances variables:

• volume de données supporté (nombre d'enregistrements, longueur du texte),

• finesse d'analyse du texte (lemmatisation ou non, personnalisation de l'analyse ou non, etc.),

• richesse variable du langage d'interrogation,• support variable des langues (si lemmatisation).

• Le langage d'interrogation de l'index « fulltext » varie d'un SGBG à un autre.

Page 29: Créer un moteur de recherche avec des logiciels libres

29

Pur indexeur

• Outil dédié uniquement à la recherche fulltext.• Plus de structure tabulaire, de contraintes

d'intégrité, ni de language d'interrogation 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 d'interrogation riche,• notion de champs (sans contrainte).

Page 30: Créer un moteur de recherche avec des logiciels libres

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.

Page 31: Créer un moteur de recherche avec des logiciels libres

31

Jusqu'où est-il utile de développer soi-même ?

Page 32: Créer un moteur de recherche avec des logiciels libres

32

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 un avantage fonctionnel peut être trouvé.

• Développement sur base de composants libres.• A privilégier si pas d'outil intégré disponible.

• Suite : présentation non exhaustive de logiciels libres disponibles.

Page 33: Créer un moteur de recherche avec des logiciels libres

33

Existence d'outils intégrés (1/2)

• Serveur d'indexation: 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).

Page 34: Créer un moteur de recherche avec des logiciels libres

34

Existence d'outils 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).

Page 35: Créer un moteur de recherche avec des logiciels libres

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 d'URLs, analyse de textes, analyse HTML, etc.

• Attention au syndrome NIH...

Page 36: Créer un moteur de recherche avec des logiciels libres

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 d'articles (contenu utile) : • Boilerpipe (Java).

• OCR: • GOCR, OCRAD, Tesseract, etc.

Page 37: Créer un moteur de recherche avec des logiciels libres

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 d'entités (nommées ou pas): • OpenNLP (Java), UIMA (Java), Stanbol, etc.

Page 38: Créer un moteur de recherche avec des logiciels libres

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.

Page 39: Créer un moteur de recherche avec des logiciels libres

39

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.).

• Existence d'outils gratuits (mais non libres).

• Exemples : TreeTagger, Sentiwordnet, etc.

Page 40: Créer un moteur de recherche avec des logiciels libres

40

Exemples pratiques : création de moteurs de recherche spécialisés

Page 41: Créer un moteur de recherche avec des logiciels libres

41

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.

Page 42: Créer un moteur de recherche avec des logiciels libres

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

Page 43: Créer un moteur de recherche avec des logiciels libres

43

Résultat

• Exemples de résultat de recherche :

Page 44: Créer un moteur de recherche avec des logiciels libres

44

Exemple 2 : moteur de recherche de flux RSS

• Objectif : découvrir, indexer et rechercher des flux RSS.

Page 45: Créer un moteur de recherche avec des logiciels libres

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 d'une liste d'URL (amorce),

• le crawler (multi-thread) ouvre les pages d'accueil,

• 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.

Page 46: Créer un moteur de recherche avec des logiciels libres

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.

Page 47: Créer un moteur de recherche avec des logiciels libres

47

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.

Page 48: Créer un moteur de recherche avec des logiciels libres

48

Outils réutilisés

• Crawl: Wget.• Indexation: Zend Search.• Extraction d'entités: Boilerplate, OpenNLP.• Visualisation: WUI et DOT.

Page 49: Créer un moteur de recherche avec des logiciels libres

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 à l'adresse « 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).

Page 50: Créer un moteur de recherche avec des logiciels libres

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 d'infos : http://www.gnu.org/software/wget/manual/ .

• Alternative : curl (puissant mais... pas de crawl récursif).

Page 51: Créer un moteur de recherche avec des logiciels libres

51

Lucene (1/2)

• Outil d'indexation 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'un 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 .

Page 52: Créer un moteur de recherche avec des logiciels libres

52

Lucene (2/2)

• Le format d'index 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é d'API d'abord), par traduction optimisée pour le langage cible (performances d'abord) et par binding (Python).

• Points à surveiller : couverture fonctionnelle, version de l'index,...

Page 53: Créer un moteur de recherche avec des logiciels libres

53

Zend Search (1/4)

• Portage de Lucene en PHP.• API spécifique. • Support de la version d'index 2.3 (depuis Zend

Framework 1.6).• Support de l'UTF-8 en interne.• Intégré au framework Zend mais utilisable

séparément (taille sur disque : 734,3 ko).• Taille d'index théorique maximum = 2GB (système 32

bits).• Facilement hébergeable (installable sur un

hébergement mutualisé type OVH ou Lost Oasis).

Page 54: Créer un moteur de recherche avec des logiciels libres

54

Zend Search (2/4)

• Plusieurs types de champs supportés : « Keyword », « UnIndexed », « Binary », « Text » et « UnStored ».

Page 55: Créer un moteur de recherche avec des logiciels libres

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 .

Page 56: Créer un moteur de recherche avec des logiciels libres

56

Zend Search (4/4)

• Possibilité de personnaliser l'analyse des documents :• Utilisation d'un 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,...

Page 57: Créer un moteur de recherche avec des logiciels libres

57

Encodage UTF-8 sous PHP (1/2)

• PHP 5 (et <5) travaille en ISO-8859-1.

• Problème ?

• L'UTF-8 permet de présenter davantage de jeux de caractères que l'ISO 8859-1 mais...

• L'UTF-8 stocke les caractères sur 1 ou plusieurs octets (1 seul en ISO-8859-1).

• Donc ?

• L'UTF-8 est mieux adapté à l'Internet.

• La chaîne d'outils utilisés (éditeur, langage de script, base de données, navigateur,...) doit connaître l'encodage 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 .

Page 58: Créer un moteur de recherche avec des logiciels libres

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 à 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,...).

Page 59: Créer un moteur de recherche avec des logiciels libres

59

Indexation sous Zend Search (1/2)

• Création d'un 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 l'index :

$index->optimize();

Page 60: Créer un moteur de recherche avec des logiciels libres

60

Indexation sous Zend Search (2/2)

• Ouverture d'un 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,...

Page 61: Créer un moteur de recherche avec des logiciels libres

61

Divers

• Attention : wget affecte conventionnellement le nom « index.html » à l'adresse « / ».

• 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 d'intégrité.

• Les doublons ne peuvent donc pas être évités via un champ « UNIQUE ».

• Or, hash utile sur l'URL, voire sur le contenu (duplicate content).

• Solutions possibles : test sur un champ unique dans l'index ou test sur base d'une table externe (ex. : hash dans SQLite).

Page 62: Créer un moteur de recherche avec des logiciels libres

62

Mode de fonctionnement (1/3)

• Étape 1 : constituer une base de données d'URLs (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 l'indexation des pages collectées par « wget ».

• Utilité : identifier les prestataires actifs sur une ou plusieurs technologies particulières.

Page 63: Créer un moteur de recherche avec des logiciels libres

63

Mode de fonctionnement (2/3)

Page 64: Créer un moteur de recherche avec des logiciels libres

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'.

Page 65: Créer un moteur de recherche avec des logiciels libres

65

Les petits plus...

• Deux exemples :• Visualisation des relations des entreprises

(écosystème).• Création de nuages de tags.

Page 66: Créer un moteur de recherche avec des logiciels libres

66

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 ?

Page 67: Créer un moteur de recherche avec des logiciels libres

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 d'outils plus évolués: Gephi

(gephi.org), Tulip (tulip.labri.fr), etc.

Page 68: Créer un moteur de recherche avec des logiciels libres

68

Résultat

Page 69: Créer un moteur de recherche avec des logiciels libres

69

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 ?

Page 70: Créer un moteur de recherche avec des logiciels libres

70

Processus

• Base: copie locale des sites obtenue par wget.• Pour chaque page HTML d'un 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.

Page 71: Créer un moteur de recherche avec des logiciels libres

71

Résultat

Page 72: Créer un moteur de recherche avec des logiciels libres

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 d'entrainement.– Exemple: étiquetage grammatical (disponible en anglais, néerlandais ou

espagnol, mais pas en français).

• Le filtrage sur base de la fréquence d'apparition limite la présence de tags peu pertinents.

Page 73: Créer un moteur de recherche avec des logiciels libres

73

Conclusion

Page 74: Créer un moteur de recherche avec des logiciels libres

74

Conclusion (1/2)

• Large variété d'outils 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).

Page 75: Créer un moteur de recherche avec des logiciels libres

75

Conclusion (2/2)

• Sujets peu ou prou abordés :• Problématique de passage à l'échelle.

• Temps des crawls (et leur ciblage).• Temps d'analyse 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).

Page 76: Créer un moteur de recherche avec des logiciels libres

76

Merci!

Merci pour votre attention.

Des questions ?

Page 77: Créer un moteur de recherche avec des logiciels libres

77

Ressources et liens utiles

• Robert Viseur (2012). « De l'annuaire de sites à la recherche sociale: 15 ans d'évolution! ». Etudiant Polytech d'un jour (UMONS). URL : http://www.robertviseur.be/news-20120225.php .

• Robert Viseur (2011). « Développement d'un 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.

Page 78: Créer un moteur de recherche avec des logiciels libres

78

Contact

Dr Ir Robert Viseur

Email (@CETIC) : [email protected] Email (@UMONS) : [email protected]

Téléphone : 0032 (0) 479 66 08 76 Internet : www.robertviseur.be

Cette présentation est diffusée sous licence « CC-BY-ND ».