实现类似Wordle的词云的算法

214

背景

我的问题

  • 是否有可用于执行Wordle所做的内容的算法?
  • 如果没有,有哪些替代方案可以产生类似的输出结果?

为什么我在问这个问题

  • 只是出于好奇
  • 想学习

1
这里有一个基于图像处理的替代实现(链接在此处)。速度不是很快,但非常灵活,适合进行实验。(Mathematica中提供了完整的实现。) - Szabolcs
2
我自己设计了一个(相当简单的)算法并写了一篇博客。它用Python编写,应该很容易定制。我试图让它有一定的效率。 enter image description here - Andreas Mueller
13个回答

514
我是Wordle的创建者。这里是Wordle的实际工作原理:
计算单词数量,丢弃无趣的单词,并按数量降序排序。保留前N个单词,其中N是任意数字。为每个单词分配字体大小,大小与其数量成比例。使用Java2D API为每个单词生成一个Java2D形状。
每个单词“想要”出现在某个位置,比如“在垂直中心的某个随机x位置”。按照单词出现频率递减的顺序,对每个单词执行以下操作:
place the word where it wants to be
while it intersects any of the previously placed words
    move it one step along an ever-increasing spiral

就这样了。难点在于高效地进行交集测试,为此我使用了最近命中缓存、分层边界框和四叉树空间索引等技术(你可以通过努力搜索学习到更多关于它们的知识)。

编辑:正如Reto Aebersold指出的那样,现在有一章书是免费提供的,涵盖了同样的内容:美丽的可视化,第三章:Wordle


7
更多信息请点击这里:http://static.mrfeinberg.com/bv_ch03.pdf - 谢谢Jonathan。 - Reto Aebersold
谢谢信息,乔纳森 - 我对能够创建出像这样伟大的可视化效果的相对简单的算法感到着迷。 - John Patrick
我还有点困惑于“想要在某个地方”的部分。单词的初始位置真的是随机的吗? - adib
谢谢您的解释。"每个单词都想要在某个地方"是什么意思? - Metaphor
这意味着某些数据结构,代表要放置的单词,从一个首选的x和y坐标开始。 - Jonathan Feinberg
我现在意识到,Wordle IP 的很大部分属于 IBM(参见FAQ),但是 IBM 过去曾经开源了很多东西,包括 Eclipse、OpenUP 等。Wordle 在教育领域被广泛使用,这在哲学上是一个“开放”的环境。您是否考虑过建议 IBM 将 Wordle 添加到其重要的开源贡献列表中? - Fuhrmanator

38

很容易只需复制src=".js"文件并重新上传以进行构建或直接使用。感谢分享,非常好用! - Michael d
有没有办法将颜色调色板更改为更美观的东西?我尝试修改来自JSON调用的js文件,从http://www.colourlovers.com/api/palettes/random到http://www.colourlovers.com/api/palettes/top,因为colourlovers的API建议这样做,但是调色板仍然保持不变。 - Michael d
这是一个响应式的工作示例,基于演示但具有完全控制单词和颜色。如需自定义颜色调色板,请改用已注释的代码。http://jsbin.com/kiwojayoye/1/edit?html,js,output - Martin Braun

32

我用Python按照Jonathan Feinberg的算法实现了一个标签云。虽然距离wordle.net的美丽标签云还有很大差距,但它可以给你一个大致的想法。

你可以在这里找到该项目:https://github.com/atizo/PyTagCloud


链接(labs.atizo.com)又挂了。你真的应该发布一两张样例图片,这样我们才能看到比较。 - smci
@RetoAebersold 有没有办法将这段代码与 Flask 或 Django 框架集成? - Mitul Shah

31

我创建了一个 Silverlight 组件,使用了 Jonathan 在这里建议的算法。我的博客上提供了源代码和示例项目:

http://whydoidoit.com

词语云

我的词云可以根据不同的权重对单词进行着色和调整大小,并支持从坐标选择单词以及选中单词高亮显示。源代码可供自由使用。

示例词语云


3
您的博客似乎是空的。链接失效了吗? - O. R. Mapper
1
这是archive.org的快照,http://web.archive.org/web/20110820202717/http://whydoidoit.com/wordcloud-for-silverlight/ 我还在github上找到了这个项目https://github.com/whydoidoit/WordCloud - CJK

14

我正在开发一个名为 WordCram 的处理库,用于制作词云。它受 Wordle 的影响很大,并且受到上述 PDF 文档的启发。它可以自动处理碰撞检测,让你集中精力考虑如何布局、着色、旋转等。


你们的服务提供API吗? - bart
抱歉,WordCram没有API。它是一个库,而不是一个服务。 - Dan Bernier

10

8

sourcecodecloud无法下载,第二个链接也无法使用。 - Sagar Nikam
我验证了第一个链接的源代码/下载。它可以使用。 第二个链接已经移动。现在已修复。 - George Mamaladze

8
我正在寻找一个类似于 Wordle 的可视化工具,可以将字符串的颜色、初始位置和大小与其他数据相关联,例如文本中的相关性。我没有找到合适的工具,但是通过这里找到的信息(特别是 Jonathan 的解释和 aeby 的链接),我最终实现了 'Cloudio',它与 Wordle 相对接近(至少我认为如此...)并提供了我所需要的功能。
它使用 SWT 和 JFace 实现,并尝试将其集成到 JFace 的 MVC 模型中,以便您可以设置内容和标签提供程序来修改云的布局并将其添加到其他 Eclipse 插件或 RCP 应用程序中。您还可以修改计算字符串初始位置的方式,使其易于用于聚类可视化或其他用途。它仍然缺乏文档,并且在某些方面受限制(我几个小时前进行了初始上传,因此可能仍存在一些错误),但如果您感兴趣,这是链接:

如果您想快速了解一些已创建的云,请点击以下链接:https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

谢谢, Stephan


7
Lion and Lamb是一个开源的iOS应用程序,可以使用选定的圣经书籍中最常见的单词创建词云。它基于Jonathan Feinberg所描述的算法。命中测试确实利用了四叉树,但边界框基于字形的边界矩形。我想将字形分解成许多较小的边界矩形,以使单词放置在字形的边界框内。GitHub: https://github.com/PetahChristian/LionAndLamb

A word cloud of the Bible book of Revelation


4

我有一个标签云生成器,我称之为Disorganizer :)

它使用C# 4.0和System.Drawing命名空间,并提供了TagCloudServicerazor markup controlWinForm测试目的等源代码,您可以在博客、个人资料等地方放置它,并加上一些包装。

我创建它的原因是:其他云生成器不能点击标签进行导航,也不能创建悬停动画来显示它们是可点击的。由于在HTML中显示悬停动画对我来说是必要的(我是用叠加的绝对定位的<a>标签实现的),所以我没有开发任意角度的单词显示-它们只能是垂直或水平的。

警告:上面的链接可能在几个月后失效,我计划逐渐将其从周围项目中解除绑定,成为一个独立的项目。

您可以在这篇示例博客文章中看到一个工作演示,但它是不完整的,并且在一个不完整的网站上。如果有人想贡献,请与我联系,我会尽快将其分离出来。


链接已失效。我喜欢你博客上的用户界面。 - Doug S
谢谢,我已经修复了它们。 - Zasz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接