如何通过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的Zato发送AMQP消息的教程
Apr 16 Python
python实现读取命令行参数的方法
May 22 Python
Django Highcharts制作图表
Aug 27 Python
django中静态文件配置static的方法
May 20 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
wxPython的安装与使用教程
Aug 31 Python
Python匿名函数及应用示例
Apr 09 Python
在python中做正态性检验示例
Dec 09 Python
解决安装pyqt5之后无法打开spyder的问题
Dec 13 Python
Python嵌套函数,作用域与偏函数用法实例分析
Dec 26 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
python实现调用摄像头并拍照发邮箱
Apr 27 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
PHP4中实现动态代理
2006/10/09 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
Symfony核心类概述
2016/03/17 PHP
php生成mysql的数据字典
2016/07/07 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
2017/08/15 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
js控制当再次点击按钮时的间隔时间
2014/06/03 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
2014/12/31 Javascript
浅谈Unicode与JavaScript的发展史
2015/01/19 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
JS实现自动定时切换的简洁网页选项卡效果
2015/10/13 Javascript
JavaScript如何实现图片懒加载(lazyload) 提高用户体验(增强版)
2016/11/30 Javascript
Bootstrap基本组件学习笔记之面板(14)
2016/12/08 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
python实现k-means聚类算法
2018/02/23 Python
线程安全及Python中的GIL原理分析
2019/10/29 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
世界首屈一指的钓鱼用品商店:TackleDirect
2016/07/26 全球购物
日本7net购物网:书籍、漫画、杂志、DVD、游戏邮购
2017/02/17 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
室内拓展活动方案
2014/02/13 职场文书
《鲁班和橹板》教学反思
2014/04/27 职场文书
2015年社区卫生工作总结
2015/04/21 职场文书