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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 ).

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