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

Entrée/Sortie Java Discussion :

Suppression d'une liste mots contenus dans un fichier txt " A" du fichier txt "B"


Sujet :

Entrée/Sortie Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut Suppression d'une liste mots contenus dans un fichier txt " A" du fichier txt "B"
    Bonjour,

    Comme indiqué dans le titre, je suis en train d'écrire une fonctionnalité qui prend en entrée 2 fichiers .txt en java avec Eclipse
    - "F1" fichier avec notre texte à traiter(fichier nommé "intel.txt" dans notre cas).
    - "F2" fichier avec une liste de stopwords ("stopwords.txt") dont il faut supprimer toutes les occurrences dans F1.
    Crée en sortie un fichier(exercice pas prioritaire)
    - "F3" nouveau fichier créé dans un repertoire(quelconque) et contenant le nouveau texte traité sans les stopwords.
    Avec ce code j'arrive à supprimer les mots de la stoplist mais le pb qui persiste est le suivant:

    1*) Le traitement s’arrête lorsqu'il y a retour à la ligne (limite de la fonction readLine?)
    2*) Un problème sur la lecture du résultat qui se répéte- certainement dû aux boucles "for" emboîtées.
    3*)La suppression se fait une fois dans le texte pour chaque stopword et le texte entier est recopié pour la suppression du stopword suivant sans prise en compte de la suppression précédente.

    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
     
    import java.io.*; 
    import java.util.*;
    import java.util.regex.*;
     
    public class Parse {    
        public static void main(String[] args) {
     
        ArrayList<String> wordsList = new ArrayList<String>();
        String sCurrentLine;
        ArrayList<String> stopwords = new ArrayList<String>() ;
     
            try{            
                BufferedReader stoplist= new BufferedReader(new FileReader("stoplist.txt"));
                  while ((sCurrentLine = stoplist.readLine()) != null){
                    stopwords.add(sCurrentLine);                            
                  }         
                    BufferedReader text=new BufferedReader(new InputStreamReader(new FileInputStream("intel.txt")));
                    String line = text.readLine();
                    String s= line;
                    StringBuilder builder = new StringBuilder(s);
                    String[] words = builder.toString().split("\\s");
                    for (String word : words){
                        wordsList.add(word);
                    }
                 System.out.println(wordsList);
                 System.out.println(stopwords);                  
     
                 for ( String a : wordsList) {
                     List<String> list = Arrays.asList(a);
                     CharSequence[] seq = list.toArray(new CharSequence[list.size()]);
     
                     for ( String stp : stopwords){
                         StringBuffer sb = new StringBuffer();
                         for (int y =0; y <seq.length ;y++){
                             Pattern p = Pattern.compile(stp);
                             Matcher m = p.matcher( seq[y] );
                            while (m.find()) {
                                 m.appendReplacement(sb, " ");    /*On remplace le stopword trouvé par un espace[" "] pour ne pas fausser l'incrément*/
                             }
                         m.appendTail(sb);  
                         }
                         System.out.println(sb.toString());        
                     }
                 }
               text.close();
               stoplist.close();
            }   
            catch(Exception ex){
                System.out.println(ex);
            }
        }    
    }
    JE vous remercie de votre précieux soutien.
    PS: le fichier "intel.txt" contient: ' to be or not to be that is the question '
    le fichier "stopwords.txt " contient: ' not be to the ' sous forme de Liste (pas forcément dans le même ordre que dans le texte).

  2. #2
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Pour lire le contenu d'un fichier, utilise les fonctions Java7 !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<String> Files.readAllLines(Path path, Charset cs)
    Tu évite comme ça de devoir gérer toi même les ouvertures fermetures.
    En faisant ça, tu peux charger directement tous les mots à remplacer

    Tu peux ensuite lire tes autres fichiers de la même façon et faire du remplacement ligne par ligne.

    Pour le remplacement dans ton fichier, plutôt que de passer par les Pattern et Matcher, tu peux aussi utiliser un String.replaceAll qui fait exactement la même chose (mais en plus simple)


    Et pour écrire un fichier depuis une liste de ligne, tu as aussi une méthode dans Files
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Files.write(Path path,
             Iterable<? extends CharSequence> lines,
             Charset cs,
             OpenOption... options)
    Files est ton ami !
    http://docs.oracle.com/javase/7/docs...ile/Files.html


    Sinon, quand tu as une liste de String, tu es pas obligé de le transformer en CharSequence, c'est implicite (vu qu'un String EST UN CharSequence)

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Merci de ta réaction eulbobo
    En effet c est beaucou plus efficace!
    MAis apres ouverture et lecture des fichiers aurais tu une idée de comment supprimer les stopwords?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Je vais tester le replaceAll. (désolé je ne l avais pas vu)

  5. #5
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par Jibejay Voir le message
    Merci de ta réaction eulbobo
    En effet c est beaucou plus efficace!
    MAis apres ouverture et lecture des fichiers aurais tu une idée de comment supprimer les stopwords?

    Après chaque lecture de fichier, tu vas te retrouver avec deux List<String>
    La première contiendra les stopwords et la deuxième le texte à assainir (chaque String contenant une ligne dans le fichier texte d'origine)

    La solution bourrine qui me vient est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Créer une List<String> qui sera la liste des lignes de sortie
    Faire une boucle pour parcourir l ensemble des lignes du texte à assainir
        stocker dans une string locale la ligne courante (ligneLocale)
        faire une boucle sur les stopwords (variable currentStopWord)
             pour chaque stopword, ligneLocale = ligneLocale.replaceAll(currentStopWord, " ")
        fin de la boucle
        stocker la variable ligneLocale dans la troisième liste
    fin de la boucle
    Tu as 3 listes : une avec le texte d'origine, une avec le texte assaini, une avec les stopwords

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Comment ecrirais tu la boucle qui parcours les lignes j ai essayé avec:
    for(String s: text)
    avec text de type List<String> mais ca ne marche pas.

  7. #7
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Attention tout de même avec le replaceAll(). Si on a par exemple dans les stopwords le mot "la", et qu'on remplace tous les la par une espace, la phrase "La labradorite est la pierre préférée de ma lavandière tandis que le lapis-lazuli est la pierre préférée de mon boulanger." deviendra "La bradorite est pierre préférée de ma vandière tandis que le pis- zuli est pierre préférée de mon bou nger." !

    On peut s'en sortir en découpand le texte à traiter en mots (mais il faut conserver les séparateurs dans un coin pour reconstituer le texte final), et en utilisant un in dans le set (en appliquant un toLoweCase() par exemple pour traiter la casse), ou alors utiliser une expression régulière plus élaborée que le stopword seul.

    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
    final Set<String> stopwords = new HashSet<>();
    stopwords.add("la");
     
    String sentence = "La labradorite est la pierre préférée de ma lavandière tandis que le lapis-lazuli est la pierre préférée de mon boulanger.";
     
    String replaceAllSentence = sentence;
    for(String stopWord : stopwords) {
        replaceAllSentence = replaceAllSentence.replaceAll( stopWord, " ");
    }
    System.out.println(replaceAllSentence);
     
    for(String stopWord : stopwords) {
       sentence = sentence.replaceAll( "(?i)(?<!\\S)("+stopWord+"(?!\\S))", " ");
    }
    System.out.println(sentence);

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jibejay Voir le message
    Comment ecrirais tu la boucle qui parcours les lignes j ai essayé avec:
    for(String s: text)
    avec text de type List<String> mais ca ne marche pas.
    Il n'y a pas de raison que ça ne fonctionne pas : quel est le code complet (parce que ce n'est pas le for le problème, quel qu'il soit) ?

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    @ joel.drigo

    Je suis en train de remplir la boucle, je vous tiens au courant.
    Et merci pour La pertinente remarque sur les replaceAll

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    @eulbobo et joel.drigo
    Je vous remercie encore de votre pertinence et votre reactivité
    Le code s'execute normalement et fonctionne pour des fichier court mais des que je charge un fichier txt d'environ 30 kOctets
    J ai cette erreur à l'éxécution:
    java.lang.IndexOutOfBoundsException: Index: 497, Size: 17

    Le code final est le suivant:
    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
     
    import java.util.*;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
     
    public class jb {
     
    	public static void main(String[] args) {
     
    		try{	
    			Path text_path = Paths.get("C:/Users/JB/workspace","china.txt");
    			Path stoplist_path = Paths.get("C:/Users/JB/workspace","nonWords.txt");
     
    			Charset charset = Charset.forName("utf-8");
    			List<String> text = Files.readAllLines(text_path, charset);
    			List<String> stoplist = Files.readAllLines(stoplist_path, charset);
     
    			System.out.println(text);      			
    			//System.out.println(stoplist);      			
    			//System.out.println(stoplist.size());      			
     
     
    			int k = text.size();
    			for (int i=0 ; i < k ; i++) {
    			List<String> resultat= new ArrayList<String>();
    	         String ligne_locale = text.get(i); 
    	         //System.out.println(ligne_locale);
    		         for (String stp: stoplist) {
    		        	 ligne_locale =  ligne_locale.replaceAll("(?i)(?<!\\S)("+stp+"(?!\\S))", "");
     
    				resultat.add(ligne_locale);
    				}System.out.println(resultat.get(k));
    			}
    		}   
    		catch(Exception ex){
    	        System.out.println(ex);
    	    }
    	}	
    }
    Sauriez vous à quoi celà est-il du? à la taille je dirais mais j 'arrive à lire tout le fichier sur Eclipse avant la supression des mots donc ca ne semble pas etre un pb de mémoire...

  11. #11
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    je reprend ton code et je commente un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	int k = text.size();
    	for (int i=0 ; i < k ; i++) { // pourquoi pas ça plutot  : for (String ligne_locale : text) {
    		 List<String> resultat= new ArrayList<String>(); // la tu recrées ta liste de résultat pour chaque ligne de texte, à sortir
    		 String ligne_locale = text.get(i); 
    	       	  for (String stp: stoplist) {
    	       		  ligne_locale =  ligne_locale.replaceAll("(?i)(?<!\\S)("+stp+"(?!\\S))", "");
    			 resultat.add(ligne_locale); // tu vas ajouter ta ligne avec remplacement pour chaque stopword de ta liste là
    		 }
    		System.out.println(resultat.get(k)); // ton exception vient de là, parce que la première fois, ta liste est vide et tu essayes d'accéder à ta variable k (qui ne change pas)
    	}

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Plus concretement ces fichier:
    nonWords.txt pour les stopwords
    et china.txt pour le texte

  13. #13
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    @eulbobo
    1- quand tu mets sortir du veux dire sortir de la boucle?
    2- je ne vois vraiment pas comment resoudre le problème de l'affichage même si j ai compris l erreur.si tu peux me réécrire le code que tu suggere stp?
    3- est ce que ca change grand chose d'utiliser le for each? J essaierai de l'optimiser quand le code marchera
    Et encore merci!
    Desolé si j ai pris du temps à reagir j avais un impératif...

  14. #14
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Quand @eulbobo parle de "sortir", il parle de mettre la déclaration de l'ArrayList en dehors de la boucle. En effet, resultat est le résultat global de tout le traitement de toutes les lignes, traitement fait par la boucle for qui parcourt toutes les lignes. Il est donc nécessaire d'avoir cette variable en dehors de cette boucle.

    Ensuite, tu ajoutes ligne_locale à la liste de résultat dans la boucle qui parcourt les stopwords. Donc, tu devrais te rendre compte que, logiquement, tu vas te retrouver avec autant de lignes dans resultat qu'il y a de stopwords. Alors que ce que tu veux c'est retrouver à la fin de tout le traitement 1 fois chaque ligne dans resultat, une fois chaque ligne dans laquelle on a remplacé chaque stopword.

    Tu devrais maintenant en déduire pourquoi System.out.println(resultat.get(k)); cause une IndexOutOfBoundException. k est le nombre de lignes, alors que resultat contient autant de lignes qu'il y a de stopwords. Tu demandes l'élément de position k (nombre de lignes) dans une liste dont le nombre est un nombre de mots à exclure. Non seulement il y a un problème de logique (les lignes et les mots à exclure sont deux choses différentes), mais en plus, ça ne causera pas d'exception qu'à condition qu'il y ait plus de stopwords que de ligne dans le texte ! De toute manière, une règle de base, un réflexe même : s'il y a k éléments dans une liste, l'élément de position k n'existe pas en Java (les indices vont toujours de 0 à k-1 pour les List). C'est également vrai pour les tableaux en Java. Donc dès que tu écriras à l'avenir list.get(k) ou array[k], ou k est respectivement list.size(), ou array.length, tu peux tout de suite arrêter et te dire qu'il y a quelque chose qui ne va pas dans ton code.

    Pour le foreach au lieu du for, c'est toujours un peu mieux quand tu n'as pas besoin de l'index :

    • le code est plus concis ;
    • tu n'as pas besoin de déclarer une variable supplémentaire inutile (i); et encore moins besoin de k. Plus de variables est souvent synonyme de plus de problème, en particulier quand on débute (avec le foreach, pas de risque de faire trop d'itérations, ou pas assez,). D'ailleurs sans k, tu n'auras même pas été tenté d'écrire System.out.println(resultat.get(k));. Tu te serais dit "mais comment j'affiche le résultat intérmédiaire pour ma ligne actuelle ?" et tu auras fini par te dire "ah, mais c'est ligne_locale !"
    • A noter qu'en Java 8, il y a également les streams qui offrent en plus d'autres avantages, mais tu auras l'occasion de voir ça plus tard...

  15. #15
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    @eulbobo et joel.drigo

    OUf!!!! C'etait dur mais j ai enfin compris
    C'etait ma premiere journée dans le forum et j ai réussi à regler un pb qui me taraude depuis quelques jours!!
    Merci merci et encore merci!
    Bonne continuation.

    Javament Votre
    Je mets résolu!
    PS: le programme pour ceux qui en auront besoin à l'avenir:
    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
     
    import java.util.*;
    import java.nio.charset.Charset;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
     
    public class jb {
     
        public static void main(String[] args) {
     
            try{    
                Path text_path = Paths.get("text.txt");
                Path stoplist_path = Paths.get("C:/Users/JB/workspace","stoplist.txt");
     
                Charset charset = Charset.forName("utf-8");
                List<String> text = Files.readAllLines(text_path, charset);
                List<String> stoplist = Files.readAllLines(stoplist_path, charset);
     
                //System.out.println(k);                  
                List<String> resultat= new ArrayList<String>();
                for (String line : text) {
                 String ligne_locale = line; 
                // System.out.println(ligne_locale);
                     for (String stp: stoplist) {
                         ligne_locale =  ligne_locale.replaceAll("(?i)(?<!\\S)("+stp+"(?!\\S))", "");
                    }
                    resultat.add(ligne_locale);
                }
                System.out.println(resultat);
            }   
            catch(Exception ex){
                System.out.println(ex);
            }
        }    
    }
    Bonne soirée!

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    je reprend ton code et je commente un peu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	int k = text.size();
    	for (int i=0 ; i < k ; i++) { // pourquoi pas ça plutot  : for (String ligne_locale : text) {
    		 List<String> resultat= new ArrayList<String>(); // la tu recrées ta liste de résultat pour chaque ligne de texte, à sortir
    		 String ligne_locale = text.get(i); 
    	       	  for (String stp: stoplist) {
    	       		  ligne_locale =  ligne_locale.replaceAll("(?i)(?<!\\S)("+stp+"(?!\\S))", "");
    			 resultat.add(ligne_locale); // tu vas ajouter ta ligne avec remplacement pour chaque stopword de ta liste là
    		 }
    		System.out.println(resultat.get(k)); // ton exception vient de là, parce que la première fois, ta liste est vide et tu essayes d'accéder à ta variable k (qui ne change pas)
    	}
    Une dernière question..:comment rendre la stoplist(liste de stopwords) insensible à la casse?
    c à dire: supprimer du texte le mot "Java" ou"java" ou 'JAVA" meme si il n y a que "java sur la stoplist???
    Merci d'avance.

  17. #17
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par Jibejay Voir le message
    Une dernière question..:comment rendre la stoplist(liste de stopwords) insensible à la casse?
    HAHA...
    Toi tu commences à mettre le doigt dans les trucs sales :p

    Alors, il existe plusieurs manière de faire de la comparaison de chaîne de manière case insensitive, mais elle ne fonctionnent pas toutes de la même façon.
    Dans ton cas, tu veux faire du remplacement de chaine, donc tu n'as pas de manière simple de faire vu que tu veux conserver la casse d'origine du mot.

    En effet, la technique la plus simple consiste à tout passer en majuscules (phrase et mots clés) et de faire la suppression avec replaceAll
    Problème : ça détruit la casse de toute la ligne d'un coup.
    Autre problème : dans certains cas, le upperCase (ou le lowerCase) ne permet pas d'obtenir des résultats cohérents (typiquement avec les caractères accentués).


    Donc dans ton cas, il va falloir changer la logique.
    Tu gardes la logique pour récupérer les lignes de texte et de stopwords, sauf que les stopwords, tu les récupères en majuscule (ou en minuscule, comme tu veux)
    La ligne récupérée, tu la mets en majuscule dans une AUTRE variable (on va l'appeller ligneUpper)
    Dans ligneUpper, tu recherches le premier index de ton premier mot clé, tu le stockes, et tu supprimes le premier mot clé (avec replace, pas replaceAll)
    Tu recommences jusqu'à ce que tu n'ai plus de correspondance

    Quand tu n'as plus de correspondances, tu te retrouves avec une liste qui contient les index de début du premier mot clé. Il te faut alors supprimer dans la chaine initiale tous les mots clés dont tu connais l'index (et la taille) avec des substring


    Et tu recommences pour chaque mot
    Puis pour chaque ligne


    Ca va être nettement plus long et plus chiant à tester, mais je ne vois pas trop comment tu pourrais faire autrement.
    Niveau algo, il y a surement plus simple, mais globalement, tu va devoir beaucoup manipuler de chaine de caractères

    Note qu'il existe surement des libraires qui savent faire ça (genre StringUtils de apache commons, mais pas sûr)

  18. #18
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 889
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 889
    Points : 6 633
    Points
    6 633
    Par défaut
    Une dernière question..:comment rendre la stoplist(liste de stopwords) insensible à la casse?
    C'est déjà le cas. (?i) dans "(?i)(?<!\\S)("+stp+"(?!\\S))" est un modificateur qui indique que la casse doit être ignorée.

  19. #19
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    C'est déjà le cas. (?i) dans "(?i)(?<!\\S)("+stp+"(?!\\S))" est un modificateur qui indique que la casse doit être ignorée.
    *se couchera moins con ce soir*

  20. #20
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 11
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par eulbobo Voir le message
    HAHA...
    Toi tu commences à mettre le doigt dans les trucs sales :p

    Alors, il existe plusieurs manière de faire de la comparaison de chaîne de manière case insensitive, mais elle ne fonctionnent pas toutes de la même façon.
    Dans ton cas, tu veux faire du remplacement de chaine, donc tu n'as pas de manière simple de faire vu que tu veux conserver la casse d'origine du mot.

    En effet, la technique la plus simple consiste à tout passer en majuscules (phrase et mots clés) et de faire la suppression avec replaceAll
    Problème : ça détruit la casse de toute la ligne d'un coup.
    Autre problème : dans certains cas, le upperCase (ou le lowerCase) ne permet pas d'obtenir des résultats cohérents (typiquement avec les caractères accentués).


    Donc dans ton cas, il va falloir changer la logique.
    Tu gardes la logique pour récupérer les lignes de texte et de stopwords, sauf que les stopwords, tu les récupères en majuscule (ou en minuscule, comme tu veux)
    La ligne récupérée, tu la mets en majuscule dans une AUTRE variable (on va l'appeller ligneUpper)
    Dans ligneUpper, tu recherches le premier index de ton premier mot clé, tu le stockes, et tu supprimes le premier mot clé (avec replace, pas replaceAll)
    Tu recommences jusqu'à ce que tu n'ai plus de correspondance

    Quand tu n'as plus de correspondances, tu te retrouves avec une liste qui contient les index de début du premier mot clé. Il te faut alors supprimer dans la chaine initiale tous les mots clés dont tu connais l'index (et la taille) avec des substring


    Et tu recommences pour chaque mot
    Puis pour chaque ligne


    Ca va être nettement plus long et plus chiant à tester, mais je ne vois pas trop comment tu pourrais faire autrement.
    Niveau algo, il y a surement plus simple, mais globalement, tu va devoir beaucoup manipuler de chaine de caractères

    Note qu'il existe surement des libraires qui savent faire ça (genre StringUtils de apache commons, mais pas sûr)
    Haha on en veut tjrs un peu plus ;p
    Etourdi que je suis, je me suis même pas rendu compte que c 'était pris en compte Merci! CosmoKnacki
    joel.drigo a fait d'une pierre 100 coup! est parfait!
    Encore merci les amis!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/08/2012, 10h24
  2. suppression d'une liste de mots
    Par kaninama dans le forum Langage
    Réponses: 17
    Dernier message: 27/02/2007, 09h03
  3. a jour ou suppression a une liste deroulante
    Par kouame berenger aymar dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 03/12/2005, 08h06
  4. Réponses: 2
    Dernier message: 26/11/2005, 13h44
  5. [Regex][Avis] Méthode de suppression d'une liste de mots
    Par manal dans le forum Collection et Stream
    Réponses: 22
    Dernier message: 15/10/2005, 00h39

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