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

Java Discussion :

Calcul de nombre d'occurrences


Sujet :

Java

  1. #1
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut Calcul de nombre d'occurrences
    Bonsoir,
    Je dois calculer le nombre d'occurrence d'une liste de mots dans un corpus (peuvent être composer de plusqu'un mot): exemple "letter", "a letter", "this ozone-depleting".
    j'ai mis les chaines de mots à calculer das une liste "listeMots" et j'ai parcouru le corpus; je vous présente une partie de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       while ( (ligne= fp.readLine())!=null)
    				{
     
    				   for(int j=0; j<listeMots.size();j++)
    					{
    					 if(ligne.contains(listeMots.get(j)))
    					 {
    						   listeNbre.set(j, listeNbre.get(j)+1);
     
    					 } 
     
     
    	    			 }
    				}
    Mais dans le cas où la ligne contient plusqu'une fois une chaine à cherceher, le code va l'ignorer!
    dans ce cas par quoi je dois remplacer "contains"??
    merci

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Utilise la méthode indexOf(String,startIndex), chaque fois que tu trouve quelque chose, tu recommence à chercher après ce quelque chose, jusqu'à ce que indexOf te retourne -1.

  3. #3
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    j'ai essayé de travailler le code autrement: avec les pattern,
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Occurrence {
    	static String chaine="";
    	static String ligne1="";
    	static List <String> listeMots =new ArrayList<String>();
    	static List <Integer> listeNbre =new ArrayList<Integer>();
    	public static void main(String[] args)throws IOException{
            lecture("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\test.txt",listeMots); 
    		p("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\NombreOccurrenceTrigramFinal.txt",listeMots);
    	}
    public static void lecture (String fichier,List <String> ListeM){
    		try{
     
    		 	InputStream ips=new FileInputStream(fichier); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			String ligne;
    			while ((ligne=br.readLine())!=null ){
    				listeMots.add(ligne);
    				listeNbre.add(0);
    			}
    			 }		
    		catch (Exception e){
    			System.out.println(e.toString());
    		   }
    }
    public static void p(String out,List <String> ListeM) {
    	try{
    		OutputStream ips=new FileOutputStream(out,true); 
    		OutputStreamWriter ipsr=new OutputStreamWriter(ips);
    		BufferedWriter fp=new BufferedWriter(ipsr);
    	    String texte=recText("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\corpus-test.txt");
    	   fp.flush();
    	for (int i = 0; i < listeMots.size(); i++) {
    	 int probM1=calculeOcc1(texte,listeMots.get(i));
    	 listeNbre.set(i, probM1);
    	}
    	fp.flush();
    	for(int j=0; j<listeMots.size();j++)
    	{
    	   System.out.println("***"+listeMots.get(j)+"***"+listeNbre.get(j)); 
    	   fp.append("***"+listeMots.get(j)+"***"+listeNbre.get(j));
    	   fp.append("\n");
    	}
    	fp.close();
    	}catch (Exception e){
    		System.out.println(e.toString());
    	}
    }
    public static String recText(String fichier){
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;int i=0;
    		while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    			System.out.println(i++);
    		}
    		br.close(); 
    	    }		
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
       return ligne1;
    }
     
    	public static int calculeOcc1(String texte, String mot){
    		Pattern pattern = Pattern.compile(mot);
    		Matcher matcher = pattern.matcher(texte);
    		int occ = 0;
    		while (matcher.find()) {
    		    occ++;
    		  //  System.out.println(occ++);
     
    		}
     
    		return occ;
    	}
     
     
     
    }
    le fichier test.txt
    a letter
    letter
    an letter
    another letter
    any letter
    one letter
    some letter
    something letter
    among bird
    bird
    this ozone-depleting from
    this ozone-depleting of
    this ozone-depleting regard
    this ozone-depleting by
    et le fichier corpus-test.txt
    resumption of the session a letter a letter
    you have request a debate on this subject in the course of the next few day during this part-session a letter
    Please rise then for this minute s silence bird
    the House rise and observe a minute s silence
    madam president on a point of order
    you will be aware from the press and television that there have be a number of bomb explosion and killing in Sri Lanka
    yes Mr Evans I feel an initiative of the type you have just suggest would be entirely appropriate
    if the House agree I shall do as Mr Evans have suggest
    madam president on a point of order
    I would like your advice about rule @card@ concern inadmissibility
    my question relate to something that will come up on Thursday and which I will then raise again
    it say that this should be do despite the principle of relative stability
    that be precisely the time when you may if you wish raise this question ie on Thursday prior to the start of the presentation of the report
    at the request of a French member Mr Zimeray a petition have already be present which many people sign include myself
    this be all in accordance with the principle that we have always uphold
    thank you Mr segno I shall do so gladly
    Indeed it be quite in keep with the position this House have always adopt
    madam president I should like to draw your attention to a case in which this Parliament have consistently show an interest
    it be the case of Alexander Nikitin
    now however he be to go before the court once more because the public prosecutor be appeal
    yes Mrs Schroedter I shall be please to look into the fact of this case when I have receive your letter
    but madam president my personal request have not be meet
    I would therefore once more ask you to ensure that we get a Dutch channel as well
    Mrs Plooij-van Gorsel I can tell you that this matter be on the agenda for the Quaestors meeting on Wednesday
    it will I hope be examine in a positive light
    madam president can you tell me why this Parliament do not adhere to the health and safety legislation that it actually pass
    why have no air quality test be do on this particular building since we be elect
    why have there be no health and safety Committee meeting since @card@
    why have there be no fire drill either in the Brussels Parliament building or the Strasbourg Parliament building
    why be there no fire instruction
    why have the staircase not be improve since my accident
    why be no-smoke area not enforce
    Il foctionne tres bien et correctement. Mais vous voyez que c'est bien optimisé pour le lancer avec un corpus de milliers de lignes????

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Réponse de Normand: tu teste et tu évalue si les temps de réponse correspondent à tes attentes. Si ce n'est pas la cas, tu essaie d'identifier comment améliorer.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    Bonsoir,
    Je dois calculer le nombre d'occurrence d'une liste de mots dans un corpus (peuvent être composer de plusqu'un mot): exemple "letter", "a letter", "this ozone-depleting".
    j'ai mis les chaines de mots à calculer das une liste "listeMots" et j'ai parcouru le corpus; je vous présente une partie de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       while ( (ligne= fp.readLine())!=null)
    				{
     
    				   for(int j=0; j<listeMots.size();j++)
    					{
    					 if(ligne.contains(listeMots.get(j)))
    					 {
    						   listeNbre.set(j, listeNbre.get(j)+1);
     
    					 } 
     
     
    	    			 }
    				}
    Mais dans le cas où la ligne contient plusqu'une fois une chaine à cherceher, le code va l'ignorer!
    dans ce cas par quoi je dois remplacer "contains"??
    merci
    visiblement, tu cherches quelque chose comme cela:

    http://commons.apache.org/proper/com...lang.String%29

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    j'ai essayé de travailler le code autrement: avec les pattern,
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Occurrence {
    	static String chaine="";
    	static String ligne1="";
    	static List <String> listeMots =new ArrayList<String>();
    	static List <Integer> listeNbre =new ArrayList<Integer>();
    	public static void main(String[] args)throws IOException{
            lecture("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\test.txt",listeMots); 
    		p("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\NombreOccurrenceTrigramFinal.txt",listeMots);
    	}
    public static void lecture (String fichier,List <String> ListeM){
    		try{
     
    		 	InputStream ips=new FileInputStream(fichier); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			String ligne;
    			while ((ligne=br.readLine())!=null ){
    				listeMots.add(ligne);
    				listeNbre.add(0);
    			}
    			 }		
    		catch (Exception e){
    			System.out.println(e.toString());
    		   }
    }
    public static void p(String out,List <String> ListeM) {
    	try{
    		OutputStream ips=new FileOutputStream(out,true); 
    		OutputStreamWriter ipsr=new OutputStreamWriter(ips);
    		BufferedWriter fp=new BufferedWriter(ipsr);
    	    String texte=recText("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\corpus-test.txt");
    	   fp.flush();
    	for (int i = 0; i < listeMots.size(); i++) {
    	 int probM1=calculeOcc1(texte,listeMots.get(i));
    	 listeNbre.set(i, probM1);
    	}
    	fp.flush();
    	for(int j=0; j<listeMots.size();j++)
    	{
    	   System.out.println("***"+listeMots.get(j)+"***"+listeNbre.get(j)); 
    	   fp.append("***"+listeMots.get(j)+"***"+listeNbre.get(j));
    	   fp.append("\n");
    	}
    	fp.close();
    	}catch (Exception e){
    		System.out.println(e.toString());
    	}
    }
    public static String recText(String fichier){
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		BufferedReader br=new BufferedReader(ipsr);
    		String ligne;int i=0;
    		while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    			System.out.println(i++);
    		}
    		br.close(); 
    	    }		
    	catch (Exception e){
    		System.out.println(e.toString());
    	}
       return ligne1;
    }
     
    	public static int calculeOcc1(String texte, String mot){
    		Pattern pattern = Pattern.compile(mot);
    		Matcher matcher = pattern.matcher(texte);
    		int occ = 0;
    		while (matcher.find()) {
    		    occ++;
    		  //  System.out.println(occ++);
     
    		}
     
    		return occ;
    	}
     
     
     
    }
    le fichier test.txt

    et le fichier corpus-test.txt

    Il foctionne tres bien et correctement. Mais vous voyez que c'est bien optimisé pour le lancer avec un corpus de milliers de lignes????
    En java 8, tu peux créer un Stream sur un BufferedReader. En écrivant le bon filtre et/ou mapper, (en utilisant la méthode de commons apache) et avec la bonne fonction d'agrégation (Collectors.groupingBy ou autre, à voir..), tu dois pouvoir obtenir directement une Map<String,Integer> avec comme clé: les mots-clés et en valeur, le nombre de leur occurrence respective .

    http://docs.oracle.com/javase/8/docs...tion.Function-

    De plus, si ton document Corpus-texte.txt est très grand, tu peux faire un traitement multicoeur avec un parallelStream() à la place de Stream().

    http://docs.oracle.com/javase/tutori...rallelism.html

    Le traitement multicoeur ne va pas tous le temps accélérer le programme. Il faut voir si le traitements de données si prête et adapter l'algorithme: à voir....

  7. #7
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Bonjour,
    Votre réponse est arrivée dans le temps nécessaire!! Ce c'est arrivé que j'ai patienté 5 jours et le programme tourne hier le soir est arrêté d'une erreur "java heap space" . Il a arrivé à la fin! mais malheureusement n'a pas etteint la fin . Je vais vois les liens que vous m'avez envoyé . J'ai cru que mon code est bien optimisé! mais il y'a toujours des choses inattendus

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    J'ai cru que mon code est bien optimisé! mais il y'a toujours des choses inattendus
    tu parles un peu plus haut d'un corpus de milliers de lignes: Si on le peut, et ici c'est la cas, il ne faut pas stocker toutes ces données sous forme d'une String dans ton programme. Il faut faire un traitement soit ligne par ligne ou via un Stream pour ne pas saturer les ressources de la jvm.

    Il serait bien aussi que tu utilises try-with-resources

    http://docs.oracle.com/javase/tutori...urceClose.html


    tu utilises la séquence suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    			System.out.println(i++);
    		}
    avec ligne1 et ligne qui sont des String. C'est très pénalisant. Il faut opter pour un StringBuilder (ou StringBuffer dans un environnement concurrent)


    http://docs.oracle.com/javase/7/docs...ingBuffer.html


    Autre précision: tu as les patterns "a letter" et "letter".

    Quand tu trouves, "a letter", tu incrémentes l'occurrence de "a letter" et celle de "letter" ou, seulement celle de "a letter" ?

  9. #9
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    chacun tout seul, j'incremente "letter" toute seule et "a letter" tout seul
    Le corpus est de 100M et contient 1.150.437 lignes
    System.out.println(i++); c'est juste pour voir l'avancement dans le console

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    chacun tout seul, j'incremente "letter" toute seule et "a letter" tout seul
    Le corpus est de 100M et contient 1.150.437 lignes
    System.out.println(i++); c'est juste pour voir l'avancement dans le console
    Ce n'est pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(i++);
    qui pose problème, c'est


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    		}
    Avec cette concantenation de String à chaque itération ( 1.150.437 lignes !!!). De toute façon, il ne faut pas stocker ces 1.150.437 lignes dans une variable. Il faut traiter ligne par ligne.

  11. #11
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    De toute façon, il ne faut pas stocker ces 1.150.437 lignes dans une variable. Il faut traiter ligne par ligne.
    je vais voir comment faire ça

  12. #12
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Si je fait le traitement ligne par ligne, donc pour chaque ligne je fait le parcourt de toute la liste??

  13. #13
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Bonjour, j'ai changer la partie de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    			System.out.println(i++);
    		}
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	while ((ligne=br.readLine())!=null){
    			if(nb<1001){
    				nb++;
    				ligne1+=ligne;
    				System.out.println(nb);	
    			            }
    			else{
    				listeLignes.add(ligne1);
    				nb++;
    				System.out.println(nb);
    		        }
    		}
    Dans le but de ne pas mettre tout le corpus dans une seule variable. Mais juste une question le parcour de la liste listeLignes je le fai dans la méthode calculeOcc1 ou p ? merci de m'aider d'avoir la meilleur optimisation :/

  14. #14
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par plawyx Voir le message
    Il serait bien aussi que tu utilises try-with-resources
    +1 en plus aucun flux n'est fermé !



    Citation Envoyé par plawyx Voir le message
    tu utilises la séquence suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((ligne=br.readLine())!=null){
    			ligne1+=ligne+"\n";
    			System.out.println(i++);
    		}
    avec ligne1 et ligne qui sont des String. C'est très pénalisant. Il faut opter pour un StringBuilder
    +1000

    Je dirais même que l'utilisation de l'opérateur + dans une boucle est vraiment une très grossière erreur !



    Citation Envoyé par plawyx Voir le message
    (ou StringBuffer dans un environnement concurrent)
    Je dirais plutôt : ou StringBuffer pour les versions de Java antérieur à Java 5.0 (car StringBuilder n'existait pas).

    Le coté thread-safe de StringBuilder ne sert pas à grand chose...



    a++

  15. #15
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Salut,
    j'ai ajouté ce bout de code :
    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
    	 catch (Exception e) {
    	        e.printStackTrace();
    	    } finally {
    	        close(br);
    	    }
       return ligne1;
    }
     
    private static void close(Closeable closable) {
        if (closable != null) {
            try {
                closable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    pour "try-with-resources"
    et j'ai pas bien compris franchement dit qui est la meilleur? StringBuffer ou StringBuilder: D'apres ce que j'ai compris que d'utiliser StringBuffer:
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class NombreOccurrence {
    	static String chaine="";
    	static StringBuffer ligne1 =new StringBuffer();
    	static List <StringBuffer> listeLignes =new ArrayList<StringBuffer>();
    	static List <String> listeMots =new ArrayList<String>();
    	static List <Integer> listeNbre =new ArrayList<Integer>();
    	public static void main(String[] args)throws IOException{
            lecture("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\test-test.txt",listeMots); 
           p("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\NombreOccurrenceTrigramFinal.txt",listeMots,listeLignes);
    	}
    public static void lecture (String fichier,List <String> ListeM){
    		try{
     
    		 	InputStream ips=new FileInputStream(fichier); 
    			InputStreamReader ipsr=new InputStreamReader(ips);
    			BufferedReader br=new BufferedReader(ipsr);
    			String ligne;
    			while ((ligne=br.readLine())!=null ){
    				listeMots.add(ligne);
    				listeNbre.add(0);
    			}
    			 }		
    		catch (Exception e){
    			System.out.println(e.toString());
    		   }
    }
    public static void p(String out,List <String> ListeM,List <StringBuffer> ListeL) {
    	try{
    		OutputStream ips=new FileOutputStream(out,true); 
    		OutputStreamWriter ipsr=new OutputStreamWriter(ips);
    		BufferedWriter fp=new BufferedWriter(ipsr);
    		StringBuffer texte=recText("C:\\Users\\HP\\workspace\\testModif\\ptitCorpusApprentissageLemmatisé.txt");
    	   fp.flush();
    	   for (int j = 0; j < listeLignes.size(); j++) {
    	   for (int i = 0; i < listeMots.size(); i++) {
    	 int probM1=calculeOcc1(listeLignes.get(j),listeMots.get(i));
    	 listeNbre.set(i, probM1);
    	}}
    	fp.flush();
    	for(int j=0; j<listeMots.size();j++)
    	{
    	   System.out.println("***"+listeMots.get(j)+"***"+listeNbre.get(j)); 
    	   fp.append(listeMots.get(j)+"="+listeNbre.get(j));
    	   fp.append("\n");
    	}
    	fp.close();
    	}catch (Exception e){
    		System.out.println(e.toString());
    	}
    }
    public static StringBuffer recText(String fichier){
    	BufferedReader br = null;
    	try{
    		InputStream ips=new FileInputStream(fichier); 
    		InputStreamReader ipsr=new InputStreamReader(ips);
    		 br=new BufferedReader(ipsr);
    		String ligne;
    		int nb = 0;
    		while ((ligne=br.readLine())!=null){
    			if(nb<1001){
    				nb++;
    				ligne1.append(ligne+"\n");
    				//System.out.println(nb);	
    			            }
    			else{
    				listeLignes.add(ligne1);
    				nb++;
    				//System.out.println(nb);
    		        }
    		}
    		br.close(); 
    	    }		
    	 catch (Exception e) {
    	        e.printStackTrace();
    	    } finally {
    	        close(br);
    	    }
       return ligne1;
    }
     
    private static void close(Closeable closable) {
        if (closable != null) {
            try {
                closable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    	public static int calculeOcc1(StringBuffer texte, String mot){
    		Pattern pattern = Pattern.compile(mot);
    		Matcher matcher = pattern.matcher(texte);
    		int occ = 0;
    		while (matcher.find()) {
    		    occ++;
    		  //  System.out.println(occ++);
     
    		}
     
    		return occ;
    	}
     
     
     
    }
    La classe fonctionne correctement mais j'ai pas remarqué une grande amélioration surtout que le parcourt de listeLignes prend du temps en exécution:

  16. #16
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    Nom : 1.jpg
Affichages : 764
Taille : 41,0 Ko
    Je vous joins l'erreur de la premiere version de code. Je vous rappel mes amis que j'ai un grand corpus en entrée c'est pour ce la je veux l'optimiser le max, même si vous voyez que mon code non optimiser du à mes compétences limitées.

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    et j'ai pas bien compris franchement dit qui est la meilleur? StringBuffer ou StringBuilder: D'apres ce que j'ai compris que d'utiliser StringBuffer:
    Perdu c'est StringBuilder... mais c'est pas bien grave du moment que tu n'utilises pas l'opérateur + dans une boucle...

    Mais apparemment tu ne peux pas t'en empêcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne1.append(ligne+"\n");

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne1.append(ligne).append("\n");




    Sinon avant de penser "optimisation" tu devrais plutôt travailler sur un code clair et lisible :
    • Le code super mal indenté c'est illisible...
    • On a dit pas de + dans une boucle : ligne1.append(ligne+"\n") ligne1.append(ligne).append("\n")
    • Ces quoi toutes ces variables déclarées en static ???
    • Et pourquoi plusieurs des paramètres des méthodes ne sont pas utilisés ?
    • La libération des ressources, c'est pour toutes les ressources, et non pas une seule...




    Franchement j'ai essayé de lire ton code, mais je n'ai pas réussi à comprendre ce qu'il faisait !
    • Quel est l'objectif de la méthode p() ? Et pourquoi ignore-t-elle 2 de ses arguments ?
    • Que fait recText() exactement ? Elle lit les 1000 premières lignes dans un StringBuffer, puis place ce même StringBuffer dans une liste pour chaque nouvelle ligne ? Pourquoi ???
    • Et Pourquoi sa valeur de retour est ignoré ?
    • Que fait calculeOcc1() ? Compter le nombre d’occurrence d'un mot ? Les Pattern me semble disproportionné pour cela.
      Un indexOf() me semblerait plus approprié




    a++

  18. #18
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Mouais, en plus du fait que ce code soit tres moche et impossible à maintenir, il ne faut pas esperer des gains de performance en faisant la meme chose. La, tu ne fais que fermer les flux donc c'est un peu moins moche. Mais le code qui prend du temps est le meme.

    Si tu veux un gain de performance, c'est l'algo qu'il faut changer. Si j'ai bien suivi, ce que tu veux, c'est compter le nombre d'occurences de différents mots. Ce qu'il faudrait faire, c'est donc creer la liste de mots puis lire le fichier ligne par ligne. Mais au lieu de concatener ta chaine, il faudrait directement chercher tous les mots. Ca eviterait d'utiliser inutilement une grosse quantité de mémoire (puisque tu dis toi meme que ton fichier est gros) et de faire le travail en 2 fois.

    Et sur la fome, pour eviter les variables static dans tous les sens, il faudrait creer une classe et l'instancier dans ton main. Ensuite, faire le traitement. Ca ferait un peu moins code en C qui s'est perdu dans java.
    Par ailleurs, tu passes à tes fonctions en parametre les listes sur lesquelles elles sont sensées travailler. Puis tu utilises directement les variables de la classe. Faut bien comprendre qu'en plus de gacher des ressources, ca rend ce code difficile à lire parce qu'on voit bien que tu avances par itération sans comprendre ce que tu fais. Au final, ca va peut etre tomber en marche sur un malentendu mais ce code gagnerait à etre refait...

  19. #19
    Membre du Club
    Femme Profil pro
    Doctorante
    Inscrit en
    Mai 2012
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Doctorante
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2012
    Messages : 58
    Points : 47
    Points
    47
    Par défaut
    L'objectif en général c'est de calculer le nombre d'occurrence de chaque pattern dans un corpus.
    adiGuba : Ces quoi toutes ces variables déclarées en static ???
    j'ai pas cru que les variables statique peuvent poser un problème!
    Quel est l'objectif de la méthode p() ?
    l'bjectif c'est de parcourir la liste des pattern et faire appel à la méthode recText et calculeOcc1
    Que fait recText() exactement ? Elle lit les 1000 premières lignes dans un StringBuffer, puis place ce même StringBuffer dans une liste pour chaque nouvelle ligne ? Pourquoi ???
    c'est de mettre chaque 1000 lignes dans une variable pour éviter de mettre tout le corpus dans une seule variable
    Et Pourquoi sa valeur de retour est ignoré ?

    Que fait calculeOcc1() ? Compter le nombre d’occurrence d'un mot ? Les Pattern me semble disproportionné pour cela.
    Un indexOf() me semblerait plus approprié
    oui de calculer le nombre d'occurrence , oui ils sont disproportionnés, je vais voir avec l'indexOf
    hwoarang : Faut bien comprendre qu'en plus de gacher des ressources, ca rend ce code difficile à lire parce qu'on voit bien que tu avances par itération sans comprendre ce que tu fais. Au final, ca va peut etre tomber en marche sur un malentendu mais ce code gagnerait à etre refait...
    Vous avez raison mes amis , je vais refaire le code , et je vais essayer de le faire correctement
    merci
    A+++

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 974
    Points : 1 825
    Points
    1 825
    Par défaut
    Citation Envoyé par Wim88 Voir le message
    l'bjectif c'est de parcourir la liste des pattern et faire appel à la méthode recText et calculeOcc1
    la méthode static StringUtils.countMatches de apache.commons. fait cela en un seule appel.

    Citation Envoyé par Wim88 Voir le message
    c'est de mettre chaque 1000 lignes dans une variable pour éviter de mettre tout le corpus dans une seule variable
    tu as nécessaire beaucoup moins de mots clés que de mots de la corpus. C'est donc l'inverse qu'il faut faire.

    Citation Envoyé par Wim88 Voir le message
    oui de calculer le nombre d'occurrence , oui ils sont disproportionnés, je vais voir avec l'indexOf
    StringUtils.countMatches

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 20/01/2014, 16h42
  2. [AC-2010] Calculer le nombre d'occurrences des extrêmes dans un tableau
    Par PinkLady dans le forum VBA Access
    Réponses: 12
    Dernier message: 17/12/2013, 09h48
  3. fontion qui calcule le nombre d'occurrence
    Par mido1951 dans le forum C
    Réponses: 3
    Dernier message: 09/05/2013, 18h07
  4. Comparaison de base et calculs du nombre d'éléments dans Bas
    Par BXDSPORT dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2004, 08h00

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