上一篇:Oracle DBA学习笔记 - 下一篇:用Devel::SmallProf测量Perl函数的执行时间
版权声明:可以任意转载,但转载时必须标明原作者charlee、原始链接http://tech.idv2.com/2006/10/03/tagcloud-algorithm/以及本声明。
Weighted Categories 这个插件经过修改之后可以用来显示 TagCloud。 但是这个插件显示出的 TagCloud 总觉得有点别扭。一般人都是擅长某几个方面,很少样样精通的, 因此一般的博客总是会出现几个文章数非常多的标签,以及大量仅有一两篇文章的标签。 而 Weighted Categories 插件使用四则运算来计算标签的大小(附图公式(1)),结果就造成几个巨大标签混杂在大量的小标签中的 “众星捧月”的现象。
例如,假设有四个标签,文章数分别为 tagA=100、tagB=10、tagC=5、tagD=1,标签级别为 1~10,则各个标签的级别如下:
| 标签 | 文章数 | 计算式 | 级别 |
| tagA | 100 | 100 / 99 * 9 + 1 | 10 |
| tagB | 10 | 10 / 99 * 9 + 1 | 1 |
| tagC | 5 | 5 / 99 * 9 + 1 | 1 |
| tagD | 1 | 1 / 99 * 9 + 1 | 1 |
显然,由于tagA的存在,其他标签都被挤到了最底层。
解决这个问题的方法就是利用对数函数。(对数函数的效果可见本文。) 计算公式见附图公式(2)。
公式(2)的结果与对数的底是无关的,见公式(3)。
用公式(2)计算上例得到下面的结果:
| 标签 | 文章数 | 计算式 | 级别 |
| tagA | 100 | log(100) / (log(100)-log(1)) * 9 + 1 | 10 |
| tagB | 10 | log(10) / (log(100)-log(1)) * 9 + 1 | 5 |
| tagC | 5 | log(5) / (log(100)-log(1)) * 9 + 1 | 4 |
| tagD | 1 | log(1) / (log(100)-log(1)) * 9 + 1 | 1 |
显然这个结果要比原来的结果漂亮多了。

2008-09-21 20:20
谢谢。我发现这个算法确实有点问题了。似乎是从最一开始的四则运算就有问题。
试试这样行不行?
lvl = (lgn - lgNmin) / (lgNmax - lgNmin) * (Lmax-Lmin) + Lmin

2008-09-21 05:32
站长好,我用了很久你这篇文章中提到的 Tag 显示算法,但是今天发现一个小问题,某些时候产生的 level 值可能会超过预设的最大 level 值,以文中的例子,如果 Nmax = 3,Nmin = 2,此时算出来的 level 就是 log(3) / (log(3)-log(2)) * 9 + 1 = 25.4 > 10 了。因此或许应该在得到 level 后再做判断,如果大于最大 level 值,则再除以它。