我已经阅读了一堆关于生成标记云权重对数分布的正确方法的教程。他们中的大多数将标签分组为步骤。这对我来说似乎有点傻,所以我根据我读过的内容开发了自己的算法,以便它沿着阈值和最大值之间的对数曲线动态分布标签的计数。这是它在python中的本质:
from math import log
count = [1, 3, 5, 4, 7, 5, 10, 6]
def logdist(count, threshold=0, maxsize=1.75, minsize=.75):
countdist = []
# mincount is either the threshold or the minimum if it's over the threshold
mincount = threshold<min(count) and min(count) or threshold
maxcount = max(count)
spread = maxcount - mincount
# the slope of the line (rise over run) between (mincount, minsize) and ( maxcount, maxsize)
delta = (maxsize - minsize) / float(spread)
for c in count:
logcount = log(c - (mincount - 1)) * (spread + 1) / log(spread + 1)
size = delta * logcount - (delta - minsize)
countdist.append({'count': c, 'size': round(size, 3)})
return countdist
基本上,如果不对单个计数进行对数计算,它将在点之间生成一条直线,(mincount, minsize) 和 (maxcount, maxsize)。
该算法很好地近似了两点之间的曲线,但存在一个缺点。mincount 是一种特殊情况,它的对数产生零。这意味着 mincount 的大小将小于 minsize。我尝试编造数字来尝试解决这种特殊情况,但似乎无法正确解决。目前我只是将 mincount 视为一种特殊情况,并将“ or 1
”添加到 logcount 行。
是否有更正确的算法在两点之间绘制曲线?
3 月 3 日更新:如果我没记错的话,我正在记录计数,然后将其代入线性方程。换句话说,就是对特殊情况的描述,在 y=lnx at x=1, y=0。这就是 mincount 发生的情况。但是mincount不能为零,标签没有被使用过0次。
尝试代码并插入您自己的数字进行测试。将 mincount 视为特殊情况对我来说很好,我觉得这比实际解决这个问题的方法要容易。我只是觉得必须有一个解决方案,并且有人可能已经提出了解决方案。
更新 4 月 6 日:一个简单的谷歌搜索出现了我读过的许多教程,但这可能是阶梯标签云最完整的例子。
4 月 28 日更新:响应 antti.huima 的解决方案:绘制图形时,您的算法创建的曲线位于两点之间的线下方。我一直在尝试调整数字,但似乎仍然无法想出将曲线翻转到线的另一侧的方法。我猜如果将函数更改为某种形式的对数而不是指数,它将完全符合我的需要。那是对的吗?如果是这样,谁能解释如何实现这一目标?