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

Langage PHP Discussion :

Comparaison de deux textes mot à mot


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut Comparaison de deux textes mot à mot
    Bonjour, j'espère que vous avez passé un bon week-end.

    Voilà je me demandais si quelqu'un ici avait déjà eu à coder une méthode permettant de comparer deux textes en PHP mot à mot. Et ceci sans prendre compte de l'ordre des similarités. C'est assez difficile à expliquer.

    Voici un exemple :
    Phrase 1 : Il est beau le soleil à la page.
    Phrase 2 : Ici, on dit qu'il est beau le soleil.

    En gros je voudrais quelque chose qui remarque ce genre de concordance. Du moment ou minimum un couple de mots est en commun dans les 2 textes quoi...

    J'ai bien une idée d'algo :

    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
    // On découpe les textes en mots
    $parsedfirstText = splitStringBySpaces($firstText);
    $parsedSecondText = splitStringBySpaces($secondText);
     
    // On compare mot à mot les textes
    foreach ($parsedfirstText as $wordOfFirstText) {
        foreach ($parsedSecondText as $wordOfSecondText) {
            // Ici ça se complique...
            // On peut à la limite les comparer
            if($wordOfFirstText == $wordOfSecondText) {
                // Ensuite il faudrait une boucle je pense, un while, tant qu'ils sont égaux, on continue à avancer dans les deux textes et à comparer mot à mot
                // Mais c'est après que je sèche...
            }
        }
    }
    j'ai déjà essayé les fonctions de type levenshtein et similar_text. Elles compare caractère par caractère. Je voudrais comparer du mot à mot.
    Je donne à nouveau des exemples :

    Le soleil brille de mille feux ce soir. Je pense que je vais sortir en bateau de croisière pour en profiter.
    Le bateau de croisière sort ce soir sous ce soleil qui brille de mille feux.

    En gros, je voudrais identifier tous les groupes de mots de plus de deux mots de longueur présent dans les deux textes. Voilà je crois que bien résumé, en une phrase c'est ça l'idée, si je dis pas de bêtises xD Peu importe l'ordre d'apparition dans les texte de ces "groupes".

    Merci, d'avance !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 84
    Par défaut
    Salut,

    Il faut que tu passes par une expression reguliere :

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
    //txt de base
    $subject = "abcdef";
    //ce que tu recherches
    $pattern = '/^def/';
    preg_match($pattern, substr($subject,3), $matches, PREG_OFFSET_CAPTURE);
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
    ?>
    ++
    zwaldo

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut
    Quoi ? Non tu n'as pas compris. Pourtant mon explication est très clair. Je ne connais pas les motifs à rechercher. Je cherche juste à savoir justement les groupes de mots (de minimum 2 mots se suivant) qui sont commun au deux textes.

  4. #4
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Moi je ferai un truc comme ça:
    J'utilise une pattern placée dans un lookahead (test avant) pour obtenir la plus grande correspondance possible au départ de chaque mot, même si le correspondances se chevauchent. Ensuite je filtre les résultats pour ne récupérer que les correspondances les plus grandes (i.e: pour "il fait beau", j'élimine le résultat "fait beau")

    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
    $pattern = '~(?=(\b\w+(?>\W+\w+)+\b).*\b(\1)\b)~ius';
     
    if (preg_match_all($pattern, $texte, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER)) {
     
        $last_match_end_offset = -1;
        $result = array();
     
        foreach($matches as $k => $v) {
            if ( $last_match_end_offset < $match_end_offset = mb_strlen($v[1][0]) + $v[1][1] ) {
                $last_match_end_offset = $match_end_offset;
                $result[] = array('excerpt' => $v[1][0], 'offset1' => $v[1][1], 'offset2' => $v[2][1]);
            }
        }
        unset($matches);
        print_r($result);
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2012
    Messages : 63
    Par défaut
    CosmoKnacki, tout d'abord merci pour ta réponse qui à l'air pas mal recherché, et surtout pour les explications allant avec.
    Mais j'avoue ne pas tout comprendre.
    On parle bien ici de la comparaison de 2 textes n'est ce pas ? Je comprends pas à quel moment tu compares le 1er avec le 2ème. En fait tout simplement je crois que c'est ton pattern qui m'échappe ^^

    EDIT: Après avoir testé ta méthode, c'est bien ça j'avais bien compris finalement. Tu compares le texte avec lui même. Enfin tu compares chaque mot du texte sur le texte quoi. Du coup je vais faire une boucle sur chaque mot du texte 1 et utiliser ta méthode sur le texte 2, ça semble correct, non ? Le seul problème c'est que je ne sais pas comment modifier ton pattern pour faire ça xD Je m'y met ^^

    EDIT 2 : C'est normal également que dès que mon texte est trop long. Ça ne marche plus, ne me retourne plus rien... Oo Ca par contre je sais pas pourquoi, je vais pas pouvoir le gérer seul

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Désolé, effectivement, j'étais partie sur "comparer le texte avec lui même". Ce qui n'est pas adapté pour ce que tu cherches à faire (comparer deux textes différents).

    Cela dit, je ne suis pas étonné qu'au delà d'une certaine longueur de texte ton PC explose. Il faut procéder autrement.

  7. #7
    Membre Expert
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 149
    Par défaut
    Citation Envoyé par 0.GeGe.0 Voir le message
    EDIT 2 : C'est normal également que dès que mon texte est trop long. Ça ne marche plus, ne me retourne plus rien... Oo Ca par contre je sais pas pourquoi, je vais pas pouvoir le gérer seul
    L'affichage des erreurs PHP est-il activé ?
    Vérifies notamment la durée maximum d'exécution d'un script autorisée par ton php.ini (de base 30secondes) et la mémoire RAM maximale allouée au script (de même c'est dans le php.ini).

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

Discussions similaires

  1. [PHP 5.3] Comparaison de deux champs de mot de passe
    Par leweb81 dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2013, 13h44
  2. [WD14] Recherche d'un mot entre deux textes
    Par wojc01 dans le forum WinDev
    Réponses: 6
    Dernier message: 09/11/2009, 19h38
  3. Réponses: 25
    Dernier message: 13/06/2007, 18h09
  4. Comparaison de deux textes
    Par fxparlant dans le forum Langage
    Réponses: 1
    Dernier message: 31/03/2007, 13h54
  5. [HTML] remplissage de ma zone de texte par mot composé?
    Par zorba49 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 07/09/2005, 16h59

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