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 :

calcul de cosinus de similarité à partir des mots dans un fichier texte


Sujet :

Entrée/Sortie Java

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Points : 64
    Points
    64
    Par défaut calcul de cosinus de similarité à partir des mots dans un fichier texte
    Bonjour tout le monde ,

    J'ai essayé de developper un programme qui exécute le calcul de cosinus de similarité d'un mot saisi au clavier à travers l'apprentissage automatique (un corpus) et ça marche
    Maintenant je voudrais appliquer le même traitement , sauf que au lieu de lire un mot du clavier , je souhaite le lire à partir d'un fichier texte (mot sur chaque ligne).
    Le traitement s'exécute , mais il m'affiche des résultat incorrects et je sais pas exactement ou réside le problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private Map<String, Integer> vectDT = new LinkedHashMap<String, Integer>();
        private Map<String, Integer> vectNDT = new LinkedHashMap<String, Integer>();
    au niveau de la fonction main()

    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
    try {
                    while (sc.hasNextLine()) {
                        String chaine = sc.nextLine();
                        String Input = sousChaine(chaine); // elle retourne un chaine après une modification
                        l=gnerationNGrams(l, Input, x);    // retourn e une liste qui contient l'extraction de gram de mot 
                        EV.vecteursDT_NDT(maMatrice, l, Input); // à partir de maMatrice 
                        Double cosDT = EV.calculCosinus(EV.vectDT, EV.occurence(l));
                        Double cosNDT = EV.calculCosinus(EV.vectNDT, EV.occurence(l));
                        if (cosDT > cosNDT) {
                            triCosTest.println(Input + "[DT]" + "\t" + String.valueOf(cosDT) + "\t" + String.valueOf(cosNDT));
                            l.clear();
                        EV.vectDT.clear();
                        EV.vectNDT.clear();
                        } else {
                            triCosTest.println(Input + "[NDT]" + "\t" + String.valueOf(cosDT) + "\t" + String.valueOf(cosNDT));
                        }
                        l.clear();
                        EV.vectDT.clear();
                        EV.vectNDT.clear();
                    }
     
                    triCosTest.close();
                } catch (Exception e) {
                }

    La fonction vecteursDT_NDT: // sert à remplir 2 hashMaps qui présente deux vecteurs
    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
     public void vecteursDT_NDT(Map<String, Matrice> mat, ArrayList<String> list, String mot) {   // declarer deux vecteurs
     
            Matrice m;
            for (String s : list) {
                m = mat.get(s);
                if (m != null) {
                    vectDT.put(s, m.getFq1());
                    vectNDT.put(s, m.getFq2());
                } // si le n-gram n'existe pas j'affecte aux Fq1 et Fg2 la valeur 0
                else {
                    vectDT.put(s, 0);
                    vectNDT.put(s, 0);
                }
            }
     
        }
    La fonction calculCosinus retourne la calcu de cosinus entre deux vecteur donnés :

    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
    public Double calculCosinus(Map<String, Integer> vecteur1, Map<String, Integer> vecteur2) {
            Double similarité = 0.0;
            Double somme = 0.0;	// the numerator of the cosine similarity
            Double norm1 = 0.0;	// Norme du vecteur 1
            Double norm2 = 0.0;	// Norme du vecteur 2
            Set<String> fkeys = vecteur1.keySet();
            Iterator<String> fit = fkeys.iterator();
            while (fit.hasNext()) {
                String gram = fit.next();
                boolean containKey = vecteur2.containsKey(gram);
                if (containKey) {
                    somme = somme + vecteur1.get(gram) * vecteur2.get(gram);
                }
            }
            norm1 = normeVecteur(vecteur1);
            norm2 = normeVecteur(vecteur2);
            similarité = somme / (norm1 * norm2);
            return similarité;
        }

    Un exemple de mot dans le fichier : _bjr_
    le resultat obtenu : 0.5 et 0.8559403390221002
    alors que le resultat souhaité : 0.5773502691896257 et 0.9670913609804876

    Merci de m'aider si c'est possible
    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2008
    Messages : 757
    Points : 572
    Points
    572
    Par défaut
    Hello !

    A tout hasard, avez-vous essayé de faire un trim du mot récupéré ?

    OS : LinuxMint 20

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Points : 64
    Points
    64
    Par défaut
    Bonsoir,

    Je pense que la fonction trim() en java sert à éliminer les éspaces avant et après un mot. Mais, j'ai pas compris ou exactement vous me proposez de l'utiliser !

    En fait , le problème ça existe au niveau du calcul de la norme du deuxième vecteur !
    si je teste la même fnction avec un mot saisie du clavier ça marche correctement
    sinon si je lis je mot à partir du fichier , le resultat du calcul de ce norme ça donne pas de la bonne réponse


    Aidez moi SVP à resoudre ce probléme :/

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

Discussions similaires

  1. Déterminer le nombre d'occurences des mots dans un fichiers texte
    Par fraisa1985 dans le forum Général Java
    Réponses: 13
    Dernier message: 26/10/2021, 01h58
  2. Réponses: 4
    Dernier message: 09/10/2011, 16h17
  3. supprimer des mots dans un fichier
    Par belgariel dans le forum Administration système
    Réponses: 1
    Dernier message: 30/10/2009, 12h01
  4. Recuperer des mots d'un fichier texte
    Par Beyou dans le forum C
    Réponses: 8
    Dernier message: 03/01/2007, 13h28
  5. Comment changer des mots dans un fichier?
    Par ptitbonum dans le forum Linux
    Réponses: 5
    Dernier message: 07/04/2004, 23h42

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