La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

1 Search::Indexer Indexation plein-texte en Perl

Présentations similaires


Présentation au sujet: "1 Search::Indexer Indexation plein-texte en Perl"— Transcription de la présentation:

1 1 Search::Indexer Indexation plein-texte en Perl laurent.dami@justice.ge.ch

2 LD, PJGE, juin 20052 Indexation plein-texte veaux vaches cochons couvée 1, 2, 5, 77, 78, 79, 123 3, 7, 34, 56 1, 2, 3, 4, 19 4, 5, 6, 7, 55, 56 1234512345 TermesListes inversesDocuments (veaux ET vaches) OU cochons

3 LD, PJGE, juin 20053 Information positionnelle veaux vaches 1, 2, 5, 77, 78, 79, 123 3, 7, 34, 56 1234512345 TermesListes inversesDocuments « adieu, veaux, vaches »veaux NEAR vaches 6, 134, 555 58, 99, 107, 111 Positions des mots

4 LD, PJGE, juin 20054 Quelques logiciels MS Longhorn MacIntosh Google Desktop Copernic COVEO Fulcrum Livelink HtDig Google Appliance Altavista Desktop Entreprise Web Boîte à outils Lucene MySQL dtSearch Swish-E Search::Indexer

5 LD, PJGE, juin 20055 Boîte à outils u Moteur général d’indexation Adaptable pour applications ad hoc u À fournir par composants externes : Spider (injection des documents à indexer) Conversions de formats (.doc,.html, etc. .txt) Couche de présentation des résultats

6 LD, PJGE, juin 20056 Autres modules Perl u Text::Freesearch Compact, fonctions de base u Search::InvertedIndex Pas d'information sur positions u Plucene Très complet > 60 classes (+ dépendances) problèmes de lenteur u Search::Kinosearch alpha, chargé sur CPAN le 8 juin 2005

7 7 Search::Indexer

8 LD, PJGE, juin 20058 Structure u Analyseur regex + callback u Stockage index: 3 fichiers BerkeleyDB Listes d’entiers compressés (pack ‘w’) u Requêtes booléennes: Search::QueryParser

9 LD, PJGE, juin 20059 API use Search::Indexer; my $ix = new Search::Indexer( dir => $dir, writeMode => 1, wregex => qr/\w+/, wfilter => sub {...}); $ix->add($docId, docContent($docId)); $ix->remove($docId);

10 LD, PJGE, juin 200510 API (suite) $r = $ix->search('+veaux –vaches'); $r = $ix->search('chat ET (rat OU souris)'); $r = $ix->search(' "phrase exacte" '); @docIds = keys @{$r->{scores}}; foreach my $docId (@docIds) { my $score = $r->{scores}{$docId}; print "DOC $docId: $score\n"; }

11 LD, PJGE, juin 200511 API (suite) foreach my $docId (@docIds) { my @ex = $ix->excerpts(docContent($docId), $r->{regex}); print join(" / ", @ex), "\n"; } Extraits :...devenu entre-temps la direction du logement (ci- après : la DL), a maintenu l’allocation de logement pour la période du 1er avril 2003... /... A/1772/2004 TA/S2.THE (TPE) ALLOCATION DE LOGEMENT; LOCATAIRE; PRINCIPE DE LA BONNE F... /... la DL de verser rétroactivement l'allocation de logement. Demande incomplète (art. 25 al 1... /...ge non compris. Ils perçoivent une allocation de logement mensuelle de CHF 400.- depuis le 1...

12 LD, PJGE, juin 200512 Implémentation : new() # word => wordId $self->{ixwDb} = tie %{$self->{ixw}}, 'BerkeleyDB::Btree',... # wordId => [docId1 => nOccur1,...] $self->{ixdDb} = tie %{$self->{ixd}}, 'BerkeleyDB::Hash',... # (docId, wordId) => [pos1, pos2,...] $self->{ixpDb} = tie %{$self->{ixp}}, 'BerkeleyDB::Btree',..

13 LD, PJGE, juin 200513 Implémentation : add() my %positions; for (my $nwords=1; $buf =~ /$self->{wregex}/g; $nwords++) { my $word = $self->{wfilter}->($&) or next; my $wordId = $self->{ixw}{$word}; push @{$positions{$wordId}}, $nwords; } while (my ($wd, $p) = each %positions) { $self->{ixd}{$wd}.= pack('wC', $docId, scalar(@$p)); $self->{ixp}{$docId, $wd} = pack('w*', @$p); }

14 LD, PJGE, juin 200514 Implémentation : search() $scores = {unpack '(wC)*', $self->{ixd}{$wd}}; my @k = keys %$scores; my $nDocs = $self->{ixd}{NDOCS}; if (@k) { my $coeff = log($nDocs + 1)/@k) * 100; $scores->{$_} = int($coeff * $scores->{$_}) foreach @k; } # AND, OR : union/intersection de %$scores

15 LD, PJGE, juin 200515 Métriques u Search::Indexer 819 lignes (dont 222 POD) 5 méthodes 10 options pour new() u Search::QueryParser 480 lignes (dont 228 POD) 4 méthodes 7 options pour new() u env. 3,5 fois plus rapide que Plucene

16 LD, PJGE, juin 200516 TODO liste u verrous, concurrence u calcul des combinaisons de scores u comparaisons de performances u opérateurs NEAR et ^n (boost) u format des index (compression)

17 17 Démo...


Télécharger ppt "1 Search::Indexer Indexation plein-texte en Perl"

Présentations similaires


Annonces Google