如何通过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连接mongodb操作数据示例(mongodb数据库配置类)
Dec 31 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
Apr 27 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
python TKinter获取文本框内容的方法
Oct 11 Python
python 将有序数组转换为二叉树的方法
Mar 26 Python
python实现美团订单推送到测试环境,提供便利操作示例
Aug 09 Python
新手常见Python错误及异常解决处理方案
Jun 18 Python
Python selenium实现断言3种方法解析
Sep 08 Python
如何利用python生成MD5并去重
Dec 07 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
python实现层次聚类的方法
Nov 01 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
有关JSON以及JSON在PHP中的应用
2010/04/09 PHP
php whois查询API制作方法
2011/06/23 PHP
php下获取http状态的实现代码
2014/05/09 PHP
php数组去除空值函数分享
2015/02/02 PHP
php技巧小结【推荐】
2017/01/19 PHP
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
基于豆瓣API+Angular开发的web App
2015/01/02 Javascript
JS实现简单路由器功能的方法
2015/05/27 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
jQuery表格插件datatables用法汇总
2016/03/29 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
vue $router和$route的区别详解
2020/12/02 Vue.js
原生JavaScript实现换肤
2021/02/19 Javascript
Python 字典dict使用介绍
2014/11/30 Python
python获得两个数组交集、并集、差集的方法
2015/03/27 Python
python win32 简单操作方法
2017/05/25 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
pycharm 安装JPype的教程
2019/08/08 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
Python项目跨域问题解决方案
2020/06/22 Python
详解python内置模块urllib
2020/09/09 Python
Python Pandas数据分析工具用法实例
2020/11/05 Python
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
什么是命名空间(NameSpace)
2015/11/24 面试题
2014年文学毕业生自我鉴定
2014/04/23 职场文书
升职感谢信
2015/01/22 职场文书
2015年电话销售工作总结范文
2015/04/20 职场文书
教师节感想
2015/08/11 职场文书
vue使用element-ui按需引入
2022/05/20 Vue.js