Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Merci Philou,
J'ai vu que ca marche sauf en mettant une espace justre avant le retour chariot
est ce normal?
Merci
monsieur le président appelle la commission de l(espace)
union européenne l union et la commission(espace)
Le jour est le père du labeur et la nuit est la mère des pensées.
Le jour est le père du labeur et la nuit est la mère des pensées.
C'est le genre de chose qu'il aurait fallu dire dès le début... car cela conditionne tout l'algorithme
Avec cette nouvelle demande, l'algo de transformation, et la lecture du dictionnaire doivent être complètement revus.
Pour l'espace en fin de ligne, ce doit être un détail d'implémentation (que je peux regarder, mais qui sera sans doute remis en cause si je trouve un algo pour ta nouvelle spec).
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Je suis desolée
Jespere que ca sera possible avec ce changement
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
C'est un peu plus complexe, et je ne pourrai pas regarder avant demain. Je planche sur l'idée de charger le dictionnaire avec des expressions régulières qui rassemblent la liste des mots à joindre.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Une question : l'ordre des mots à associer dans le dictionnaire doit-il être respecté dans la phrase pour permettre la jointure ?
Exemple, si dans le dictionnaire j'ai la ligne :
Le résultat de la transformation de la phrase :
Code : Sélectionner tout - Visualiser dans une fenêtre à part la commission
sera :
Code : Sélectionner tout - Visualiser dans une fenêtre à part la commission
et celui de la phrase :
Code : Sélectionner tout - Visualiser dans une fenêtre à part la+commission
commission la
sera-t-il :
ou bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part commission+la
?
Code : Sélectionner tout - Visualiser dans une fenêtre à part commission la
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Bonjour Philou,
Je pense que je vous ai pas bien comrpi ou bien le contraire
Bon je reexplique
on a deux fichier : un DICO et un IN
Le dico contient des sequence de mots (2 mot ou plus)
le fichier IN contient des phrases
Exemple du fichier DICO :
exemple du fichier IN :la commission
le président
et la
l union
monsieur le
union européenne
Objectif:monsieur le président appelle la commission de l
union européenne l union et la commission
rassembler ou bien delimiter les séquences du fichier IN qui se trouvent dans le fichier DICO en respectant l'ordre:
autrement dit je parcours le fichier DICO ligne par ligne (sequence par sequence) et je delimite cette sequence dans le fichier IN
Exemple :
fichier DICO :
fichier IN :la commission
le président
et la
l union
monsieur le
union européenne
1ere etape : je trouve que la sequence la commission se trouve a la tete du fichier DICO, donc je vais rassembler cette sequence dans tout (lintegralité) du fichier INmonsieur le président appelle la commission de l
union européenne l union et la commission
Donc jaurais ca :
2eme passage , je trouve apres quil ya la sequence le président, donc je ressemble cette sequence dans le fichier IN, jaurais donc ca :monsieur le président appelle la+commission de l
union européenne l union et la+commission
etc...monsieur le+président appelle la+commission de l
union européenne l union et la+commission
c ca l'idee de base
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
J'avais bien compris le fonctionnement "de base". Mais tu as ensuite introduit le fait que le dictionnaire pouvait contenir plus de 2 mots.
Or l'algorithme prévu pour le fonctionnement "de base" n'est pas du tout adapté à un dictionnaire à plus de 2 mots... il faut donc que tu décrives ton besoin réel, et pas un besoin "simplifié", car dans ce cas, il faut tout revoir.
Par ailleurs, si comme tu le dis maintenant, l'ordre des mots dans le dictionnaire doit être respecté dans les phrases du fichier IN, alors l'algorithme actuel doit être corrigé, car il associe deux mots qui se trouve dans le dictionnaire quelque soit leur ordre dans la phrase (la commission ou commission la sont associés).
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Dis moi si ceci répond à ton besoin:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 use strict; use warnings; use utf8; use feature qw(:5.10); my ($in, $dico) = @ARGV; die "Bad infile $in" if !-r $in; die "Bad dicofile $dico" if !-r $dico; # load dico my @dico; open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n"; # Pour toutes les lignes du dictionnaire foreach my $line (<$DICO>) { chomp($line); # Extraire les mots et s'il y en a sur la ligne if (my @word = split /\s+/, $line) { # Construire l'expression régulière permettant de joindre les mots # 3 captures sont effectuées : les espaces avant, les mots à associer, les espaces après my $re = q{(^\s*|\s+)(}.(join q(\s+), @word).q{)(\s+|\s*$)}; # Stocker les mots et l'expression régulière de recherche dans @dico push @dico, qr/$re/; } } open my $IN, "<", $in or die "Can't open $in for reading: $!\n"; my @word; # Pour toutes les lignes du fichier d'entrée foreach my $line (<$IN>) { # Pour toutes les lignes du dictionnaire foreach my $dico (@dico) { # Tant que la séquence du dictionnaire est présente dans la phrase while (my (undef, $sequence) = $line =~ /$dico/) { # Faire la transformation des espaces en + $sequence =~ s/\s+/+/g; $line =~ s/$dico/$1$sequence$3/; } } print $line; }
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
TOP!!!
Nickel
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
Derniere question simple
[code]#!/usr/bin/perl
J'aimerai bien ecrire le resultat dans un fichier texte, mais ya un souci : il ma affiche une ligne vide entre les deux ligne resultats :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 use strict; use warnings; use utf8; use feature qw(:5.10); my ($in, $dico) = @ARGV; die "Bad infile $in" if !-r $in; die "Bad dicofile $dico" if !-r $dico; # load dico my @dico; open(FICHIERNOUVELLES, ">resultat.txt"); open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n"; # Pour toutes les lignes du dictionnaire foreach my $line (<$DICO>) { chomp($line); # Extraire les mots et s'il y en a sur la ligne if (my @word = split /\s+/, $line) { # Construire l'expression régulière permettant de joindre les mots # 3 captures sont effectuées : les espaces avant, les mots à associer, les espaces après my $re = q{(^\s*|\s+)(}.(join q(\s+), @word).q{)(\s+|\s*$)}; # Stocker les mots et l'expression régulière de recherche dans @dico push @dico, qr/$re/; } } open my $IN, "<", $in or die "Can't open $in for reading: $!\n"; my @word; # Pour toutes les lignes du fichier d'entrée foreach my $line (<$IN>) { # Pour toutes les lignes du dictionnaire foreach my $dico (@dico) { # Tant que la séquence du dictionnaire est présente dans la phrase while (my (undef, $sequence) = $line =~ /$dico/) { # Faire la transformation des espaces en + $sequence =~ s/\s+/+/g; $line =~ s/$dico/$1$sequence$3/; } } print FICHIERNOUVELLES "$line \n"; } close(FICHIERNOUVELLES);
Le jour est le père du labeur et la nuit est la mère des pensées.
Il faut enlever le \n dans "$line \n" !
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Merci beaucoup
Le jour est le père du labeur et la nuit est la mère des pensées.
REbonjour
J'ai un autre petit souci concernant le script :
J'ai dans le fichier IN.txt :
et dabs le fichier DICO.txt :monsieur+le president de la republique
union européenne
normallement il doit coller la 1ere sequence à savoir : "monsieur+le president"monsieur+le president
union européenne
de cette facon on aura comme resultat :
Mais ce scriot il ne fait pas le collage de cette facon :/
monsieur+le+president de la republique
Avez vous une idée ?
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
Comme il n'était pas prévu initialement que dans le dictionnaire il puisse exister des mots comportant autre chose que des caractères alphabétiques, il n'était pas nécessaire de prendre de précaution pour construire l'expression régulière permettant de détecter ces mots dans les phrases.
Maintenant que ces mots peuvent contenir "+", qui est un caractère spécial pour les expressions régulières, il faut échapper ces caractères (avec la fonction perl quotemeta).
Il faut donc changer cette ligne :
en
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $re = q{(^\s*|\s+)(}.(join q(\s+), @word).q{)(\s+|\s*$)};
Code : Sélectionner tout - Visualiser dans une fenêtre à part my $re = q{(^\s*|\s+)(}.(join q(\s+), map quotemeta, @word).q{)(\s+|\s*$)};
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Bonjour,
Me voilà encore sur ce programme sachant qu'il marche bien ( Merci à Philou), mias il n'est pas optimisé et super trop lent vu que je travaille sur des fichier de taille GigaOctet et ce car il parcours plusieur fois le meme gros corpus.
Je reste encore s'il ya d'autre proposition pour l'ameliorer.
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
Pourrais-tu poster la version actuelle du fichier (et un sous ensemble représentatif du corpus) ?
(j'ai perdu ma sauvegarde des travaux que j'avais réalisé sur ton sujet).
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Merci Philou pour ta reponse
Voilà ca c'est le code :
Le fichier Input (le gros taille 1go presque)
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 use strict; use warnings; use utf8; use feature qw(:5.10); my ($in, $dico) = @ARGV; die "Bad infile $in" if !-r $in; die "Bad dicofile $dico" if !-r $dico; # load dico my @dico; open(FICHIERNOUVELLES, ">resultat7.txt"); open my $DICO, "<", $dico or die "Can't open $dico for reading: $!\n"; # Pour toutes les lignes du dictionnaire foreach my $line (<$DICO>) { chomp($line); # Extraire les mots et s'il y en a sur la ligne if (my @word = split /\s+/, $line) { # Construire l'expression régulière permettant de joindre les mots # 3 captures sont effectuées : les espaces avant, les mots à associer, les espaces après my $re = q{(^\s*|\s+)(}.(join q(\s+), map quotemeta, @word).q{)(\s+|\s*$)}; # Stocker les mots et l'expression régulière de recherche dans @dico push @dico, qr/$re/; } } open my $IN, "<", $in or die "Can't open $in for reading: $!\n"; my @word; # Pour toutes les lignes du fichier d'entrée foreach my $line (<$IN>) { # Pour toutes les lignes du dictionnaire foreach my $dico (@dico) { # Tant que la séquence du dictionnaire est présente dans la phrase while (my (undef, $sequence) = $line =~ /$dico/) { # Faire la transformation des espaces en + $sequence =~ s/\s+/+/g; $line =~ s/$dico/$1$sequence$3/; } } print FICHIERNOUVELLES "$line"; } close(FICHIERNOUVELLES);
Le fichier Dicola reprise de la session du parlement européen
je déclare reprise la session du parlement européen
je vous renouvelle tous mes voeux en espérant de bonnes vacances
L'objectif c'est chercher les sequences de mots du Fichier Dico dans le fichier textuel le gros et coller les mots avec un signe"+" tout en respectant l'ordre des mots dans le fichier dicoreprise de
la session
parlement européen
bonne vacances
de bonne+vacances
Du coup on aura :
voilà, je reste à votre disposityion pour toutes autres infos
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 la reprise+de la+session du parlement+européen je déclare reprise la+session du parlement+européen je vous renouvelle tous mes voeux en espérant de+bonnes+vacances
Merci
Le jour est le père du labeur et la nuit est la mère des pensées.
Plus j'apprends, et plus je mesure mon ignorance (philou67430)
Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
Si c'est utile, say
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager