如何通过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 相关文章推荐
Python3.7实现中控考勤机自动连接
Aug 28 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
微信公众号token验证失败解决方案
Jul 22 Python
Python SQLAlchemy入门教程(基本用法)
Nov 11 Python
Python数据可视化:泊松分布详解
Dec 07 Python
Python timer定时器两种常用方法解析
Jan 20 Python
python nohup 实现远程运行不宕机操作
Apr 16 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
scrapy头部修改的方法详解
Dec 06 Python
python解决OpenCV在读取显示图片的时候闪退的问题
Feb 23 Python
使paramiko库执行命令时在给定的时间强制退出功能的实现
Mar 03 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
php 备份数据库代码(生成word,excel,json,xml,sql)
2013/06/23 PHP
PHP zip扩展Linux下安装过程分享
2014/05/05 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
Laravel定时任务的每秒执行代码
2019/10/22 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
JavaScript控制table某列不显示的方法
2015/03/16 Javascript
jQuery获得document和window对象宽度和高度的方法
2015/03/25 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
JS简单判断函数是否存在的方法
2017/02/13 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
Auto.js自动收取自己和好友蚂蚁森林能量脚本
2018/06/28 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
2018/07/13 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python 生成器和迭代器的原理解析
2019/10/12 Python
使用Python中tkinter库简单gui界面制作及打包成exe的操作方法(二)
2020/10/12 Python
幼师自荐信范文
2013/10/06 职场文书
应届毕业生就业自荐信
2013/10/26 职场文书
元旦晚会感言
2014/03/12 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
心理健康教育主题班会
2015/08/13 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
导游词之张家界
2019/10/31 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
Go语言实现一个简单的并发聊天室的项目实战
2022/03/18 Golang