如何通过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使用pyqt写带界面工具的示例代码
Oct 23 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
浅谈Scrapy框架普通反爬虫机制的应对策略
Dec 28 Python
Python实现的随机森林算法与简单总结
Jan 30 Python
python实现聊天小程序
Mar 13 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
浅谈Pandas Series 和 Numpy array中的相同点
Jun 28 Python
Django框架创建项目的方法入门教程
Nov 04 Python
python SVD压缩图像的实现代码
Nov 05 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 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
星际争霸兵种名称对照表
2020/03/04 星际争霸
php 函数使用方法与函数定义方法
2010/05/09 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
PHP多维数组遍历方法(2种实现方法)
2015/12/10 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
phpcms的分类名称和类别名称的调用
2017/01/05 PHP
php使用PDO从数据库表中读取数据的实现方法(必看)
2017/06/02 PHP
PHP封装的完整分页类示例
2018/08/21 PHP
DOM精简教程
2006/10/03 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
最全面的百度地图JavaScript离线版开发
2016/09/10 Javascript
关于vue.js弹窗组件的知识点总结
2016/09/11 Javascript
JavaScript模仿Pinterest实现图片预加载功能
2016/10/25 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
通过Ajax使用FormData对象无刷新上传文件方法
2016/12/08 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
详解vue事件对象、冒泡、阻止默认行为
2017/03/20 Javascript
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
jQuery 改变P标签文本值方法
2018/02/24 jQuery
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
Vue动态生成表格的行和列
2019/07/18 Javascript
python写的一个squid访问日志分析的小程序
2014/09/17 Python
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
python轮询机制控制led实例
2020/05/03 Python
python3 re返回形式总结
2020/11/20 Python
校园环保标语
2014/06/13 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
中学生自我评价2015
2015/03/03 职场文书
淡雅古典唯美少女娇媚宁静迷人写真
2022/03/21 杂记
彻底卸载VMware虚拟机的超详细步骤记录
2022/07/15 Servers