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
au niveau de la fonction main()
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>();
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
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 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); } } }
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
Partager