如何通过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使用htmllib分析网页内容的方法
May 08 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
Python读取xlsx文件的实现方法
Jul 04 Python
PyTorch中反卷积的用法详解
Dec 30 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
Jan 03 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
Pycharm远程连接服务器并实现代码同步上传更新功能
Feb 25 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
Django如何继承AbstractUser扩展字段
Nov 27 Python
Python Socket多线程并发原理及实现
Dec 11 Python
Python 中Operator模块的使用
Jan 30 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
桌面中心(四)数据显示
2006/10/09 PHP
PHP新手上路(五)
2006/10/09 PHP
php并发对MYSQL造成压力的解决方法
2013/02/21 PHP
php递归创建目录的方法
2015/02/02 PHP
迁移PHP版本到PHP7
2015/02/06 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
PHP大文件分割分片上传实现代码
2020/12/09 PHP
关于javascript中this关键字(翻译+自我理解)
2010/10/20 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
使用Chart.js图表库制作漂亮的响应式表单
2015/10/28 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
[02:18]DOTA2英雄基础教程 育母蜘蛛
2014/01/20 DOTA
[01:08]DOTA2次级职业联赛 - Wings 战队宣传片
2014/12/01 DOTA
Python脚本文件打包成可执行文件的方法
2015/06/02 Python
浅析python协程相关概念
2018/01/20 Python
python装饰器简介---这一篇也许就够了(推荐)
2019/04/01 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
浅谈matplotlib 绘制梯度下降求解过程
2020/07/12 Python
Django视图、传参和forms验证操作
2020/07/15 Python
详解python metaclass(元类)
2020/08/13 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
丹尼尔惠灵顿手表天猫官方旗舰店:Daniel Wellington
2017/08/25 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
牵手50新加坡:专为黄金岁月的单身人士而设的交友网站
2020/08/16 全球购物
文艺晚会主持词
2014/03/24 职场文书
药店促销活动策划方案
2014/08/24 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
文艺演出主持词
2015/07/01 职场文书
nginx常用命令放入shell脚本详解
2021/03/31 Servers