如何通过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完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
Python兔子毒药问题实例分析
Mar 05 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
Python批量修改文本文件内容的方法
Apr 29 Python
详解Python之unittest单元测试代码
Jan 24 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
浅析python参数的知识点
Dec 10 Python
用python 实现在不确定行数情况下多行输入方法
Jan 28 Python
关于numpy数组轴的使用详解
Dec 05 Python
Python的PIL库中getpixel方法的使用
Apr 09 Python
python属于跨平台语言码
Jun 09 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 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
2006/10/09 PHP
PHP文件上传实例详解!!!
2007/01/02 PHP
php实现简单洗牌算法
2013/06/18 PHP
PHP使用socket发送HTTP请求的方法
2016/02/14 PHP
PHP实现的curl批量请求操作示例
2018/06/06 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
jquery 指南/入门基础
2007/11/30 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
在 Vue.js中优雅地使用全局事件的方法
2019/02/01 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
[03:01]完美世界DOTA2联赛PWL S2 集锦第二期
2020/12/03 DOTA
用Python展示动态规则法用以解决重叠子问题的示例
2015/04/02 Python
python实现SOM算法
2018/02/23 Python
通过Python 接口使用OpenCV的方法
2018/04/02 Python
Python3实现的简单验证码识别功能示例
2018/05/02 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
使用 Python 处理 JSON 格式的数据
2019/07/22 Python
python实现拼图小游戏
2020/02/22 Python
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
银行演讲稿范文
2014/01/03 职场文书
六十大寿答谢词
2014/01/12 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
办理房产过户的委托书
2014/09/14 职场文书
乡镇党的群众路线教育实践活动总结报告
2014/10/30 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
孙振耀退休感言
2015/08/01 职场文书
小学语文教师研修日志
2015/11/13 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
评测 | 大屏显示带收音机的高端音箱,JBL TUNE2便携式插卡音箱实测
2021/04/24 无线电
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python