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

Delphi Discussion :

Comparaison de 2 TStringList pour extraire d'un texte les mots vides


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Par défaut Comparaison de 2 TStringList pour extraire d'un texte les mots vides
    Bonjour à tous,

    Toujours dans un soucis de déterminer la langue des pages HTML que je
    récolte je voudrais votre avis sur ma méthode qui consiste à mettre dans 2
    TStringLists :
    - Mes mots vides me permettant de déterminer la langue
    (le, la, les, un, une, etc...pour le FR)
    (the, these, this, that, ... pour le EN)
    etc...Biensur mes listes sont bcp plus longues et comportent aussi certains verbes

    - Ma page texte à analyzer.
    J'ai fait un Split(maPageText, ' ', maStringListResultante)
    De cette maniere j'ai tous les mots dans maStringListResultante


    Ensuite je fais un InterSecStringList(A, B) qui me renvoie un integer
    Mon IntersecList est juste 2 boucles imbriquées (pour l'instant) qui compte
    l'occurrence des mots communs


    Pourrais-je savoir comment vous auriez fait vous car:
    - j'obtiens un résultat sur 500 doc = 370 ok, et le reste KO !
    Pourtant les textes sont faciles à analyser et ont été convertir en texte sans balise.
    - j'utilise des TstringList mais je ne suis pas fixé sur ce choix

    Je suis sûr qu'il doit y avoir moulte façon de faire mais j'aimerai avoir vos avis !
    De plus le nombre de mots vides ou de ma page n'a-t-il pas une influence sur le résultat ?

    Pour l'instant j'incrémente un entier à chaque fois que je rencontre un mot
    vide mais jamais je ne tiens compte de la longueur des 2 fichiers (mots vides
    et mon texte)


    Merci pour vos conseils et algo à l'occaz :o)

    Amicalement,
    Bruno

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Si le seul objectif est de déterminer la langue de pages de texte de diverses laangues j'opterais pour le scénario suivant :
    - pour chaque langue : une stringList-de-mots-identificateurs-de-langue(ceux que tu appelles mots-vides) :
    slFR avec 'le','la','les',...,etc.
    slEN avec 'the','these','this', ... etc.
    slGE avec 'der','die','das', ... etc. ... et ces StringList je les classerais dans l'ordre alpha.

    - et une StringListTexteAAusculter;
    - et une StringListMotsDuTexteAAusculter alimentée à partir de la précédente avec des LowerCase(mot-extrait-de-chaque-ligne-texte) ... et cette dernière StringList étant alimentée mot par mot je la classerais également dans l'ordre alpha avec tout bêtement les déclarations préalables des propriétés
    StringListMotsDuTexteAAusculter.Sorted:=True; et StringListMotsDuTexteAAusculter.Duplicates:=DupIgnore de sorte que le Add n'y ajoute aucun doublon ce qui va aussi raccourcir la longueur de cette liste ce qui est utile pour la suite.

    Ensuite dans une boucle de recherche avec IndexOf(string) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
              Francais:=0;  Anglais:= 0; Allemand:=0; Mixte:=0; etc.
              i:=-1;
              Repeat inc(i);
                        motDuTexte := StringListMotsDuTexteAAusculter[i]  
                        if ( slFR.IndexOf( motDuTexte )>=0 ) then  inc(Francais) else
                        if ( slEN.IndexOf( motDuTexte )>=0 ) then  inc(Anglais)   else
                        if ( slGE.IndexOf( motDuTexte )>=0 ) then  inc(Allemand);
              Until (i = StringListMotsDuTexteAAusculter.count-1)
                     or (Francais=10) or (Anglais=10) or (Allemand=10); //< il faudrait avec des tests voir s'il faut augmenter ou réduire ce 10.
             If (Francais>0) and (Anglais>0) 
             or (Francais>0) and (Allemand>0) 
             or (Anglais>0)   and (Allemand>0) then inc(Mixte);
    Avec Sorted = True et la suppression préalable des doublons la rapidité des recherches d'identification est optimale.

    De plus le nombre de mots vides ou de ma page n'a-t-il pas une influence sur le résultat ?
    ... ben si forcément, car si les listes des mots vides ne contenaient que quelques mots non utilisés dans le texte à ausculter la langue utilisée ne serait pas identifiable mais avec des mots du style "le", "la", "les" tu peux être tranquille c'est comme si tu voulais compter les "begin" dans un code-Delphi.

    jamais je ne tiens compte de la longueur des 2 fichiers (mots vides
    et mon texte)
    ... rassure toi avec la boucle et le if ( slFR.IndexOf( motDuTexte )>=0 ) ) qui cherche jusqu'à la fin de la liste des mots vides c'est réglé ... si t'as la moindre inquiétude tu peux aussi quitter la boucle uniquement avec Until (i = StringListMotsDuTexteAAusculter.count-1) car le "or (Francais=10) or (Anglais=10) or (Allemand=10)" c'est juste pour augmenter la vitesse d'exécution.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Par défaut
    Bonjour Gilbert,

    Tout d'abord merci pour tous ces renseignements mais j'ai une petite contrainte supplémentaire c'est que je veux que mon programme soit modulaire. C'est à dire que l'utilisateur puisse ajouter des fichiers de mots vides d'autres langues. De cette manière en nommant par exemple deutch.stw (stw = stopwords) j'aurais simplement ajouté une nouvelle langue.

    Cela dit je peux trés bien m'aider de ce que tu me proposes, mais si quelqu'un vois une autre idée, même sans StringList je suis preneur.

    Amicalement,
    Bruno

  4. #4
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    Salut Bruno,

    "je veux que ... l'utilisateur puisse ajouter des fichiers de mots vides d'autres langues. De cette manière en nommant par exemple deutch.stw (stw = stopwords) j'aurais simplement ajouté une nouvelle langue" :

    Cela change la donne initiale. Mais si le nombre de listes-de-mots-vides est variable il faut carrément remplacer les déclarations de variables slFR (avec 'le','la','les',...,etc) slEN (avec 'the','these','this', ... etc.) et slGE (avec 'der','die','das', ... etc.) par une variable globale par exemple du type array of tStringList c.à.d un tableau dynamique que lon charge au lancement du logiciel avec les fichiers nommés langueX.stw qui sont présents sur le disque ( je suppose que tu livres au début au moins deux à trois langues pour amorcer la pompe et l'utilisateur les enrichit ensuite avec n'importe quel dialecte) :

    var ListesDeMotsVides : array of tStringList; //< tableau dynamique
    et var LangueDetectee : array of integer; ; //< idem

    ... dans un premier temps on remplit par exemple une listBoxNomsFichiersSTW avec les noms des fichiers dont l'extension est .stw (si tu veux une routine pour ça dis-le).

    ... ensuite on dimensionne le tableau dynamique avec setLength(ListesDeMotsVides, listBoxNomsFichiersSTW.count) et idem pour le deuxième tableau : setLength(LangueDetectee, listBoxNomsFichiersSTW.count)

    ... ensuite on charge les fichiers : for j:=0 to listBoxNomsFichiersSTW.count-1 do ListesDeMotsVides[j].loadFromFile(listBoxNomsFichiersSTW.Items[j];
    A ce stade on sait que la liste ListesDeMotsVides[j] est par exemple l'anglais si le nom du fichier correspondant de même indice dans la ListBoxNomsFichiersSTW[j] est par exemple anglais.stw et dans ce cas il faut modifier le code de l'autre jour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( slFR.IndexOf( motDuTexte )>=0 ) then  inc(Francais) else
                        if ( slEN.IndexOf( motDuTexte )>=0 ) then  inc(Anglais)   else
                        if ( slGE.IndexOf( motDuTexte )>=0 ) then  inc(Allemand);
    par nouveau code de recherche :
    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
              for j:=0 to High(LangueDetectee) do LangueDetectee[j]:=0; 
              i:=-1; stop:=false; // boolean, i, et j à déclarer au préalable
              Repeat inc(i);
                        motDuTexte := StringListMotsDuTexteAAusculter[i];
                        for j:=0 to High(ListesDeMotsVides) 
                        do if ListesDeMotsVides[j].IndexOf( motDuTexte )>=0 
                            then inc(LangueDetectee[j]);
    
                        for j:=0 to High(LangueDetectee) 
                        do if LangueDetectee[j]>10 then //< il faudrait avec des tests voir s'il faut augmenter ou réduire ce 10.
                            begin showMessage('Langue détectée = ' + listBoxNomsFichiersSTW.Items[j];
                                    Stop:=true;
                            end;                    
              Until (i = StringListMotsDuTexteAAusculter.count-1) or Stop;
    ... Ensuite pour permettre à l'utilisateur d'ajouter des fichiers de mots vides d'autres langues le plus simple est de lui prévoir un bouton "CréerListeMotsVidesAutreLangue" où un click ouvre :
    - d'abord un inputBox où l'on récupère le nom de la langue : NomDeLaLangue:= InputBox('Créer une liste de mots vides ', Donner le nom de la langue, ''); ... (on ajoutera par la suite à ce nom l'extesion .stw pour la sauvegarde sur disque)
    - et ensuite un Memo1 dans lequel il pourra taper et naviguer dans sa liste-de-mots-vides
    - plus un bouton "Sauver sur disque" qui déclenche un memo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName)+NomDeLaLangue+'.stw');

    Voiçi donc pour ce qui est du scénario pour coder ... tu peux remarquer que la partie "permettre à l'utilisateur d'ajouter des fichiers de mots vides d'autres langues" est relativement simple vu que toute la partie du début du présent message n'est que la modification du code de l'autre jour.

    Si ce scénario te convient on pourra passer aux fignolages un autre jour.

    A+
    P.S du 12 juin : Remplacé l'indice "k" qui est évidemment "j" en orange dans le code.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Par défaut
    Comment dire,

    UN GRAND MERCI !!!

    Je vais coder tout cela à partir de maintenant et revenir sur le forum pour donner les résultats dans ce message. Je cliquerai ensuite sur le bouton RESOLU grâce à toi !

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Par défaut
    A Bruno :

    Y'aura quelques fignolages a apporter par la suite pour faire un truc clean. Exemples :
    - pour l'instant le showMessage renvoie comme langue détectée le nom complet du fichier dans le style c:\MonRepertoire\Anglais.stw on pourra en extraire Anglais tout court,
    - ajouter une fonction "ModifierTelFichierDeMotsVides" pour rallonger ou raccourcir un fichier (c'est peut-être pas utile que ces fichiers soient trop longs) car plus ces fichiers sont longs et nombreux plus les temps d'exécution vont augmenter.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2015, 15h12
  2. Y-a-t-il plus rapide pour enlever les mots vides ?
    Par Bruno13 dans le forum Delphi
    Réponses: 33
    Dernier message: 26/07/2007, 18h03
  3. Script pour extraire la meteo depuis un serveur XML.Probleme
    Par Zarma67 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/02/2006, 12h13
  4. Utiliser un parser pour extraire des formules
    Par EpOnYmE187 dans le forum C++
    Réponses: 2
    Dernier message: 16/03/2005, 00h55
  5. [Comparaison] Jbuilder ou Eclipse pour Swing ?
    Par phpe dans le forum Eclipse
    Réponses: 12
    Dernier message: 04/10/2004, 10h33

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