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

Collection et Stream Java Discussion :

Comparer 2 documents textes - Map


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut Comparer 2 documents textes - Map
    Bonjour bonjour

    Alors voila, j'ai un ptit soucis pour un programme que je dois ecrire. On me demande d'ecrire un programme qui compare la similarité de 2 fichiers textes en "mappant" l'occurence de chaque mot qui y apparait, les clés étant les mots et les valeurs le nombre de fois que chaque mot apparait

    Donc un truc du genre ("bateau" , "3").

    Alors je comprends bien le principe de la map mais pour être franc, je ne sais pas quoi ecrire comme code pour l'implémenter On a quelques exemples mais qui se limitent à des mots et non des fichiers tout entiers! Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Map<String,String> m = new HashMap<String,String>(); 
            m.put("paul", "geneve")
    ...
    ou paul habite-t-il ? 
            System.out.println("paul : " + m.get("paul"));
    Alors voila ma question :

    En supposant que j'ai un repertoire avec 2 fichiers textes quelconques dedans, comment je dis au programme de regarder ce qu'il y a dans le repertoire, de voir les 2 fichiers et de les mapper?

    EDIT : je suppose que je dois passer par un filereader pour qu'il lise le fichier et d'un certaine facon compte les mots non?

    Merci et bon w-e a toutes et à tous!

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Pour regarder les fichiers qu'il y a dans un réperoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    File f=new File("rep");
    File [] fichiers;
    if(f.isDirectory()){
       fichiers=rep.listFiles();
    }
    Ne pas faire une map de <String,String> mais une map de <String,Integer>
    ensuite pour chaque fichier faire :
    - Lire le fichier ligne par ligne ( BufferedReader et FileReader )
    - pour chaque ligne, décomposer en mots ( StringBuilder voir StringTokenizer ou les regex )
    - pour chaque mot : si le mot n'est pas présent dans la map, faire un "add(mot,1) sinon faire un get(mot)++.

    PS : si l'ordre des mots dans les fichiers n'a pas d'importance, ok pour ta méthode. Mainenant si tu souhaites comparer l'égalité absolue de deux fichiers, ta méthode est à mettre à la poubelle. Dis nous ce que tu a déjà fait, les points sur lesquels tu bloques, et essaies d'être un peu plus précis sur le traitement que tu souhaites réaliser.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Ouaip c'est vrai que j'ai pas été super précis

    Bon voila ce que j'ai ecris dans les 5-10 derniers minutes :

    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
     
    import java.util.*;
    import java.io.*;
    import java.util.StringTokenizer.*;
     
    public class DocMap {
     
    	public static void main (String[] args) throws IOException {
     
    		File r1 = new File("./textes/");
    		Map(r1);
    	}
     
    	public static void Map (File r2) throws IOException{
     
    	try {	
    	FileReader fr = new FileReader(r2);
    		BufferedReader br = new BufferedReader(fr);
    		String s = br.readLine();
     
    		String line=null;
    			while ((line=br.readLine())!=null) {
    				StringTokenizer st=new StringTokenizer(line);
    				Map<String,Integer> m = new HashMap<String,Integer>();
    			}
    		}
     
    		catch (IOException e) {
    			System.out.println("Erreur"+e);
    		}
    	}
    }
    Alors le point positif qui m'étonne moi meme, c'est que ça compile (d'habitude y'a toujours un truc qui va pas quelque part). Par contre lors de l'exécution j'ai un problème récurrent quand je tente de lire d'un repertoire sans indiquer les fichiers 1 par 1, c'est que ça me dit "Erreur.java.io.FileNotFoundException .\textes access is denied"...comprends pas pourquoi :/

    Le code que j'ai ecris en haut pour l'instant fait globalement ça :

    je lui donne le path du repertoire avec les fichiers puis je lui dis d'aller a la class Map pour les mapper. Dans Map il fait un filereader, passe chaque ligne en string et decoupe la ligne avec le stringtokenizer pour pouvoir mapper les mots. Mais meme si le code est correct, intuitivement je me dis que il doit pas trouver les fichiers à cause du "access is denied"...

    Alors pour ce qui est de ce qu'on me demande de faire :

    y'a tout d'abord une explication sur ce qu'est la mesure de cosinus (je vais pas l'expliquer dans le detail parce que bon...). En gros, on représente chaque fichier par un vecteur V=(fi) ou fi est la fréquence d'un mot. Puis on mesure le cosinus pour 2 fichiers F1 et F2 avec une jolie petite formule mathématique . Plus le cosinus est proche de 1, plus les documents sont similaires.

    Bref, y'a 3 étapes que je dois réaliser :

    1. Faire une methode java qui fait une map des mots d'un document (ce que je fais avec le code au dessus).
    2. Faire une methode qui calcule le cosinus des 2 map/documents.
    3. Faire une methode qui calcule la similarité puis l'affiche dans une matrice pour tous les documents du repertoire.

    L'importance de l'odre n'est pas mentionnée, ni les fichiers textes a utiliser, mais j'ai encore 5 fichiers textes du TP précédent qui je pense feront tres bien l'affaire.

    Voila, j'ai dis a peu pres tout ce que je peux . Disons que pour l'instant, je veux surtout me concentrer sur la premiere méthode!

    Merci pour avoir lu mon roman ^^

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    C'est un problème de droits sur le FS ton truc :
    - t'es sur que ton répertoire "textes" possède bien l'attribut "???x??x??x" ?
    - tes fichiers ont-ils bien l'attribut "r" avec le compte que tu utilises ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    euh...

    On nous a dis d'indiquer le repertoire avec le new File ("./textes/"), textes etant dans le même repertoire que le programme qui y accède.

    Par contre tu veux dire quoi avec l'attribut "r"?

    Ce que je comprends pas c'est que si je fais un filereader d'un fichier dans le repertoire, j'ai aucun probleme d'acces...

    EDIT : nan mais je comprends pas, je dois faire un truc faux quelque part dans mon programme. Si j'ajoute quelques lignes de codes dans mon main pour qu'il me liste les fichier du repertoire r1, il va bien m'afficher les 5 fichiers textes qui sont dans le repertoire. Donc le probleme se situe la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public static void Map (File r2) throws IOException{
    C'est a partir de la que j'ai le access is denied. Probleme de parametre? Est ce que je lui dis de faire un filereader a partir d'un dossier et c'est ca qui marche pas? galere galere

  6. #6
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Montre-nous l'erreur dans sa totalité.
    Quand je parles de droits d'exécution c'est que je pense que tu fais ça sous un système à base d'unix.
    "drwxrwxrwx" : 1er caractère : "d"=répertoire
    3 caractères suivants = droits du user propriétaire
    3 caractères suivants = droits du groupe
    3 caractères suivants = droits de tous les autres.
    r=autorisé en lecture
    w=autorisé en écritue
    x=autorisé en exécution ( les répertoires doivent posséder ce droit pour que tu puisses entrer dedans ).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Alors voila l'erreur qu'il me donne lorsque j'execute :



    J'ai ajouté ce bout de code pour faire le test de lecture des fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    File r1 = new File("./textes");
    		boolean status = r1.exists();
    		String [] dirListing = r1.list();
     
    		if (r1.isDirectory() && status) {
    			System.out.println(r1+" is a directory");
     
    			for (int i=0;i<dirListing.length;i++) {
    				System.out.println(" "+dirListing[i]);
    			}
    		}
    			else {
    				System.out.println(r1+" is not a directory");
    			}
    donc comme tu vois, je liste les fichier dans le main et il le fait bien lors de l'execution, mais lorsque je renvois a la classe Map avec Map(r1), c'est la que se produit l'erreur parce qu'il ne peut pas lire les fichiers qui sont dans le repertoire.

  8. #8
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Je parie que tu essais de d'ouvrir et lire le répertoire alors que ce sont les fichiers contenus dedans qu'il faut lire.
    Si c'est ça, à la place de "new FileReader(r1)" fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (int i=0;i<dirListing.length;i++) {
       BufferedReader reader=new BufferedReader(new FileReader(dirListing[i]));
       ...
    }

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Salut

    Ouai, je suis sur que c'est ca aussi, je savais pas trop comment y remedier, j'ai essayé de mettre le tableau dirlisting mais je n'ai pas mis la boucle for, j'vais essayer ca, merci!

    N00bitude quand tu nous tiens

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Bon je dois avouer que je comprends de moins en moins ce qui ne marche pas...

    maintenant j'ai droit à (texte1.txt etant le premier des 5 fichiers txt du repertoire) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.io.FileNotFoundException: texte1.txt (The system cannot find de file specified)
    J'ai rajouté un catch pour l'erreur FileNotFound suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    catch (FileNotFoundException notFExc) {
    	       notFExc.printStackTrace();
    	       }
    Qui si je ne me trompe pas liste une suite d'erreures pour en trouver la source, voila ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileInputStream.<init>(Unknown Source)
    at java.io.FileReader.<init>(Unknown Source)
    at DocMap.Map(DocMap.java:39)
    at DocMap.main(DocMap.java:30)
    Voila ce que j'ai aux lignes 30 et 39 :

    -30 : le bout de code qui renvoi le fichier r1 vers la classe Map pour faire le mapping => Map(r1); (voir le code du 3eme post du topic).
    -39 : le bufferedReader br = new BufferedReader(new FileReader (dirLising[i]));

    En gros, il listes les fichiers du repertoire mais ne les trouves pas par la suite...j'ai essayé de tout mettre dans le main pour voir (donc en supprimant la classe Map) meme topo.

  11. #11
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Tu as des problèmes avec les Exceptions, encore pire avec les tableaux... Je suis désolé mais là sur ton problème j'abandonne. Retourne réviser les notions de base du language, ensuite on pourra en discuter
    La gestion des flux se fait après avoir compris les notions que cite plus haut.
    désolé

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Bah ecoutes pas de ma faute si ils savent pas nous apprendre la prog correctement

    D'un coté on a un cours de prog objet qui reprends tout depuis le debut de l'autre on a ce cours d'algorithmes ou on nous demande de savoir faire ce genre de choses. Je sais me débrouiller en java pour lire/ecrire des fichiers, mais je ne sais tout bonnement pas comment dire a un fichu programme de prendre ce qu'il y a dans un dossier et de lire les fichiers lui mêmes.

    Je vois pas trop pourquoi j'ai un problème avec les tableaux en fait?...quand aux exceptions, on les a à peine abordée . Je sais pas si c'est dur à croire mais c'est vrai...


  13. #13
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Bon je fais un effort en te donnant un petit exemple qui affiche le contenu des fichiers contenus dans un rep :
    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
     
    File repertoire=new File("monRepertoire");
    if(!repertoire.isDirectory()){
       System.err.println(repertoire.getAbsolutePath()+" n'est pas un répertoire.");
       System.exit(1);
    }
    File [] listeFichiers=repertoire.listFiles();
    for(int i=0;i<listeFichiers.length;i++){
       if(!listeFichiers[i].isFile()){
          System.out.println(listeFichiers[i].getAbsolutePath()+" n'est pas un fichier, on passe à l'élément suivant.");
       }else{
          System.out.println("On traite le fichier "+listeFichiers[i].getAbsolutePath());
          try{
             BufferedReader reader=new BufferedReader(new FileReader(listeFichiers[i]));
             Sring ligne=null;
             while((ligne=reader.readLine())!=null){
                System.out.println(ligne);
             }
             reader.close();
          }catch(IOException ioe){
             System.err.println("Erreur à la lecture du fichier "+listeFichiers[i].getAbsolutePath()+" : "+ioe.toString());
             ioe.printStackTrace();
          }
       }
    }
    Pour être vraient propre le close devrait être dans un bloc finally, je te laisse consulter la faq pour plus de renseignements.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 51
    Par défaut
    Salut iohack,

    Voulais pas te faire culpabiliser lol . En tout cas merci de trouver la force de me montrer encore comment faire . On est plusieurs à être un peu largué dans ce cours d'algorithmes...

    Bref, encore merci!

    tcho!

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/09/2006, 11h50
  2. [vb6]: inscrire des données dans un document text
    Par gaetan.tranvouez dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 24/07/2006, 12h11
  3. Réponses: 4
    Dernier message: 29/06/2006, 10h09
  4. Document texte sous Oracle
    Par chiheb dans le forum Oracle
    Réponses: 7
    Dernier message: 24/10/2005, 16h33
  5. Enregistrer le resultat d'une requete dans un document texte
    Par nmerydem dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 15/07/2005, 12h32

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