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. #21
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Peut-être, pour optimiser, créer un espèce de graphe à partir de la liste de mots à rechercher

    Exemple:
    Liste de mots à rechercher: ["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"]

    1) Extraire tous les mots de la liste de mots en découpant à partir des espaces (il faut voir si plusieurs espaces sont acceptés entre 2 mots ou pas)
    ["a", "letter", "an", "another", "any", "one", "some", "something", "among", "bird", "this", "ozone-depleting", "from", "of", "regard", "by"]

    2) Générer un tableau associatif [préfixe/ suffixe] avec la liste des mots trouvés, -1 si aucun
    PS: pour l'exemple, je prends l'indice, mais on peut prendre ce qu'on veut
    ["letter": [0, -1], [-1, -1], [2, -1], [3, -1], [4, -1], [5, -1], [6, -1], [7, -1]
    "bird": [8, -1], [-1, -1]
    "ozone-depleting": [10, 12], [10, 13], [10, 14], [10, 15]]

    Un truc: Lorsqu'on va découper notre liste de mots, maintenir une collection (qu'on pourra peut-être réutilisée) qui nous permet de savoir si un mot existe ou pas
    Et ainsi créer au fil de l'eau un tableau qui nous permet de simplifier l'étape 2:
    Liste de mots à rechercher (*): [0 1], [1], [2 1], [3 1], [4 1], [5 1], [6 1], [7 1], [8 9], [9], [10 11 12], [10 11 13], [10 11 14], [10 11 15]
    Et peut-être que ce tableau peut permettre de fusionner l'étape 2 et 3

    3) Simplifier ce tableau associatif , sûrement en récursif:
    On s'aperçoit que pour le mot "ozone-depleting", le préfixe "this" (10) apparait plusieurs fois
    ["letter": [0, -1], [-1, -1], [2, -1], [3, -1], [4, -1], [5, -1], [6, -1], [7, -1]
    "bird": [8, -1], [-1, -1]
    "this ozone-depleting": [-1, 12], [-1, 13], [-1, 14], [-1, 15]]

    Maintenant, on peut simplement rechercher "letter", "bird", "this ozone-depleting".
    Si on en trouve un, on prendre la liste de [préfixe/ suffixe] pour rechercher avant ou après, en faisant attention aux espaces évidemment


    Après je ne dis pas que c'est simple, réellement utile, que les associations préfixe/ suffixe c'est ce qu'il faut utiliser (on peut trouver autre chose **), ou même ... que c'est une optimisation réalisable

    ** -> Lorsqu'on voit (*), on s'aperçoit qu'on a plusieurs graphes de mots déconnectés [0, 1, 2, 3, 4, 5, 6, 7], [8, 9], [10, 11, 12, 13, 14, 15] (<- il n'y a pas les arêtes) et qu'il faut trouver pour chacun, le graphe de mots "interne central" le plus grand possible (même 1 mot)
    [0, 1, 2, 3, 4, 5, 6, 7] -> 1
    [8, 9] -> 9
    [10, 11, 12, 13, 14, 15] -> 10 - 11

  2. #22
    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
    Citation Envoyé par plawyx Voir le message
    la méthode static StringUtils.countMatches de apache.commons. fait cela en un seule appel.
    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.
    StringUtils.countMatches
    Voila j'ai pris en considération tes conseils et ça va c'est bon il calcule avec un temps de réponse très court
    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
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
     
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.io.FileUtils; 
    public class CalculNombrePattern 
    {    
        public static void main(String[] args) throws IOException
        {
          BufferedReader fListe = new BufferedReader(new FileReader("C:\\Users\\HP\\Desktop\\28Mars-Calcul\\combinaisons-selectionnées\\Trigram-Doublons-Supprimés.txt"));
    	 	List <String> listeMots =new ArrayList<String>();
    		List <Integer> listeNbre =new ArrayList<Integer>();	
    		 	String ligneL;
    			while ((ligneL=fListe.readLine())!=null ){
    				listeMots.add(" "+ligneL+" ");
    				listeNbre.add(0);
    			} 
    			// str : corpus
    			String str = FileUtils.readFileToString(new File("C:\\Users\\HP\\workspace\\testModif\\PartieCorpusApprentissageLemmatisé.txt"));
    			// parcour de listeMots des patern à calculer
    			for(int i=0; i<listeMots.size();i++)
    			{
    				  int wordFound = StringUtils.countMatches(str,listeMots.get(i));
    				  System.out.println("Nombre Occurrence '" + listeMots.get(i) +
    	                "' ="+wordFound);
    			}
     
        }
    }
    juste une chose que j'ai remarqué que par exemple pour un mot "layer", il va même calculer le chaine qui existe dans un mot "player" . c'est pour cela j'ai ajouter des espaces dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listeMots.add(" "+ligneL+" ");
    et même dans le corpus texte j'ai fait un espace au début de chaque ligne pour pourvoir calculer le premier mot. Tu vas la trouver une idée trop banal , parce que j'ai pas trouver une autre!
    Merci de me dire vos remarques a ce nouveau code
    j'attends vos remarques

  3. #23
    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
    foetus : merci pour ton idée , j'ai fait une autre idée tu peut l'avoir et donner ton avis

  4. #24
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	 	List <String> listeMots =new ArrayList<String>();
    		List <Integer> listeNbre =new ArrayList<Integer>();	
    		 	String ligneL;
    			while ((ligneL=fListe.readLine())!=null ){
    				listeMots.add(" "+ligneL+" ");
    				listeNbre.add(0);
    			}
    Une Map<String,Integer> est plus adapter à ton problème. Les mots clés seront les clés de ta Map et les valeurs seront les occurrences que tu incrémenteras par le résultat de StringUtils.countMatches


    Citation Envoyé par Wim88 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			// str : corpus
    			String str = FileUtils.readFileToString(new File("C:\\Users\\HP\\workspace\\testModif\\PartieCorpusApprentissageLemmatisé.txt"));
    une nouvelle fois, tu stockes l'intégralité (voir doc) de ton corpus, qui visiblement peut-être assez important, dans une chaîne plutôt que de lire ton corpus ligne par ligne et d'appliquer ta cherche via StringUtils.countMatches à cette "petite chaîne" et ensuite d'incrémenter son occurrence.

    http://commons.apache.org/proper/com...ava.io.File%29

    Dans le doute, regarde le résultat de la commande ci-dessous et tu verras :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.printf("Valeur de str : %s  \nSa longueur est: %d\n",str, str.length());


    De plus, la méthode readFileToString est annotée "Deprecated".

  5. #25
    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
    Citation Envoyé par plawyx Voir le message
    Une Map<String,Integer> est plus adapter à ton problème. Les mots clés seront les clés de ta Map et les valeurs seront les occurrences que tu incrémenteras par le résultat de StringUtils.countMatches
    Pour le coup, l'objectif de la liste est d'etre parcourue pour trouver le nombre d'occurence de chaque mot. Une liste semble donc plus adaptée qu'une map. Meme si on pourrait se fendre d'un objet contenant String + int qui permettrait de faire les calculs (et qui eviterait de gaspiller les integer).

    Pour revenir au probleme, comme pas mal de monde te l'a fait remarquer maintenant, il ne faut pas lire le fichier dans un string. Il faut, dans l'ordre :
    1 - creer la liste de mots
    2 - parcourir chaque ligne du fichier ou rechercher et incrementer le compteur en fonction de la présence de chacun des mots

    Donc, il ne faut pas creer un string qui contient 1000 lignes. Il ne faut pas non plus creer un string qui contient tout le fichier. De maniere générale, il ne faut jamais faire ca. On n'est jamais sur de la taille du fichier qui sera ouvert et on risque de saturer la mémoire.

  6. #26
    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
    j'ai pas cru que les variables statique peuvent poser un problème!
    Il n'y a aucun problème avec les attributs statiques... pour des données statiques !

    Là tu les utilisais pour "passer" les variables d'une méthode à l'autre... bref à la place de paramètre ce qui est incorrect (et en plus cela rend le tout illisible) !



    Citation Envoyé par Wim88 Voir le message
    Voila j'ai pris en considération tes conseils et ça va c'est bon il calcule avec un temps de réponse très court
    C'est déjà bien mieux ! Et beaucoup plus lisible !
    On peut désormais commencer à améliorer le code.


    • Tu oublies toujours de libérer les ressources, soit via des try/finally (Java 6 et inférieur), soit via un try-with-ressource (à partir de Java 7).
      Cela peut paraitre anodin dans une application avec une si courte durée de vie, mais si tu inclus ton code dans une application qui va tourner plus longtemps (comme un serveur par exemple), cela risque de poser divers problèmes difficile à déceler.
    • Comme plawyx et hwoarang te l'ont signalé, la double List n'est pas très pratique.
      Il serait plus approprié de créer un objet pour cela et une seule liste...
    • Tu utilises FileUtils.readFileToString() qui lit tout le fichier en mémoire...
      C'est certes rapide mais également très consommateur en mémoire si tu as de gros fichiers comme tu le dit.
      Vue que tu ne sembles pas avoir besoin du fichier par la suite, une lecture ligne par ligne serait plus approprié.
    • StringUtils.countMatches() avec un espace au début et à la fin ne marchera pas non plus pour les mots en début ou fin de ligne, ou séparé par des signes de ponctuations.
      Il serait préférable d'écrire son propre code plutôt que d'utiliser quelque chose qui fait "pas tout à fait" ce que l'on veut.
      Surtout que c'est pas bien méchant à faire (une boucle sur indexOf()), et que du coup on peut faire les vérifications supplémentaires selon notre besoin (vérifier qu'il n'y ait pas une lettre avant ou après le mot).




    Bref pour moi cela donnerait ceci (en Java 6) :
    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
    class WordCount {
    	private final String word;
    	private int count;
     
    	public WordCount(String word) {
    		this.word = word;
    	}
     
    	public String getWord() {
    		return word;
    	}
     
    	public int getCount() {
    		return count;
    	}
     
    	/**
             * Scan d'un texte afin de compter le nombre d'occurence du mot.
             */
    	public void scan(String text) {
    		final int len = this.word.length();
    		int startIndex = 0;
     
    		// On recherche l'index de l'occurence suivante du mot :
    		while ((startIndex = text.indexOf(this.word, startIndex)) >= 0) {
    			int endIndex = startIndex + len;
    			// On vérifie que le caractère précédent ne soit pas une lettre :
    			boolean prevCharIsOK = (startIndex == 0)
    					|| !Character.isLetter(text.charAt(startIndex - 1));
    			// On vérifie que le caractère suivant ne soit pas une lettre :
    			boolean nextCharIsOK = (endIndex == text.length())
    					|| !Character.isLetter(text.charAt(endIndex));
     
    			// Si les caractères précédent et suivant sont correct :
    			if (prevCharIsOK && nextCharIsOK) {
    				// on incrémente le compteur :
    				this.count++;
    			}
    			// puis on incrémente l'index pour passer à la suite :
    			startIndex += len;
    		}
    	}
     
    	/**
             * Lecture des mots dans un fichier (ligne par ligne)
             */
    	private static List<WordCount> readWordCounts(String fileName)
    			throws IOException {
    		List<WordCount> list = new ArrayList<WordCount>();
    		BufferedReader reader = new BufferedReader(new FileReader(fileName));
    		try {
    			String line;
    			while ((line = reader.readLine()) != null) {
    				list.add(new WordCount(line.trim()));
    			}
    		} finally {
    			reader.close();
    		}
    		return list;
    	}
     
    	/**
             * Recherche du nombre d'occurence des mots du fichier 'wordFileName', dans
             * le texte contenu dans le fichier 'fileName',
             */
    	public static List<WordCount> searchWords(String fileName,
    			String wordFileName) throws IOException {
    		List<WordCount> words = readWordCounts(wordFileName);
    		BufferedReader reader = new BufferedReader(new FileReader(fileName));
    		try {
    			String line;
    			while ((line = reader.readLine()) != null) {
    				for (WordCount word : words) {
    					word.scan(line);
    				}
     
    			}
    		} finally {
    			reader.close();
    		}
    		return words;
    	}
     
    	public static void main(String[] args) throws IOException {
     
    		List<WordCount> words = searchWords("corpus.txt", "test.txt");
     
    		for (WordCount word : words) {
    			System.out.println(word.getWord() + " = " + word.getCount());
    		}
    	}
    }

    a++

  7. #27
    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
    adiGuba

    j'ai une petite question: je suis en train de bossser les Stream et lambdas de java8. grâce à la méthode inLines(), on peut créér un Stream sur un objet BufferedReader. Pour stocker les Mots clés, on peut rapidement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    final Stream<String>streamTest =  FichierMotsCles.lines();
    final Map<String,Integer> mapMotsCles = streamTest.collect(Collectors.toMap(s -> s, s -> 0));
    idem pour le stream sur le corpus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Stream<String>streamCorpus =  FichCorpus.lines();

    L'obtention avec le bon filter (ex: filter(s -> s.contains("pipo))) (lambdas simple qui ne correspond pas complètement au cas de la discussion général) pour un mot clé et son occurrence avec un Collectors se fait sans trop de problème. Par contre, je sèche un peu pour réaliser tout le traitement en un seule ligne de code du style:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       Map<String, Long> ResMotsCles = streamCorpus.filter(??).flatMap(???).collect(Collectors.groupingBy(String::toString,Collectors.counting()));
    Dans le but aussi d'utiliser parallelStream().


    Si tu as une idée, une piste.

    Merci d'avance.

  8. #28
    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 plawyx Voir le message
    Si tu as une idée, une piste.
    Ta piste est bonne : il faut bien utiliser collect() !
    Par contre c'est trop spécifique, et tu ne trouveras pas de Collector tout fait, et il faudra coder le tiens ou le créer via Collector.of().
    Bref ca tiendra pas en une ligne





    Un Collector simple peut se composer de trois fonctions :
    • Le supplier qui va créer les objets de codans lequel seront stocké les données (Map<String,Integer> dans notre cas).
      Je dis bien les objets car en parallèle plusieurs Map<String,Integer> pourront être créées (j'y reviens plus bas).
    • Un accumulator, qui consiste à prendre les données brutes (une ligne du fichier dans notre cas), pour l'insérer dans l'objet de collecte (la Map).
      Dans notre cas c'est cette méthode qui devra compter les occurrences des mots pour renseigner la Map...
    • Un combiner, qui consiste à combiner les données de deux collectes en un seul objet.
      Dans notre cas cela consistera donc à fusionner deux Map<String,Integer> en une seule.
      Pourquoi cela ? Pour l'exécution parallèle !
      Lorsqu'on exécute la collecte en parallèle, chaque thread aura sa propre Map qu'il renseignera petit à petit (sans soucis de synchronisation du coup).
      Et à la fin le combiner sera utiliser pour regrouper les données...



    Au final cela pourrait donner quelque chose comme cela :
    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
    public class Main {
     
        public static void main(String... args) throws Exception {
            // On lit chaque ligne du fichier des mots dans une liste.
            // On peut directement passer par readAllLines()
            // (pas besoin de Stream)
            List<String> keywords = Files.readAllLines(Paths.get("test.txt"));
     
            // On lit le fichier content le texte :
            try (BufferedReader br = Files.newBufferedReader(Paths.get("corpus.txt"))) {
                // On traite le fichier ligne par ligne, via l'API de Stream
                // Et on utilise un Collector pour obtenir le résultat :
                Map<String, Integer> result = br.lines()
                        .collect(Collector.of(
                                HashMap::new, // Supplier
                                (map, line) -> accumulate(keywords, map, line),  // Accumulator
                                Main::combine) // Combiner
                        );
     
                // On affiche le résultat
                result.forEach((k, v) -> System.out.println(k + " = " + v));
            }
        }
     
        /**
         * Méthode permettant de compléter la map avec le nombre d’occurrence des mots.
         * 
         * @param keywords La liste des mots-clef à rechercher.
         * @param map La map à compléter.
         * @param text Le texte à analyser.
         */
        private static void accumulate(Iterable<String> keywords, Map<String, Integer> map, String text) {
            // Pour chacun des mots de notre liste :
            for (String word : keywords) {
                // On compte le nombre d'occurence du mot dans le texte :
                int count = scan(text, word);
                    // Et on ajoute cela dans la Map
                // merge() permet de gérer le cas où la Map comporte déjà une valeur.
                map.merge(word, count, Integer::sum);
            }
        }
     
        /**
         * Méthode permettant de regrouper les données de deux map en une seule.
         */
        private static Map<String, Integer> combine(Map<String, Integer> map1, Map<String, Integer> map2) {
            map2.forEach((k, v) -> {
                map1.merge(k, v, Integer::sum);
            });
     
            return map1;
        }
     
     
        // J'ai copié/collé et un peu adapté le code de la méthode scan() posté plus haut,
        // Pour compter le nombre d’occurrence d'un mot dans un texte :
        private static int scan(String text, String word) {
            final int len = word.length();
            int startIndex = 0;
     
            int count = 0;
            // On recherche l'index de l'occurence suivante du mot :
            while ((startIndex = text.indexOf(word, startIndex)) >= 0) {
                int endIndex = startIndex + len;
                // On vérifie que le caractère précédent ne soit pas une lettre :
                boolean prevCharIsOK = (startIndex == 0)
                        || !Character.isLetter(text.charAt(startIndex - 1));
                // On vérifie que le caractère suivant ne soit pas une lettre :
                boolean nextCharIsOK = (endIndex == text.length())
                        || !Character.isLetter(text.charAt(endIndex));
     
                // Si les caractères précédent et suivant sont correct :
                if (prevCharIsOK && nextCharIsOK) {
                    // on incrémente le compteur :
                    count++;
                }
                // puis on incrémente l'index pour passer à la suite :
                startIndex += len;
            }
            return count;
        }
    }


    A noter qu'on peut améliorer un peu plus notre Collector en spécifiant qu'il n'est pas ordonné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        .collect(Collector.of(
                                HashMap::new, // Supplier
                                (map, line) -> accumulate(keywords, map, line),  // Accumulator
                                Main::combine, // Combiner
                                Characteristics.UNORDERED)
    En effet dans notre cas l'ordre des données importe peu, puisque la lecture d'une ligne avant ou après l'autre n'aura aucun impact sur le résultat final.
    En déclarant notre collector comme UNORDERED, on dit à la méthode collect() qu'elle n'a pas à se soucier de respecter l'ordre des données...



    a++

  9. #29
    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
    Citation Envoyé par adiGuba Voir le message
    [list][*] Tu oublies toujours de libérer les ressources, soit via des try/finally (Java 6 et inférieur), soit via un try-with-ressource (à partir de Java 7).
    Cela peut paraitre anodin dans une application avec une si courte durée de vie, mais si tu inclus ton code dans une application qui va tourner plus longtemps (comme un serveur par exemple), cela risque de poser divers problèmes difficile à déceler.
    oui oui J'ai modifié le code et j'ai ajouté le try/finally
    et pour le code que tu m'a envoyé , il est très intéressant et je vais l'exploiter prochainement
    Grand merci

  10. #30
    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
    Citation Envoyé par plawyx Voir le message
    Une Map<String,Integer> est plus adapter à ton problème. Les mots clés seront les clés de ta Map et les valeurs seront les occurrences que tu incrémenteras par le résultat de StringUtils.countMatches
    J'ai essayé de tester le code avec la totalité de corpus pour voir à quel point je dois le modifier , l'autre fois , il a resté des Jours à tourner sans résultat, cette fois , il a resté 2 heures et il a donné de résultats et j'ai atteint le but désuré
    Pour l'utilisation de Map , j'ai la pas utilisé cette fois , mais je suis sure que je vais l'utiliser dans mon prochain code et j'ai noté tous vos remarques et je vais les prendre en considération
    Vraiment vous m'avez donné la motivation d'améliorer mes compétences
    Merci plawyx
    Merci à Vous tous, surtout de votre patience avec moi
    Vous êtes super

  11. #31
    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
    Citation Envoyé par Wim88 Voir le message
    Pour l'utilisation de Map , j'ai la pas utilisé cette fois
    La fonction de la Map est d'associer 1 objet qui représente un contenu à un objet qui représente un identifiant. Ca permet de chercher beaucoup plus rapidement que dans une liste l'objet à partir de son identifiant. Le cas d'école, c'est la base de données dans laquelle tu inseres tes villes. La base attribue un ID à chaque ville. Tu mets dans la Map toutes tes villes en utilisant comme identifiant l'ID. Et quand tu fais un traitement sur l'une d'elles, tu va les recuperer via l'ID.
    Mais dans ton cas, la liste de mots a vocation à etre parcourue dans l'ordre à chaque fois. La liste est donc bien plus adaptée.

    Concernant ton probleme, si tu as fait tout ce qu'il a été dit, c'est difficile de faire mieux simplement. Apres, si tu as beaucoup de mots, il y a la solution d'essayer de ne pas parcourir chaque ligne de ton fichier pour chaque mot. Par exemple en stockant tes mots dans une structure de type arbre. Mais bon, c'est pas le meme niveau de complexité. Pour qu'un algo s'execute plus vite, c'est souvent un compromis entre complexité/consommation mémoire. A voir si tu as besoin de ca...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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