如何通过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程序语言快速上手教程
Jul 18 Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 Python
python回溯法实现数组全排列输出实例分析
Mar 17 Python
在服务器端实现无间断部署Python应用的教程
Apr 16 Python
浅谈MySQL中的触发器
May 05 Python
20个常用Python运维库和模块
Feb 12 Python
Python基于scipy实现信号滤波功能
May 08 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
Oct 25 Python
在Python中使用filter去除列表中值为假及空字符串的例子
Nov 18 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
使用python如何删除同一文件夹下相似的图片
May 07 Python
python三子棋游戏
May 04 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
一个PHP+MSSQL分页的例子
2006/10/09 PHP
php使用mb_check_encoding检查字符串在指定的编码里是否有效
2013/11/07 PHP
smarty的section嵌套循环用法示例
2016/05/28 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
Javascript的匿名函数小结
2009/12/31 Javascript
优化javascript的执行速度
2010/01/23 Javascript
js 字符串转化成数字的代码
2011/06/29 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
Bootstrap Table使用整理(四)之工具栏
2017/06/09 Javascript
Vue结合SignalR实现前后端实时消息同步
2017/09/19 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
解析Json字符串的三种方法日常常用
2018/05/02 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
基于postman获取动态数据过程详解
2020/09/08 Javascript
Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
2018/03/19 Python
查看Django和flask版本的方法
2018/05/14 Python
Python实现的矩阵转置与矩阵相乘运算示例
2019/03/26 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
美国咖啡批发网站:Coffee.org
2017/06/29 全球购物
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
电子邮箱格式怎么写
2014/01/12 职场文书
关于颐和园的导游词
2015/01/30 职场文书
医院员工辞职信范文
2015/05/12 职场文书
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
golang使用map实现去除重复数组
2022/04/14 Golang
JS前端可扩展的低代码UI框架Sunmao使用详解
2022/07/23 Javascript