我需要实现当前的公式.它用于对分类中的节点进行评分.基本上,节点的分数取决于子节点的数量及其分数((nodes(h+1))是下一级节点的数量,Cl(concept)是一组子节点).
在我的用例中,术语频率仅定义为现在的叶子.我已经实现了一个实现,但问题是当节点有2个子节点时,实现只会转到一边.
对于给定的分类:
1
/ \
2 3
| |
4 17
/ \
11 13
Run Code Online (Sandbox Code Playgroud)
的频率被给定:freq(11) = 3,freq(13) = 5和freq(17) = 10.当我试图获得分数时node(1),结果是0.0,因为递归不会进入后代node(4),它只检索freq(17)它就是它.通常,结果应为7.
这是实施:
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy) {
float res = 0f;
int nodes = 0;
if (frequencies.containsKey(keyID)) {
return frequencies.get(keyID) + 0f;
}
for (Map.Entry<Integer, Integer> entry : subTaxonomy.entrySet()) {
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
nodes++;
res += calcScore(entry.getKey(), frequencies, subTaxonomy);
}
}
return 1 / nodes * res;
}
Run Code Online (Sandbox Code Playgroud)
注意:
subTaxonomy - 将nodeID及其级别存储在分类中
frequencies - 存储叶节点的频率.
我还在Ideone:Source创建了一个片段
我应该如何编辑代码,以便它遍历给定节点的所有子代?
UPDATE
所以现在,在更新的源代码中,它遍历所有分类法,但结果仍为0.0.
你的问题就出在这行代码
if (entry.getValue() - 1 == subTaxonomy.get(keyID)) {
Run Code Online (Sandbox Code Playgroud)
树的左侧部分不符合您预期的约定,即childs id(不是树的叶子)遵循公式childs id = parents id - 1
我建议更改您的实施,包括parents id分类法中的 ,而不是node level. 可以在递归期间对级别进行计数并作为另一个参数传递。
新签名可能如下所示:
public static float calcScore(int keyID, Map<Integer, Integer> frequencies, Map<Integer, Integer> subTaxonomy, int level)
Run Code Online (Sandbox Code Playgroud)
level此外,如果它对您的最终结果没有贡献,您可以考虑从代码中删除该信息!
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |