如何通过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的urllib库提交WEB表单
Feb 24 Python
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
在VS Code上搭建Python开发环境的方法
Apr 06 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
Python字符串匹配之6种方法的使用详解
Apr 08 Python
python plotly画柱状图代码实例
Dec 13 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
python中复数的共轭复数知识点总结
Dec 06 Python
Python-split()函数实例用法讲解
Dec 18 Python
 python中的元类metaclass详情
May 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
php小偷相关截取函数备忘
2010/11/28 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
2015/08/15 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
jQuery实现表单动态添加数据并提交的方法
2018/07/19 jQuery
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
python编程线性回归代码示例
2017/12/07 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
Python global全局变量函数详解
2018/09/18 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
django 2.2和mysql使用的常见问题
2019/07/18 Python
Python实现i人事自动打卡的示例代码
2020/01/09 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
Python控制台实现交互式环境执行
2020/06/09 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
css3 按钮 利用css3实现超酷下载按钮
2013/03/18 HTML / CSS
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
法国面料和小百货在线商店:Mondial Tissus
2019/03/23 全球购物
法国隐形眼镜网站:VisionDirect.fr
2020/03/03 全球购物
10条PHP编程习惯
2014/05/26 面试题
电子邮箱格式怎么写
2014/01/12 职场文书
中文教师求职信
2014/02/22 职场文书
学校教研活动总结
2014/07/02 职场文书
端午节活动总结
2014/08/26 职场文书
狮子林导游词
2015/02/03 职场文书
优秀新员工事迹材料
2019/05/13 职场文书