热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单标签云的实现

2019独角兽企业重金招聘Python工程师标准原文地址:http:typeorigin.com2015122720151227-tagcloud-diy标签云

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

原文地址: http://typeorigin.com/2015/12/27/20151227-tagcloud-diy/    


        标签云是数据可视化的有效方法。标签云中根据标签的衡量指标,呈现时设置不同的字体大小或者颜色来表达标签的重要性,能够方便的表达博客的关注点。

       下面是我自己实现一个简单标签云的过程,在我的标签云中,实现了用不同的字体大小来表达标签被引用的次数。当然其实有很多现成的工具可以用,不过自己对于实现原理比较好奇,也就想自己实现个,最后效果是有了,也不知道是不是常规手段。

       在开工的时候我考虑了这么个问题:标签的被引用次数我很容易得到,我只需要几个简单的SQL就可以统计出各标签的的使用次数,但是问题在于难道我的标签’Java’被引用了100次, 标签’切糕’ 仅仅被引用1次,在显示的时候就让’Java’比 ‘切糕’大一百倍?那切糕肯定不满意了,好歹切糕也很火啊。而且更实际的问题是,我们的页面在展示标签时的空间是有大小的,不可能任由字体任意大。

       那么现在缕缕思路,实现标签云,我先要做下面的工作:

1、  统计出各标签的引用次数

2、  合理的显示标签大小

哦,前面忘记说了,基于标签云的实现,我的数据模型是这样的:1张Post表, 1张Tag表,还有一张 Post 和 Tag 的关联表


    统计标签的引用次数

    统计很简单,一句SQL就可以实现,我使用的Django,查询的话就这样:

tag_list = Tag.objects.annotate(num_post=Count('post_tag'))

    合理显示标签大小

    什么叫做合理呢?起码不能太大吧,起码也不能小的看不见吧。那么就只能规定一个取值的范围。

    标签的引用次数可能会差别很大,如果直接用引用次数来作为最终标签的字体大小的话,也不是不可以,只不过有的字体会特别大,有的呢又特别小

       如果直接表示大小不行,那么我就是用倍数来表示。比如我只能接受最大的字体是最小字体的3倍,那么如何将差别很大的引用次数映射到 1 ~ 3 的范围之间呢?

       首先来个假设,假设现在我有一组标签的引用次数 A = [1, 3, 5, 6, 10], 接下来的过程其实也就是找到一个合适的函数来完成这个映射。思路就是讲我们的数字逐步的往 [1, 3]上靠。

       先找出 A 中的最大值 maxA, 然后将 A 中的每个数值除以 maxA, 结果也就是

        A’ = [0.1, 0.3, 0.5, 0.6, 1], 现在已经成功的将值域缩小到 [0, 1] 之间,继续向 [1, 3] 上靠。

       现在对于 A’ 中的每个数字n, 都满足 0 <&#61; n <&#61; 1, 不等式两边同时乘以 2&#xff0c;则取值范围变为 0 <&#61; 2n <&#61; 2&#xff0c; 再将不等式两边同时加上1则等于, 1 <&#61; 2n &#43; 1 <&#61; 3。

       现在我数组A中原来的引用次数已经转化为 [1, 3] 之间。但是这只是个特例&#xff0c;我还需要更通用的公式才能满足不同区间的需求。

       根据上面的步骤&#xff0c;可以抽象为一下步骤

       A’*x &#43; y

       假设目标区间是[L, U], 那么利用两个端点值&#xff0c;可以得到两个方程&#xff1a;

              A’max * x &#43; y &#61; U

              A’min * x &#43; y &#61; L

       解方程组的&#xff1a;

              x &#61; ( U – L ) / (A’max – A’min) (注意分母为 0 的情况)

              y &#61; U – x

       公式有了&#xff0c;接下来实现就方便了。再用前面的例子 A &#61; [1, 3, 5, 6, 10] 来总结下计算过程&#xff1a;

1、  A中每个元素除以 A中最大值 的A’ [0.1, 0.3, 0.5, 0.6, 1]

2、  求出A’ 中最大最小值 A’max, A’min

3、  运用公式 x &#61; ( U – L ) / (A’max – A’min) , y &#61; U – x 计算两个变量x, y 的值

4、  对 A’ 中每个元素运用公式 A’*x &#43; y 计算换算后的倍数 M

通过上面步骤, A &#61; [1, 3, 5, 6, 10] 计算结果为 M &#61; [1.0&#xff0c;1.2&#xff0c;1.4&#xff0c;1.8&#xff0c;2.1&#xff0c;3.0]

有了M 在前端展示的时候就可以设置style时使用 “font-size: M em;” 来设置字体大小了

       我的Python实现如下&#xff1a;

# coding&#61;utf-8from tumblelog.tumbleutils import TumbleLogUtilsclass TagCloud(object):&#39;&#39;&#39; 根据标签被引用次数计算标签最终的显示的字号&#39;&#39;&#39;def __init__(self, tag_list):self.tag_list &#61; tag_listself.MAX_FONT_RATE &#61; 3.0self.MIN_FONT_RATE &#61; 1.0def calculateTagFont(self):maxE &#61; self.maxElement()minE &#61; self.minElement()normalizegList &#61; self.normalize(maxE)targetList &#61; []x &#61; self.getBootFactor(maxE, minE)y &#61; self.getOffset(maxE, minE)colorUtil &#61; TumbleLogUtils() #一个工具类, 主要用于生成随机颜色for i in range(0, len(normalizegList)):normalizegList[i].num_post &#61; normalizegList[i].num_post * x &#43; ynormalizegList[i].color &#61; colorUtil.getRandomColor()targetList.append(normalizegList[i])return targetListdef normalize(self, maxE):&#39;&#39;&#39; 预处理标签引用次数, 将标签次数的值域缩小到[0,1]&#39;&#39;&#39;# 只有最大值非零时才进行此操作if maxE:for i in xrange(0, len(self.tag_list)):self.tag_list[i].num_post &#61; self.tag_list[i].num_post / maxEreturn self.tag_listdef getBootFactor(self, maxE, minE):&#39;&#39;&#39; 计算公式中的系数 x, 如果最大最小值相等, 就返回0, 否则返回按公式的计算结果&#39;&#39;&#39;if not maxE - minE:return 0return (self.MAX_FONT_RATE - self.MIN_FONT_RATE) / (maxE - minE) * maxEdef getOffset(self, maxE, minE):&#39;&#39;&#39; 计算公式中的系数 y, 如果最大最小值相等, 就返回1, 否则返回按公式的计算结果&#39;&#39;&#39;if not maxE - minE:return 1return self.MAX_FONT_RATE - self.getBootFactor(maxE, minE)def maxElement(self):tmpTags &#61; self.tag_list.order_by(&#39;-num_post&#39;)return float(tmpTags[0].num_post)def minElement(self):tmpTags &#61; self.tag_list.order_by(&#39;-num_post&#39;)return float(tmpTags[len(tmpTags) - 1].num_post) 对应的模版中的代码

{% for tag in tag_list%}{{ tag.title }}{% endfor %} 效果图

   演示地址: hellofalcon.com

   拓展思考&#xff1a;

        1、除了用标签的引用次数来计算&#xff0c;还可以自己给标签一些权重&#xff0c;这样的话需要对公式进行调整。

        2、复杂的标签云&#xff0c;类似下面这样的还不知道怎么弄。



转载于:https://my.oschina.net/GivingOnenessDestiny/blog/94766


推荐阅读
  • Go语言中的高效排序与搜索算法解析
    在探讨Go语言中高效的排序与搜索算法时,本文深入分析了Go语言提供的内置排序功能及其优化策略。通过实例代码,详细讲解了如何利用Go语言的标准库实现快速、高效的排序和搜索操作,为开发者提供了实用的编程指导。 ... [详细]
  • voc生成xml 代码
    目录 lxmlwindows安装 读取示例 可视化 生成示例 上面是代码,下面有调用示例 api调用代码,其实只有几行:这个生成代码也很简 ... [详细]
  • 在Laravel中实现PHP对JSON数据的发布与处理 ... [详细]
  • 深入解析十大经典排序算法:动画演示、原理分析与代码实现
    本文深入探讨了十种经典的排序算法,不仅通过动画直观展示了每种算法的运行过程,还详细解析了其背后的原理与机制,并提供了相应的代码实现,帮助读者全面理解和掌握这些算法的核心要点。 ... [详细]
  • 深入学习 Python 中的 xlrd 模块:掌握 Excel 文件读取技巧
    本文深入探讨了 Python 中的 xlrd 模块,重点介绍了如何高效读取 Excel 文件(包括 xlsx 和 xls 格式)。同时,文章还详细讲解了 xlwt 模块在 Excel 文件写操作中的应用。此外,文中列举了常见单元格数据类型及其处理方法,为读者提供了全面的实践指导。 ... [详细]
  • Spring Boot 实战(一):基础的CRUD操作详解
    在《Spring Boot 实战(一)》中,详细介绍了基础的CRUD操作,涵盖创建、读取、更新和删除等核心功能,适合初学者快速掌握Spring Boot框架的应用开发技巧。 ... [详细]
  • 本项目在Java Maven框架下,利用POI库实现了Excel数据的高效导入与导出功能。通过优化数据处理流程,提升了数据操作的性能和稳定性。项目已发布至GitHub,当前最新版本为0.0.5。该项目不仅适用于小型应用,也可扩展用于大型企业级系统,提供了灵活的数据管理解决方案。GitHub地址:https://github.com/83945105/holygrail,Maven坐标:`com.github.83945105:holygrail:0.0.5`。 ... [详细]
  • 本题库精选了Java核心知识点的练习题,旨在帮助学习者巩固和检验对Java理论基础的掌握。其中,选择题部分涵盖了访问控制权限等关键概念,例如,Java语言中仅允许子类或同一包内的类访问的访问权限为protected。此外,题库还包括其他重要知识点,如异常处理、多线程、集合框架等,全面覆盖Java编程的核心内容。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • 深入解析Python中的循环双向链表数据结构
    本文详细探讨了Python中循环双向链表的数据结构,包括其定义、特点及应用场景。文章首先介绍了循环双向链表的基本概念,随后深入分析了其核心操作,如节点的插入、删除和遍历等。最后,通过具体的Python代码示例,展示了如何高效地实现这些操作,帮助读者全面理解并掌握这一重要数据结构。 ... [详细]
  • 如何在 Java LinkedHashMap 中高效地提取首个或末尾的键值对? ... [详细]
  • 深入解析Gradle中的Project核心组件
    在Gradle构建系统中,`Project` 是一个核心组件,扮演着至关重要的角色。通过使用 `./gradlew projects` 命令,可以清晰地列出当前项目结构中包含的所有子项目,这有助于开发者更好地理解和管理复杂的多模块项目。此外,`Project` 对象还提供了丰富的配置选项和生命周期管理功能,使得构建过程更加灵活高效。 ... [详细]
  • 深入解析Java中HashCode的功能与应用
    本文深入探讨了Java中HashCode的功能与应用。在Java中,HashCode主要用于提高哈希表(如HashMap、HashSet)的性能,通过快速定位对象存储位置,减少碰撞概率。文章详细解析了HashCode的生成机制及其在集合框架中的作用,帮助开发者更好地理解和优化代码。此外,还介绍了如何自定义HashCode方法以满足特定需求,并讨论了常见的实现误区和最佳实践。 ... [详细]
  • 在Python编程中,掌握高级技巧对于提升代码效率和可读性至关重要。本文重点探讨了生成器和迭代器的应用,这两种工具不仅能够优化内存使用,还能简化复杂数据处理流程。生成器通过按需生成数据,避免了大量数据加载对内存的占用,而迭代器则提供了一种优雅的方式来遍历集合对象。此外,文章还深入解析了这些高级特性的实际应用场景,帮助读者更好地理解和运用这些技术。 ... [详细]
  • MongoDB Aggregates.group() 方法详解与编程实例 ... [详细]
author-avatar
钢铁年代2502883227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有