Je dois implémenter la formule actuelle. C’est pour scorer les nœuds dans une taxonomie. Fondamentalement, le score d’un nœud dépend de la quantité de nœuds enfants et leurs scores ( (nodes(h+1))
sont la quantité de nœuds du niveau suivant et Cl(concept)
est un ensemble d’enfants).
Dans mon cas, les fréquences de terme ne sont définies que pour les feuilles à partir de maintenant. J’ai mis en œuvre une implémentation, mais le problème est que lorsqu’il y a 2 enfants pour le nœud, l’implémentation passe alors d’un côté.
Pour une taxonomie donnée:
1 / \ 2 3 | | 4 17 / \ 11 13
les fréquences sont données: freq(11) = 3
, freq(13) = 5
et freq(17) = 10
. Lorsque j’essaie d’obtenir le score pour node(1)
, le résultat est 0.0
, car la récursivité ne va pas dans node(4)
descendant, elle ne récupère que freq(17)
et le tour est joué. Normalement, le résultat devrait être 7.
Voici l’implémentation:
public static float calcScore(int keyID, Map frequencies, Map subTaxonomy) { float res = 0f; int nodes = 0; if (frequencies.containsKey(keyID)) { return frequencies.get(keyID) + 0f; } for (Map.Entry entry : subTaxonomy.entrySet()) { if (entry.getValue() - 1 == subTaxonomy.get(keyID)) { nodes++; res += calcScore(entry.getKey(), frequencies, subTaxonomy); } } return 1 / nodes * res; }
REMARQUE:
subTaxonomy
– stocke le nodeID et son niveau dans la taxonomie
frequencies
– stocke les fréquences pour les nœuds feuilles.
J’ai aussi créé un extrait chez Ideone: Source
Comment dois-je éditer le code, afin qu’il traverse les enfants pour un nœud donné?
METTRE À JOUR
Alors maintenant, dans le source mis à jour, il traverse toute la taxonomie, mais le résultat est toujours 0.0.
Votre problème est situé à cette ligne de code
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
La partie gauche de votre arbre ne contient pas votre convention voulant que l’ childs id
l’ childs id
(qui n’est pas une feuille de l’arbre) suit la formule. childs id = parents id - 1
Je suggérerais de modifier votre implémentation en incluant l’ parents id
dans votre taxonomie au lieu du node level
du node level
. Le niveau peut être compté pendant le recours et passé comme autre paramètre.
La nouvelle signature peut ressembler à ceci:
public static float calcScore(int keyID, Map frequencies, Map subTaxonomy, int level)
De plus, vous pouvez envisager de supprimer les informations de level
de votre code si elles ne consortingbuent pas à votre résultat final!
Copie de la réponse du PO qui a été publiée dans la question
MÉTHODE CORRECTE
public static float calcScore(int keyID, Map frequencies, Map subTax) { float res = 0f; int nodes = 1; if (frequencies.containsKey(keyID)) { return frequencies.get(keyID) + 0f; } for (Map.Entry entry : subTax.entrySet()) { if (entry.getValue() == keyID) { res += calcScore(entry.getKey(), frequencies, subTax); nodes++; } } nodes--; return (float)1 / nodes * res; }
REMARQUE
subTax
– est la carte contenant (child_id, parent_id)