IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Recherche de plusieurs mots dans un texte : Aho-Corasick VS Karp-Rabin


Sujet :

Algorithmes et structures de données

  1. #1
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut Recherche de plusieurs mots dans un texte : Aho-Corasick VS Karp-Rabin
    Bonjour à tous,

    Je dois implémenter très efficacement (en terme de temps d'exécution) une recherche de plusieurs mots dans un texte (positions des éventuelles occurences de chaque mot dans le texte). D'après mes recherches, deux algos sont intéressants :
    - Aho-Corasick ;
    - Karp-Rabin.

    Quel est le plus efficace des 2, sachant que le nombre de mots à rechercher ainsi que la taille du texte et des mots est très variable ?

    Merci !

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Ah ? Je pensais que l'algo de Boyer-Moore était le meilleur, surtout avec les possibilités de paralléliser l'exécution sur les ordinateurs modernes.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    L'algo de Boyer-Moore est très efficace pour la recherche d'un seul mot dans un texte, mais lorsqu'il faut rechercher plusieurs mots je ne suis pas sûr qu'il soit meilleur que l'algo de Aho-Corasick ou Karp-Rabin.

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par j0o0 Voir le message
    L'algo de Boyer-Moore est très efficace pour la recherche d'un seul mot dans un texte, mais lorsqu'il faut rechercher plusieurs mots je ne suis pas sûr qu'il soit meilleur que l'algo de Aho-Corasick ou Karp-Rabin.
    C'est clair que la complexité dépend du nombre de mots à chercher par rapport à la longueur du texte. Mais bon, étant donné que tu parles de tailles très variables, je pense qu'en moyenne ca doit être tout de même meilleur que les algos suffix-tree.

    Le calcul des tables d'offsets pour les mots est assez rapide à faire, et le parsing du texte pour un mot est en O(taille du texte). Il doit meme y avoir des implémentations optimisées pour faire plusieurs mots à la fois, mais ca doit vite devenir compliquer à gérer. L'algo de base est assez souple pour faire tout un tas d'optimisation simple (parallelisme, travail par fragment, ...)
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Je proposerai une solution basée sur une indexation de N mots recherchés en fonction de leurs 3 première lettre (l1,l2,l3) qui donnent une clé entière de 1 à 256^3.

    Pour avoir la meilleure performance, on crée 2 tableaux d'entiers "Index" et "chainage" de taille 256x256x256+N.
    Index[i] est égal à l'index du premier mot dont la clé est égale à i dans la liste des mots recherchés.
    Chainage[i] pointe sur Index[j] avec j compris entre 256x256x256 et 256x256x256+N afin de chainer tous les mots recherchés ayant la même clé entière.

    Ainsi, pour toute séquence de 3 lettres de début de mot, on est capable de savoir très rapidement s'il existe un mot recherché commençant par ces mêmes lettres et, si oui, obtenir tous les mots recherchés dans ce cas.

    Il ne reste plus qu'à explorer le texte T en construisant à pour chaque position j dans le texte la clé entiere construite à partir de T[j],T[j+1],T[j+2] et en vérifiant si les éventuels mots recherchés associés à cette clé sont effectivement dans le texte.



    Les avantages sont :
    • pas de traitement si aucun mot recherché ne commence par les 3 lettre en position j du texte,
    • vérifier seulement les mots recherchés qui commencent par les mêmes 3 lettres que le texte en poisition j.
    • On peut parralléliser assez facilement en découpant le texte en tronçons et en traitant ces tronçons dans des threads différents (les tableaux index et chainage étant en lecture seule une fois créés au départ à partir des mots recherchés).
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 156
    Points : 76
    Points
    76
    Par défaut
    Merci pour vos réponses (désolé pour le délai) !

    Graffito, je ne comprends pas bien à quoi correspond la taille de 256...Pourquoi 256 ?

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    [0..256] est l'intervalle des caractères ASCII étendus :
    "0" => 0x30, "A" =>0x41, "b"=>0x61, "é"=>0x82

    Ainsi pour le mot "Cabot", la clé sera 0x43616F


    Si on cherche les 3 mots "chat", "cabot" et "cabinet", on aura 2 clés une pour "chat"(C1) et une pour "cabot" et "cabinet" (C2), ainsi que 2 listes de mots L1= { chat } et L2= { cabot, cabinet } avec
    C1 -> L1 et C2->L2.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. Recherche de plusieurs mots dans une chaine
    Par Thib6670 dans le forum C#
    Réponses: 3
    Dernier message: 30/06/2011, 15h19
  2. find + grep recherche de plusieurs mots dans des fichiers différents
    Par sakura.haruno dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 27/04/2010, 22h58
  3. [MySQL] recherche avec plusieurs mots dans mon moteur
    Par hadjiphp dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/05/2009, 08h53
  4. Rechercher/Remplacer un mot dans un texte
    Par epauusa dans le forum Pascal
    Réponses: 1
    Dernier message: 21/05/2009, 17h46
  5. Excel : Recherche d'un mot dans un texte
    Par Two_No dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 24/05/2007, 10h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo