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 :

Algo de recherche de similarité de texte


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut Algo de recherche de similarité de texte
    Bonjour à tous je voudrais savoir s’il existe un algo ou une technique pour comparer des milliers de documents sans indexer deux documents identique.

    L'application que je développe en ce moment index de énormément de texte, et mon problème est qu'il arrive assez souvent d'indexer deux fois le même texte. Donc je cherche une méthode pour garder une signature de chaque document indexé pour la comparer avec les documents qui entre dans le système et si deux signature sont identique ou fortement similaire je n'index pas le document.

    Merci

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Généralement on utilise un hash comme MD5 pour créer les signatures des documents. En pratique la probabilité que deux documents différents aient la même signature est infime et ainsi il est aisé de vérifier qu'un nouveau document n'est pas déjà dans la base en comparant simplement sa signature à l'ensemble des signatures des documents déjà dans la base. S'il y a concordance, il suffit de comparer les deux documents qui ont la même signature, le coût est ainsi énormément minimisé par rapport à une comparaison avec chaque document déjà dans la base.

    As-tu besoin de plus de détails ? (Tous les langages décents ont des librairies pour calculer le hash MD5 d'un document)

    --
    Jedaï

  3. #3
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Merci Jedai pour ta réponse, mon programme est écrit en C# je vais donc utiliser Security.Cryptography pour générer une signature md5 de chacun des documents.

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 950
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 950
    Points : 5 667
    Points
    5 667
    Par défaut
    Goe,
    Citation Envoyé par Jedai Voir le message
    Généralement on utilise un hash comme MD5 pour créer les signatures des documents. En pratique la probabilité que deux documents différents aient la même signature est infime et ainsi il est aisé de vérifier qu'un nouveau document n'est pas déjà dans la base en comparant simplement sa signature à l'ensemble des signatures des documents déjà dans la base. S'il y a concordance, il suffit de comparer les deux documents qui ont la même signature, le coût est ainsi énormément minimisé par rapport à une comparaison avec chaque document déjà dans la base.

    As-tu besoin de plus de détails ? (Tous les langages décents ont des librairies pour calculer le hash MD5 d'un document)

    --
    Jedaï
    On peut même plutôt calculer les hash de ces 2 documents avec un autre algorithme (crcXX, shaXX...), littéralement aucune chance qu'ils donnent également la même signature.

    Mais il n'est pas sûr que ce soit plus rapide que faire la comparaison directe des documents, le premier test à faire étant de comparer les tailles, qui éliminera au moins une partie des cas à traiter.

  5. #5
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Je pense que la solution de jedai est mieux dans mon cas, je doit indexer des millers voir millions de document (je bosse sur un moteur de recherche d'entreprise). Donc comparer les tailles permet certes d'éliminer une bonne partie des cas à traiter mes ceux restant sont encore trop nombreux . Il me faut une comparaison directe donc l'approche par signature md5 ou autre est meilleur selon moi.

  6. #6
    alex_pi
    Invité(e)
    Par défaut
    Après, il faut bien se rendre compte que la signature MD5 ne convient que pour détecter *rigoureusement* le même texte, à la virgule pres. Si l'un est stocké en HTML et l'autre en texte brut, tu n'as quasiment aucune chance d'extraire du texte brut depuis l'HTML et d'obtenir le même hash. Je pense qu'il doit quand même y avoir des méthodes plus résistantes à de petits changement pour détecter des textes très similaires.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 46
    Points
    46
    Par défaut
    Si tu cherches à êtrte moins rigoureux tu peux utiliser le cosinus entre 2 phrases...

  8. #8
    Membre averti Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Points : 363
    Points
    363
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si tu cherches à êtrte moins rigoureux tu peux utiliser le cosinus entre 2 phrases...
    Qu'est-ce que c'est? ... une blague...

  9. #9
    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 084
    Points
    16 084
    Par défaut
    Citation Envoyé par icer Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si tu cherches à êtrte moins rigoureux tu peux utiliser le cosinus entre 2 phrases...
    Qu'est-ce que c'est? ... une blague...
    Non, meme pas. Ca revient a calculer la cross-correlation entre 2 séries.

  10. #10
    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
    Bonjour,

    Si l'indexation est faite pour un moteur de recherche en texte libre (genre google):
    • on entre, avant indexation, le nouveau document comme question,
    • on regarde, pour les meilleures réponses, le nombre de termes communs,
    • on calcule la proportion relative des termes communs entre ceux de la question et ceux de la réponse
    • quand une des proportions est "grande", c'est qu'un document peut être considéré comme un extrait de l'autre.
    • quand les 2 proportions sont "grandes", c'est que les documents sont semblables.

  11. #11
    Membre chevronné

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Points : 1 954
    Points
    1 954
    Par défaut
    Citation Envoyé par pseudocode Voir le message
    Si tu cherches à êtrte moins rigoureux tu peux utiliser le cosinus entre 2 phrases...
    Non, meme pas. Ca revient a calculer la cross-correlation entre 2 séries.
    C'est la covariance pas le cosinus ou je rate quelque chose ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 38
    Points : 46
    Points
    46
    Par défaut
    Tu rates quelque choses c'est le cosinus et pas la covariance.

  13. #13
    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 084
    Points
    16 084
    Par défaut
    Citation Envoyé par Tommy31 Voir le message
    C'est la covariance pas le cosinus ou je rate quelque chose ?
    Normalized cross-correlation

    Avec énormément d'abus de langage mathématique (), on peut assimiler une suite de valeurs aux coordonnées d'un vecteur:

    suite de 26 valeurs S = {a,b,c,d,...,z} --> Vecteur de dimension 26 V(a,b,c,d,...,z)

    Cross-Correlation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
                          Somme{ (f-mean(f))*(g-mean(g)) }
    Cross(f,g) = ---------------------------------------------------
                 sqrt(Somme{(f-mean(f))²})*sqrt(Somme{(g-mean(g))²})
     
    F=f-mean(f)
    G=g-mean(g)
     
                           Somme{ F*G }       
    Cross(f,g) = -------------------------------
                 sqrt(Somme{})*sqrt(Somme{})
     
                           Somme{ F*G }     
               = ------------------------------
                          ||F|| * ||G||
    Produit scalaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <F.G> = Somme{ F*G } = ||F|| * ||G|| * cos(F,G)
    Remplacement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
                     <F.G>
    Cross(f,g) = -------------
                 ||F|| * ||G||
     
                 ||F|| * ||G|| * cos(F,G)
               = ------------------------ 
                      ||F|| * ||G||
     
               = cos(F,G)

  14. #14
    Membre confirmé
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Points : 568
    Points
    568
    Par défaut
    Merci a tous de votre aide, j'ai finalement décider d'utilise la méthode du cosinus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algo de recherche dans un cube de couleur
    Par mamelouk dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 15/06/2005, 21h38
  2. Algo de recherche de flou
    Par Joeleclems dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 15/03/2005, 10h19
  3. algo de recherche en profondeur
    Par sylsau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/02/2005, 22h59
  4. [VBA] Algo de recherche de doublons
    Par guams dans le forum VBA Access
    Réponses: 6
    Dernier message: 27/07/2004, 17h10
  5. [LG]rechercher dans un fichier texte
    Par BadFox dans le forum Langage
    Réponses: 11
    Dernier message: 01/12/2003, 15h57

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