如何通过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 01 Python
Python操作列表的常用方法分享
Feb 13 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
在PyCharm中三步完成PyPy解释器的配置的方法
Oct 29 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
Oct 12 Python
python matplotlib实现将图例放在图外
Apr 17 Python
Python接口测试文件上传实例解析
May 22 Python
Python 必须了解的5种高级特征
Sep 10 Python
python matplotlib绘制三维图的示例
Sep 24 Python
Python结合百度语音识别实现实时翻译软件的实现
Jan 18 Python
python多线程爬取西刺代理的示例代码
Jan 30 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
Oracle 常见问题解答
2006/10/09 PHP
谈谈新手如何学习PHP
2006/12/23 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
PHP中的浅复制与深复制的实例详解
2017/10/26 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
JavaScript中继承用法实例分析
2015/05/16 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
利用Angularjs和Bootstrap前端开发案例实战
2016/08/27 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
使用vue-cli webpack 快速搭建项目的代码
2018/11/21 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
微信小程序实现购物车小功能
2020/12/30 Javascript
[05:31]DOTA2英雄梦之声_第08期_莉娜
2014/06/23 DOTA
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
python使用心得之获得github代码库列表
2014/06/25 Python
Python类的用法实例浅析
2015/05/27 Python
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
python异常触发及自定义异常类解析
2019/08/06 Python
python 安装impala包步骤
2020/03/28 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
2020/06/04 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
荷兰游戏商店:Allyouplay
2019/03/16 全球购物
优质服务活动实施方案
2014/05/02 职场文书
保洁公司服务承诺书
2014/05/28 职场文书
授权委托书公证
2014/09/14 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
办公室年度工作总结2015
2015/05/21 职场文书
如何写通讯稿
2015/07/22 职场文书
2016国庆节活动宣传语
2015/11/25 职场文书
教师学习中国梦心得体会
2016/01/05 职场文书
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS