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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 confirmé
    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
    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
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    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 Expert

    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
    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....

  6. #6
    Membre confirmé
    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
    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

  7. #7
    Membre Expert

    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
    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" ?

  8. #8
    Membre Expert

    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
    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

+ Répondre à la discussion
Cette discussion est résolue.

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