OVH Cloud OVH Cloud

Extrait pertinent

6 réponses
Avatar
Paul
Bonjour,

Avez vous une i=E9de simple pour rechercher un extrait parmis un texte.

Exemple :
J'ai un texte de 50 lignes,
J'ai un mot cl=E9.

Je souhaite avoir l'extrait pertinent, sachant que :
un extrait pertinent est compos=E9 du de la phrase du mot cl=E9, ainsi que
de la phrase pr=E9c=E9dente, et de la phrase suivante.

Pouvez vous me guider surtout pour d=E9tecter les phrases, et savoir dans
quelle phrase se situe mon mot cl=E9 (phrase n). Il faudrait ensuite
garder la phrase n-1 et n+1.

Je pense que c'est possible de faire cela avec un tableau...

Merci de bien vouloir me conseiller, et me proposer d'autres solutions
si le tableau n'est pas une bonne id=E9e.

Paul.

6 réponses

Avatar
Emmanuel Florac
Le Fri, 01 Apr 2005 17:29:09 +0200, Paul a écrit :


Je pense que c'est possible de faire cela avec un tableau...


Voici ma proposition (version cow boy) : je suppose que tes phrases sont
séparées par des points. 1) modifier le spéarateur par défaut pour
correspondre au point ($/='.'). 2) faire un slurp du fichier dans un
tableau(@fichier=<fichier>). faire une boucle sur le tableau qui renvoie
l'élément pertinent, l'élément précédent et l'élément suivant...

VOilà, exercice : écrivez le code :)

--
on passe la moitié de son temps à refaire ce que l'on n'a pas eu le
temps de faire correctement.
Loi de Myers.

Avatar
Antoun
Je souhaite avoir l'extrait pertinent, sachant que :
un extrait pertinent est composé du de la phrase du mot clé, ainsi que
de la phrase précédente, et de la phrase suivante.


je suppose que tu disposes d'une variable $texte contenant l'intégralité
de ton texte.

Comment définit-on une phrase ? je dirais qu'il s'agit d'un morceau de
texte séparé par l'un des éléments suivants :

- début ou fin de chaîne
- un signe de ponctuation parmi les suivants : . ? ! ...
- un retour chariot r

pour raffiner un peu, disons que :

- tu recherches ton mot-clé sans t'occuper de la casse, mais tu veux que
ce soit le mot exact

- en cas d'occurences multiples de ton mot-clé dans le texte, tu ne
t'intéresses qu'à la première

- . ? ! ne marchent que s'ils sont suivis d'au moins un espace (sinon
fr.comp.lang.perl représente 4 phrases !)

- des retours chariots successifs ne comptent pas, ni non plus des
espaces avant ou après le retour chariot


Maintenant, tu découpes ton texte en un tableau de phrases, tu
recherches ton mot-clé et tu prends tes trois phrases :

___________

my $texte = "ton blaba..." ;
my $ok = 0 ;
my $motcle = 'Kakabayev' ; # le mot que tu recherches

my @tablo = split /(?:[.?!]s+)|(?:s*rs*)/, $texte ;

my $i ;
for ($i = 0; $i <= $#tablo; $i++) {
if ($tablo[$i] =~ m/b$motcleb/i) {
$ok = 1;
last ;
}
}

exit if ! $ok ;

print "PHRASE PRECEDENTE : " . $tablo[$i - 1] . "n" if $i > 0 ;
print "PHRASE : " . $tablo[$i] . "n" ;
print "PHRASE SUIVANTE : " . $tablo[$i + 1] . "n" if $i < $#tablo ;

___________

un peu de commentaire sur la regex :

[.?!]s+ un signe de ponctuation .?! suivi d'au moins un espace

s*rs* un retour chariot, qui avale d'éventuels espaces

(?: ) parenthèses non-capturantes, afin d'éviter que les séparations
entre phrases ne se retrouvent dans @tablo




voilà, have fun !

Antoun

Avatar
Jérémy JUST
On Fri, 01 Apr 2005 21:35:31 +0200
Emmanuel Florac wrote:

faire un slurp du fichier dans un tableau(@fichier=<fichier>).


Ça va devenir énorme!

Je pense qu'il vaut mieux le faire sans tableau, au fil du texte.
Quelque chose comme:


