实现类似 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 的词云的算法的主要内容,如果未能解决你的问题,请参考以下文章