如何通过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 相关文章推荐
使用相同的Apache实例来运行Django和Media文件
Jul 22 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python模块smtplib实现纯文本邮件发送功能
May 22 Python
对python产生随机的二维数组实例详解
Dec 13 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
python之pexpect实现自动交互的例子
Jul 25 Python
Python高级特性之闭包与装饰器实例详解
Nov 19 Python
python定间隔取点(np.linspace)的实现
Nov 27 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
基于python实现上传文件到OSS代码实例
May 09 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 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下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
jQuery帮助之CSS尺寸(五)outerHeight、outerWidth
2009/11/14 Javascript
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
js抽奖实现随机抽奖代码效果
2013/12/02 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
jQuery Mobile中的button按钮组件基础使用教程
2016/05/23 Javascript
WEB 前端开发中防治重复提交的实现方法
2016/10/26 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
babel基本使用详解
2017/02/17 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
新手必须知的Node.js 4个JavaScript基本概念
2018/09/16 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
AJAX在JQuery中的应用详解
2019/01/30 jQuery
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
Vue.js实现立体计算器
2020/02/22 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
python如何支持并发方法详解
2020/07/25 Python
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
DC Shoes俄罗斯官网:美国滑板鞋和服饰品牌
2020/08/19 全球购物
应届生英语教师求职信
2013/11/05 职场文书
财务负责人任命书
2014/06/06 职场文书
2014年小学工作总结
2014/11/26 职场文书
交警失职检讨书
2015/01/26 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers