如何通过Python实现标签云算法


Posted in Python onJuly 02, 2019

标签云(Tag Cloud)常见于各种博客站点中,标签有利于网站内容分类,还可以用于相关性内容推荐。近日笔者有空把个人的开源博客Django_blog添加了一个新功能--标签云。

如何通过Python实现标签云算法

实现原理

标签云最终展现出来的效果其实是由两个HTML参数来控制的,分别是:font-size和color,如:

<a href="http://foofish.net/blog/tag/django" rel="external nofollow" style="font-size:24px; color:#4f4f4f">django</a>

标签关联的文章越多,表示这个标签被引用的次数越大,font-size的值也越大,color的颜色越深。考虑到体验效果,font-size不能随着的标签的引用次数的增大而无限增大,否则页面显得非常丑陋。因此会把font-size控制在某个区间,同理color也是在一个区间中。

这里我把font-size设置在12到33之间数组FONT_SIZES,标签的font-size属性只能是里面的一个值,COLORS是与FONT_SIZES对应的一个数组,12对应#ccc,15对应#adadad,以此类推。

MIN_FONT_SIZE = 12 # 最小尺寸
MAX_FONT_SIZE = 33 # 最大尺寸
FONT_SIZES = [MIN_FONT_SIZE, 15, 18, 21, 24, 27, 30, MAX_FONT_SIZE] 
COLORS = ['#ccc', "#adadad", '#8e8e8e', '#6f6f6f', '#4f4f4f', '#303030', '#111', '#000']

现在关键问题就是如何根据标签的引用次数(tag_ref_count)来确定它的font-size。一旦font-size了,color也随之确定。要想标签的font-size能够均匀分布在数组FONT_SIZES中,那么要遵循的一个原则就是,随着次数的增加其font-size的取值也增加,而且引用次数最少的标签使用MIN_FONT_SIZE,引用次数最多的标签使用MAX_FONT_SIZE。

因此有一个公式,MIN_FONT_SIZE + n*step = MAX_FONT_SIZE,step是步长,n是指引用次数最多的标签减去引用次数最少的标签,表示两者之间总共有多少步step,根据此根式可以算出每一步的step值是多少,知道了步长后,就可以计算出任意一个标签的font-size了,任何一个标签到最小标签的步数是两者之差,因此每一个标签的font-size为 MIN_FONT_SIZE + (tag_ref_count-min_ref_count)*step

如何通过Python实现标签云算法

源代码:

# encoding: utf-8
__author__ = 'liuzhijun'
class TagCloud(object):
MIN_FONT_SIZE = 12
MAX_FONT_SIZE = 33
FONT_SIZES = [MIN_FONT_SIZE, 15, 18, 21, 24, 27, 30, MAX_FONT_SIZE]
COLORS = ['#ccc', "#adadad", '#8e8e8e', '#6f6f6f', '#4f4f4f', '#303030', '#111', '#000']
def __init__(self, min_ref_count, max_ref_count):
TagCloud.min_ref_count = min_ref_count
# 如果最大标签和最小标签相等,那么认为两者的步长为0,所有标签取同样的font-size.
if max_ref_count == min_ref_count:
TagCloud.step = 0
else:
TagCloud.step = (TagCloud.MAX_FONT_SIZE - TagCloud.MIN_FONT_SIZE) / (max_ref_count - min_ref_count)
def get_tag_font_size(self, tag_ref_count):
font_size = TagCloud.MIN_FONT_SIZE + (tag_ref_count - TagCloud.min_ref_count) * TagCloud.step
# 上面计算出来的font_size并不一定刚好是FONT_SIZES中的某个元素, 可以能某两个元素之间的某个值
# 因此要取最接近FONT_SIZES中某个元素
font_size = min(TagCloud.FONT_SIZES, key=lambda x: abs(font_size - x))
return font_size
def get_tag_color(self, tag_ref_count):
return TagCloud.COLORS[(TagCloud.FONT_SIZES.index(self.get_tag_font_size(tag_ref_count)))]

输出结果:

12,12,12,18,24,18,21,27,33,

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
教你安装python Django(图文)
Nov 04 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
Python实现windows下模拟按键和鼠标点击的方法
Mar 13 Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
May 16 Python
python 内置函数汇总详解
Sep 16 Python
python代码中怎么换行
Jun 17 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
Pytorch实验常用代码段汇总
Nov 19 Python
Python 使用SFTP和FTP实现对服务器的文件下载功能
Dec 17 Python
python如何进行基准测试
Apr 26 Python
对python特殊函数 __call__()的使用详解
Jul 02 #Python
对python 调用类属性的方法详解
Jul 02 #Python
python算法题 链表反转详解
Jul 02 #Python
python输入多行字符串的方法总结
Jul 02 #Python
Django高级编程之自定义Field实现多语言
Jul 02 #Python
python 杀死自身进程的实现方法
Jul 01 #Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 #Python
You might like
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
ScrollDown的基本操作示例
2013/06/09 Javascript
js克隆对象、数组的常用方法介绍
2013/09/26 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
jquery实现ajax提交表单信息的简单方法(推荐)
2016/08/24 Javascript
Angularjs中使用layDate日期控件示例
2017/01/11 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
bootstrap paginator分页前后台用法示例
2017/06/17 Javascript
Angular 5.0 来了! 有这些大变化
2017/11/15 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
2014/07/04 Python
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
多个应用共存的Django配置方法
2018/05/30 Python
24式加速你的Python(小结)
2019/06/13 Python
python数组循环处理方法
2019/08/26 Python
实现Python与STM32通信方式
2019/12/18 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
给 TensorFlow 变量进行赋值的方式
2020/02/10 Python
Django-rest-framework中过滤器的定制实例
2020/04/01 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
详解Python中的文件操作
2021/01/14 Python
工商管理专业学生的自我评价
2013/10/01 职场文书
应届生财务管理求职信
2013/11/06 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
纠风工作实施方案
2014/03/15 职场文书
英语教学课后反思
2016/02/15 职场文书
《雷雨》教学反思
2016/02/20 职场文书