principe de moteur de recherche

Le
Paul
Bonjour,

Je ne sais pas trop comment rechercher une librairie qui me permette
la chose suivante :
- je fourni un texte ($input)
- je fourni une table $hash de ce style : {key1 =>Array('val1', 'val1
bis'), key2 =>Array('val2', 'val2 bis')}

Et ensuite la librairie en question va aller rechercher le nombre
d'occurences de key1, et de key2 contenues dans $input. Sâchant que le
nombre d'occurences de key1 est la somme des occurences de chaque
éléments de $hash{'key1'}.

Un exemple pour mieux comprendre :
$hash = {key1 =>Array('val1', 'val bis'), key2 =>Array('machin',
'truc')};
$input = "val1 est un super test Val bis mais aussi un test ridicule
sur vAL1 Ensuite, on fera un test pour TrUc car c'est assez
complexe comme maChin.";

Je souhaite avoir ce retour :
- Nombre d'occurences de 'key1' = 3
- Nombre d'occurences de 'key2' = 2

Vous connaissez une librairie qui me permette ce que je veux ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jogo
Le #19870071
Sur fr.comp.lang.perl, Paul disait :

Vous connaissez une librairie qui me permette ce que je veux ?



Non.

Par contre, expliqué comme ça, ça ne me paraît pas trop compliqué :

my %frequence_of;
for my $key (keys %hash) {
for my $val (@{ $hash{$key} }) {
if (my $nb = $input =~ s/Q$val/$&/ig) {
$frequence_of{$key} += $nb;
}
}
}
dump(%frequence_of);

Mais je trouve que ton %hash est "à l'envers". Je préfèrerais le
transformer comme ça :

my %usefull_hash;
for my $key (keys %hash) {
for my $val (@{ $hash{$key} }) {
push @{ $usefull_hash{$val} }, $key;
}
}

Ensuite, tu peux l'utiliser ainsi :

for my $regex (keys %usefull_hash) {
if (my $nb = $input =~ s/Q$regex/$&/ig) {
for my $key (@{ $usefull_hash{$regex} }) {
$frequence_of{$key} += $nb;
}
}
}

Pour une seule chaine à tester, c'est un peu plus long. Mais si tu
teste plein de chaines, ça doit être rentable de retourner le hash.

--
Ce qui rend les voyages à peu près inutiles,
c'est que l'on se déplace toujours avec soi.
- Henri Calet - L'Italie à la paresseuse -
Paul
Le #19917691
> my $nb = $input =~ s/Q$regex/$&/ig


Que sgnifie le Q ?
Paul
Le #19917711
On 12 août, 13:15, Paul
> my $nb = $input =~ s/Q$regex/$&/ig

Que sgnifie le Q ?



arf... :
http://perldoc.perl.org/perlfaq6.html
"The use of Q causes the character, so that P. matches a P followed by a dot."
Paul Gaborit
Le #19918061
À (at) Wed, 12 Aug 2009 04:19:36 -0700 (PDT),
Paul
On 12 août, 13:15, Paul
> my $nb = $input =~ s/Q$regex/$&/ig

Que sgnifie le Q ?



arf... :
http://perldoc.perl.org/perlfaq6.html
"The use of Q causes the character, so that P. matches a P followed by a dot."



C'est un peu plus que ça : Q désactive les meta-caractères de motif
jusqu'au prochain E. Dans les meta-caractères, on trouve bien sûr '.'
mais aussi '+', '*', '?', '(', etc.


--
Paul Gaborit - Perl en français -
Nicolas George
Le #19918051
Paul Gaborit wrote in message
> my $nb = $input =~ s/Q$regex/$&/ig




C'est un peu plus que ça : Q désactive les meta-caractères de motif
jusqu'au prochain E.



Précisons que la recherche du E correspondant est faite avant
l'interpolation, ce qui fait que si $regex contient la chaîne E, ce sera
remplacé par \E de manière à la chercher littéralement.

C'est, évidemment, le seul comportement raisonnable, mais c'est toujours
mieux d'être rassuré sur le fait que c'est bien le comportement adopté.
Publicité
Poster une réponse
Anonyme