tagcloud の重みの対数分布を生成する適切な方法についてのチュートリアルをたくさん読みました。それらのほとんどは、タグをステップにグループ化します。これは私にはややばかげているように思えるので、読んだ内容に基づいて独自のアルゴリズムを開発し、しきい値と最大値の間の対数曲線に沿ってタグのカウントを動的に分散させました。これが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) の間に直線が生成されます。
このアルゴリズムは 2 点間の曲線を適切に近似しますが、欠点が 1 つあります。mincount は特殊なケースであり、その対数はゼロになります。これは、mincount のサイズが minsize よりも小さくなることを意味します。この特殊なケースを解決するために数字を考えてみましたが、うまくいきません。現在、mincount を特別なケースとして扱い、" or 1
" を logcount 行に追加しています。
2 点間に曲線を描くためのより正確なアルゴリズムはありますか?
3 月 3 日更新: 私が間違っていなければ、カウントの対数を取り、それを線形方程式に差し込んでいます。特殊なケースの説明を言い換えると、x=1 で y=lnx では、y=0 です。これが mincount で起こることです。ただし、mincount をゼロにすることはできません。タグは 0 回使用されていません。
コードを試して、独自の番号をプラグインしてテストしてください。最小カウントを特別なケースとして扱うことは私にとっては問題ありません。この問題の実際の解決策よりも簡単だと感じています。これには解決策が必要であり、おそらく誰かが解決策を思いついたように感じます。
4 月 6 日更新: 簡単なGoogle検索で、私が読んだ多くのチュートリアルが見つかりますが、これはおそらく段階的なタグ クラウドの最も完全な例です。
4 月 28 日更新:antti.huima のソリューションへの対応: グラフ化すると、アルゴリズムが作成する曲線は 2 つの点の間の線の下にあります。私は数字を調整しようとしてきましたが、その曲線を線の反対側にひっくり返す方法がまだ思いつかないようです. 関数が指数ではなく何らかの形式の対数に変更された場合、まさに必要なことを行うと思います。あれは正しいですか?もしそうなら、誰でもこれを達成する方法を説明できますか?