实现类似 Wordle 的词云的算法

Posted

技术标签:

【中文标题】实现类似 Wordle 的词云的算法【英文标题】:Algorithm to implement a word cloud like Wordle 【发布时间】:2010-09-25 10:55:12 【问题描述】:

上下文

看看Wordle:http://www.wordle.net/ 它比我见过的任何其他词云生成器都好看 注意:来源不可用 - 阅读常见问题解答:http://www.wordle.net/faq#code

我的问题

是否有可用的算法可以实现 Wordle 的功能? 如果不是,有哪些替代方案可以产生类似的输出?

我为什么要问

只是好奇 想学习

【问题讨论】:

有一个替代实现,基于图像处理here。不是很快,但非常灵活,适合实验。 (Mathematica 中给出了完整的实现。) 我想出了自己的(非常简单的)算法和blogged about it。它是用 Python 编写的,应该很容易定制。我试图让它半途而废。 !enter image description here 我真的很喜欢你问这个问题的方式! +1 链接失效了吗? 【参考方案1】:

我用 Julia 语言实现了一个名为 WordCloud.jl 的词云生成器。关于其算法的简要说明可以找到here。 与大多数其他实现不同,我基于梯度优化来设计它。这是一种非贪心算法,其中单词在定位后可以进一步moved。这意味着不需要缩小字,因此可以在调整过程中保持字长不变。通过这个实现,我们还可以像这样做一些花哨的工作:Comparison of Obama's and Trump's inaugural address

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含算法描述的基本部分并提供链接以供参考。 谢谢@nik7。我已经按照你的建议添加了一些算法描述。【参考方案2】:

Tim Dream 制作了一个非常不错的小型 javascript 库:

https://github.com/timdream/wordcloud2.js/blob/gh-pages/API.md

它可以在画布上或带有许多选项的 html 标签创建一个词云来修改结果。它非常接近 wordle 的输出。

【讨论】:

【参考方案3】:

这是 Python 3 中 wordle 的另一个端到端实现,主要基于 Jonathan Feinberg 的初始大纲(QuadTrees、螺旋等)。

代码(已注释,带有详细的自述文件)可在此Github repository 免费获得,这是使用代码创建的示例 wordle。

【讨论】:

【参考方案4】:

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

来源TagCloudService 和razor markup control 和WinForm for testing purposes 您可以将其放入您的博客、个人资料等中,并在其周围加上一个小包装。它大量使用 C# 4.0 和 System.Drawing 命名空间。

我创建它是因为使用其他云生成器您无法单击标签进行导航,也无法创建悬停动画以显示它们是可点击的。由于在 HTML 中显示悬停动画对我来说是必要的(我正在使用覆盖的、绝对定位的 <a> 标签执行此操作)我还没有开发任何角度的文字显示 - 它们是垂直或水平的。

警告:以上链接可能会在几个月后失效,我打算慢慢将其与周边项目解开,成为一个单独的项目。

您可以看到一个工作演示 on this sample blog post,但它不完整,并且位于不完整的站点中。如果有人想贡献,请联系我,我会尽快将其分离出来。

【讨论】:

链接无效。我喜欢你博客上的 UI。 谢谢,刚刚修好了【参考方案5】:

Lion and Lamb 是一款开源 ios 应用,它使用所选圣经书中最常用的词创建词云。

它基于 Jonathan Feinberg 描述的算法。命中测试确实使用了四叉树,但边界框基于字形的边界矩形。我想将字形分解为许多较小的边界矩形,以便在字形的边界框中启用单词放置。

GitHub:https://github.com/PetahChristian/LionAndLamb

【讨论】:

【参考方案6】:

我是 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

就是这样。 hard 部分是有效地进行交叉测试,为此我使用最后命中缓存、分层边界框和四叉树空间索引(所有这些都是您可以通过一些勤奋的谷歌搜索)。

编辑:正如 Reto Aebersold 指出的那样,现在有一个免费提供的书籍章节涵盖了相同的领域:Beautiful Visualization, Chapter 3: Wordle

【讨论】:

“勤奋的谷歌搜索”。喜欢它:) 更多信息在这里:static.mrfeinberg.com/bv_ch03.pdf - 谢谢乔纳森。 感谢乔纳森提供的信息 - 我对可以创建像这样出色的可视化效果的非常简单的算法非常着迷。 我仍然对“想去某个地方”这部分感到困惑。单词的初始位置真的是随机的吗? SO 的美丽..您所询问的工作人员,实际上可能会回答您的问题!【参考方案7】:

