Recherche de mots dans texte explications

Messages postés
68
Date d'inscription
jeudi 11 décembre 2008
Statut
Membre
Dernière intervention
16 juin 2019
- - Dernière réponse : cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
- 28 nov. 2015 à 10:58
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/101204-recherche-de-mots-dans-texte-explications

cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
-
4/5 bien que le tour de force mériterait 5/5 (moins un point à cause de la tristesse des applications console : retour à l'époque du DOS)

A+
piette
Messages postés
68
Date d'inscription
jeudi 11 décembre 2008
Statut
Membre
Dernière intervention
16 juin 2019
> cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
-
Bonsoir,
Je n'ai rien compris à votre proposition parce qu'il n'y a pas de titre!
Un de mes exemples repond à ce que vous recherchez?
Mais dans un temps > à un clignotement d'œil.
Le DOS, quelle époque joyeuse il était possible de s'interrompre tous les
21h.

Salutations
cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
> piette
Messages postés
68
Date d'inscription
jeudi 11 décembre 2008
Statut
Membre
Dernière intervention
16 juin 2019
-
Bonjour,

>> "Je n'ai rien compris à votre proposition parce qu'il n'y a pas de titre! "
En fait la proposition de mon paragraphe 2 qui concerne la "recherche indexée" consiste tout simplement à extraire d'un ensemble volumineux de textes le sous-ensemble du vocabulaire présent dans tous ces textes et de lier chacun des mots de ce vocabulaire à la liste des indices des positions où ce mot est présent dans un ou plusieurs de ces textes. Même dans le cas de textes volumineux, s'ils sont rédigés dans la même langue le sous-ensemble du vocabulaire utilisé étant forcément beaucoup moins volumineux que l'ensemble des textes ... et pour retrouver la position du Mot = "MonTruc" dans tous les textes il suffit de la chercher dans le sous-ensemble au lieu de parcourir inlassablement l'ensemble volumineux des textes.

En bref, pour ma part j'ai utilisé :
- pour le vocabulaire : SLVoc := TStringList.Create : triée et avec DupIgnore,
- pour chaque liste de positions : SLPos := TStringList.Create,
- puis SLVoc .AddObject('MonMot', SLPos);
- ensuite en accédant à l'objet SLPos on l'alimente avec les positions de 'MonMot' dans les textes de la collection : SLPos.Add(intToStr(IndiceFichier) + ':'+intToStr(IndicePositionMot)),
- et ensuite pour retrouver les positions de 'MonMot' je n'ai plus qu'à parcourir ma StringList au lieu de ramer dans la collection de textes.

Les gains de vitesse sont intéressants lorsque on effectue très fréquemment des recherches dans le même ensemble de textes comme dans l'exemple des recettes de cuisine de ma sœur car une fois que cette StringList est créée il ne reste plus qu'à gérer les modifications : ajout, suppression, retouche d'une recette ce qui s'exécute encore plus vite que la création et l'alimentation d'initialisation de la StringList.

>> "Un de mes exemples répond à ce que vous recherchez? " :
Non, vu que j'ai déjà créé mon application.
J'avais simplement évoqué la recherche indexée ayant cru que vous êtes passionné par le sujet des recherches et vous suggérer une idée vu qu'avec Delphi on peut obtenir le même résultat avec "36" codes tous différents.
(exemple au lieu d'utiliser une StringList on peut obtenir les mêmes résultats avec une ObjectList, et j'en oublie les autres solutions).

>> "Le DOS, quelle époque joyeuse il était possible de s'interrompre tous les 21h"
Ou bien d'y passer sa nuit, en essayant de s'en sortir avec la lenteur et 64 Ko de mémoire vive !!!

Cordialement, et à +.
cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
-
4/5 bien que le tour de force mériterait 5/5 (moins un point à cause de la tristesse des applications console : retour à l'époque du DOS)
cs_pseudo3
Messages postés
270
Date d'inscription
mardi 24 juillet 2007
Statut
Membre
Dernière intervention
7 juin 2018
-
Re-salut,

OK avec Fabrique_Sauts ça marche à merveille donc mieux qu'avec Fab_Sauts(var BM: TreBMH2C) qui était utilisée par ChercheDans.

Gain de vitesse appréciable notamment dans le cas de recherche d'un bout de phrase relativement long :

Résultats comparatifs pour la recherche de "Il marchait toujours, rêvassant, battant de sa canne de cornouiller les cailloux de la route" dans le texte ZOla1Mo.txt :

- Avec BMH2E : Trouvé : 10000 fois, Mis : 468 ms pour nb-Recherches = 5000 (Sans conversion MNA) (Sans pré-calibrage)
- Avec BMHPascalNaif : Trouvé : 10000 fois, Mis : 1389 ms pour nb-Recherches = 5000 (Sans conversion MNA) (Sans pré-calibrage)
- Avec PosEx : Trouvé : 10000 fois, Mis : 6490 ms pour nb-Recherches = 5000 (Sans conversion MNA) (Sans pré-calibrage)
- Avec PosBMHTol.BMH_C6T : Trouvé : 10000 fois, Mis : 1107 ms pour nb-Recherches = 5000 (Sans conversion MNA) (Sans pré-calibrage)

BMH2E utilise la table à 2 entrées de Fabrique_Sauts..

A côté d'elle PosEx (13,86 fois plus lente) semble rester coincée des ses starting-blocs (lol)

Code de la BMH2E :

function BMH2E(const Mot, Texte: AnsiString; var Depuis: longWord): boolean;
var im, it, ik, LM, LT: integer;
begin
Result := false; LM := Length(Mot); LT := length(Texte);
if (LM < 3) or (LT = 0) then EXIT;
ik := Depuis + LM - 1;
repeat
it := ik;
im := LM;
if (Texte[it] = Mot[im]) and (Texte[it - 1] = Mot[im - 1]) then begin // Si concordance sur 2 derniers caractères alors vérification à reculons
dec(it, 2); dec(im, 2);
repeat
Dec(im);
Dec(it);
until (im = 0) or (Texte[it] <> Mot[im]);
if im = 0 then begin
Result := true; Depuis := it; EXIT; // Occurrence Trouvée
end;
end;
Inc(ik,Table[Texte[ik], Texte[ik - 1]]);
Result := false;
until ik > LT;
Result := false; Depuis := 0;
end; // BMH2E

En tous cas : mille fois merci pour Fabrique_Sauts

Cordialement, et à +.