如何通过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 相关文章推荐
改进Django中的表单的简单方法
Jul 17 Python
深入理解Python中命名空间的查找规则LEGB
Aug 06 Python
Python入门_浅谈for循环、while循环
May 16 Python
详解python中的数据类型和控制流
Aug 08 Python
python3 配置logging日志类的操作
Apr 08 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
jupyter notebook实现显示行号
Apr 13 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
Django如何批量创建Model
Sep 01 Python
Python实现七个基本算法的实例代码
Oct 08 Python
python使用matplotlib绘制图片时x轴的刻度处理
Aug 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日历类分享
2014/11/18 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
2016/05/20 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
解密效果
2006/06/23 Javascript
Extjs Ajax 乱码问题解决方案
2009/04/15 Javascript
js window.onload 加载多个函数的方法
2009/11/02 Javascript
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
通过DOM脚本去设置样式信息
2010/09/19 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
javascript中RegExp保留小数点后几位数的方法分享
2013/08/13 Javascript
Jquery通过Ajax访问XML数据的小例子
2013/11/18 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
jQuery实现图片文字淡入淡出效果
2015/12/21 Javascript
又一枚精彩的弹幕效果jQuery实现
2016/07/25 Javascript
jQuery Masonry瀑布流插件使用方法详解
2017/01/18 Javascript
Canvas 绘制粒子动画背景
2017/02/15 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
CentOS中升级Python版本的方法详解
2017/07/10 Python
python3.5绘制随机漫步图
2018/08/27 Python
Python实现的批量修改文件后缀名操作示例
2018/12/07 Python
Python中文编码知识点
2019/02/18 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
全球立体声:World Wide Stereo
2018/09/29 全球购物
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
介绍一下Python中webbrowser的用法
2013/05/07 面试题
自我鉴定200字
2013/10/28 职场文书
服装设计专业求职信
2014/06/16 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Python入门之基础语法详解
2021/05/11 Python
使用这 6个Vue加载动画库来减少我们网站的跳出率
2021/05/18 Vue.js
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
Redis批量生成数据的实现
2022/06/05 Redis