我已经使用 python 实现了 Jonathan Feinberg 描述的算法来创建标签云。它与 wordle.net 的美丽云朵相去甚远,但它让您了解如何做到这一点。

你可以找到项目here。

【讨论】:

感谢分享!我一定会查看你的实现。 链接 (labs.atizo.com) 再次损坏。您确实应该发布一两张示例图片,以便我们查看比较。 @RetoAebersold 是否可以将此代码与 flask 或 django 框架集成?【参考方案8】:

这里看看我的 Wordle 像云的实现。 它使用相同的螺旋算法和四叉树数据结构。

http://sourcecodecloud.codeplex.com

http://www.codeproject.com/Articles/224231/Word-Cloud-Tag-Cloud-Generator-Control-for-NET-Win

【讨论】:

sourcecodecloud 不可下载,第二个链接也不行 我验证了第一个链接的源代码/下载。有效。第二个链接被移动了。现已修复。【参考方案9】:

这是来自 Jason Davies 的一个非常棒的 javascript,它使用了 d3。你甚至可以使用网络字体。

演示: http://www.jasondavies.com/wordcloud/

Github: https://github.com/jasondavies/d3-cloud

【讨论】:

复制 src=".js" 文件并重新上传它们以构建或按原样使用非常容易。感谢分享,效果很好! 有没有办法将调色板更改为更美观的颜色?我尝试将 JSON 调用中的 js 文件从:colourlovers.com/api/palettes/random 修改为 colourlovers.com/api/palettes/top,正如 colourlovers 的 API 建议的那样,但调色板保持不变。 这是一个基于演示的响应式工作示例,但可以完全控制文字和颜色。对于自定义调色板,请改用注释代码。 jsbin.com/kiwojayoye/1/edit?html,js,output【参考方案10】:

我创建了一个 Silverlight 组件,它使用 Jonathan 在此处建议的算法。源代码和示例项目都在我的博客上:

http://whydoidoit.com

我的云可让您根据不同的权重为单词着色和大小,它支持单词选择(从坐标)和选定的单词突出显示。来源是您的,您可以根据需要使用。

【讨论】:

您的博客似乎是空的。链接失效了吗? 这里是archive.org的快照,web.archive.org/web/20110820202717/http://whydoidoit.com/…我也在github上找到了这个项目github.com/whydoidoit/WordCloud【参考方案11】:

我一直在寻找一种类似于 wordle 的可视化,它允许分配与其他数据相关的字符串的颜色、初始位置和大小,例如文本中的相关性 - 没有找到任何东西,但感谢信息我发现here(特别是Jonathan的解释和aeby的链接),我终于可以实现'Cloudio',它相对接近wordle(至少我认为是这样......)并提供了我正在寻找的功能。

它是用 SWT 和 JFace 实现的,我尝试将它集成到 JFace 的 MVC 模型中,这样您就可以设置 content- 和 label-providers 来修改云的布局并将其添加到其他 Eclipse-插件或 RCP 应用程序。您还可以修改计算字符串初始位置的方式,这样不难将其用于集群可视化或其他方面。它的文档仍然很差,并且在某些方面受到限制(我在几个小时前进行了初始上传,所以它可能仍然有点错误),但如果您有兴趣,这里是链接:

这里是一些创建的云的链接,如果您想快速了解一下:https://github.com/sschwieb/Cloudio/wiki/Example-Clouds

干杯, 斯蒂芬

【讨论】:

【参考方案12】:

我正在开发 WordCram,这是一个用于制作词云的处理库。它深受 Wordle 的影响,并由与上面链接的同一个 PDF aeby 提供信息。它会为您处理碰撞检测,并让您专注于您希望文字的布局、着色、旋转等方式。

【讨论】:

您的服务是否提供 API? 抱歉,WordCram 没有 API。这是一个图书馆,而不是一项服务。【参考方案13】:

http://code.google.com/apis/visualization/documentation/gallery.html

查看词云可视化。不像 wordle.net 那样花哨,但很容易添加到您的网站。

【讨论】:

以上是关于实现类似 Wordle 的词云的算法的主要内容,如果未能解决你的问题,请参考以下文章

3种好用的词云工具,快来试一下吧~

多种好看好玩的词云例子Example

为啥用python画的词云很模糊

生成中文词云图的制作:带有不同的背板

Kibana 8.X 如何做出靠谱的词云图?

Kibana 8.X 如何做出靠谱的词云图?