<<<<<
my $previous_sentence = '' ;
my $display_next = 0 ;

while(my $sentence = <>)
{if ( $sentence =~m/ / ) # Recherche du mot
{print $previous_sentence, $sentence ;

$previous_sentence = '' ;
$display_next = 1 ;
}
elsif( $display_next )
{print $sentence ;

$previous_sentence = '' ;
$display_next = 0 ;
}
else
{$previous_sentence = $sentence ;
}
}







--
Jérémy JUST





Avatar
Paul
Bon, vous m'avez déjà apportés plusieurs éléments de réponses, je vais
maintenant passer à l'acte, j'espere ue je vais me débrouiller.

Merci de votre aide et vos propositions.

Paul




Le Fri, 1 Apr 2005 17:29:09 +0200
Paul <ernond_paul_at_yahoo.fr> vous écriviez :

Bonjour,

Avez vous une iéde simple pour rechercher un extrait parmis un texte.

Exemple :
J'ai un texte de 50 lignes,
J'ai un mot clé.

Je souhaite avoir l'extrait pertinent, sachant que :
un extrait pertinent est composé du de la phrase du mot clé, ainsi que
de la phrase précédente, et de la phrase suivante.

Pouvez vous me guider surtout pour détecter les phrases, et savoir
dans

quelle phrase se situe mon mot clé (phrase n). Il faudrait ensuite
garder la phrase n-1 et n+1.

Je pense que c'est possible de faire cela avec un tableau...

Merci de bien vouloir me conseiller, et me proposer d'autres solutions
si le tableau n'est pas une bonne idée.

Paul.


Avatar
Paul
si, si, ca risque d'être énorme... car, en disant 50 lignes, c'était un
exemple...

dans la réalité, ce sera plutot 200 lignes, et le mot clé sera plutot
une expression réguliére, voir plusieurs, et le tout, pour des centaines
de textes...



Le Sat, 02 Apr 2005 13:45:45 +0200
Antoun vous écriviez :

Jérémy JUST wrote:
On Fri, 01 Apr 2005 21:35:31 +0200
Emmanuel Florac wrote:


faire un slurp du fichier dans un tableau(@fichier=<fichier>).



Ça va devenir énorme!



un cinquantaine de lignes, énorme ???




Avatar
DoMiNiX
Paul wrote:
Bonjour,

Avez vous une iéde simple pour rechercher un extrait parmis un texte.

Exemple :
J'ai un texte de 50 lignes,
J'ai un mot clé.

Je souhaite avoir l'extrait pertinent, sachant que :
un extrait pertinent est composé du de la phrase du mot clé, ainsi que
de la phrase précédente, et de la phrase suivante.

Pouvez vous me guider surtout pour détecter les phrases, et savoir dans
quelle phrase se situe mon mot clé (phrase n). Il faudrait ensuite
garder la phrase n-1 et n+1.

Je pense que c'est possible de faire cela avec un tableau...

Merci de bien vouloir me conseiller, et me proposer d'autres solutions
si le tableau n'est pas une bonne idée.

Paul.



$cat toto
ceci est une premiere
phrase. suivie d'une deuxième construction. Qui
précède le troisième groupe. terminé par un quatrième.
qui ne termine pas tout cependant.

$ perl -n00l -e '@F=split(/(?=. )/,$_,0);
END{for(@F){$i++;print $F[$i -2],$F[$i -1],$F[$i] if /trois/}}' toto
. suivie d'une deuxième construction. Qui
précède le troisième groupe. terminé par un quatrième

j'étais parti sur un uniligne ...
mais ca fait un peu tiré par les cheveux a la fin.

alors en decomposé:
perl -MOÞparse -n00l -e '@F=split(/(?=. )/,$_,0);
END{for(@F){$i++;print $F[$i -2],$F[$i -1],$F[$i] if /trois/}}'

BEGIN { $/ = ""; $ = "nn"; }
LINE: while (defined($_ = <ARGV>)) {
chomp $_;
@F = split(/(?=. )/, $_, 0);
sub END {
foreach $_ (@F) {
++$i;
print $F[$i - 2], $F[$i - 1], $F[$i] if /trois/;
}
}
;
}
-e syntax OK


--
dominix