wordle和单词云的起源、原理与制作

1.什么是wordle?

wordle是一种工具,能够通过将指定文本中单词出现的频率统计出来,然后生成单词拼贴图形,即单词云(word could)。

即使从未听说过“信息可视化”的人也对绚丽多彩的单词拼贴wordle都很熟悉,wordle被认为是文本分析处理的入门仙丹(“the gateway drug to textual analysis.”)

大家可以直接访问网站http://www.wordle.net/直接使用wordle和访问成千上万的他人作品。wordle的使用方法非常简单,将一段文字复制到输入框中,点击go, 就会生成单词云。

在高级模式下,wordle还允许使用者对版面、文字格式、文字旋转幅度、文字颜色做一系列设定。甚至也不一定要求单词出现频率才是单词最终现实大小的唯一度量,其允许用户输入指定的单词及其对应权值的数据。使用这个功能可以为传统的信息可视化制作单词云,而不仅仅为了文本分析。

wordle制作的单词云的案例,来自http://4a4b.wikispaces.com/0+Create+wordle+wordcloud

单词云这种表达形式本质上是在2d平面上使用size尺寸来突出不同单词之间权重的对比,便于读者快速找到重点。注意,wordle是可视化工具,最终表达形式是单词云,但单词云不见得都是wordle生成的。

2.wordle的起源

  • 单词云的设计灵感

早在flash、processing、javascript这些技术工具出现之前,人们就在探索大众媒体和艺术作品上的排版创作;人们长时间地探索文字格式和字体之间的分界。

毫无疑问,单词云这种表现形式,最早的灵感就是来自于排版印刷业的设计艺术。

原书的例图。上图,现代排版案例,来自美国国家设计研究中心,;下图,古代排版案例,来自古埃及草纸>_<

我们可以看到,单词云这种看似杂乱无章的表现形式,其实是有人类长期以来设计经验做铺垫的,而之所以这么设计也在于它的表现形式恰恰与人类的思维模式相符合,这表现在两个方面:其一单词云的文字对比反映了人们抓大放小突出重点的常规思路,计算机图像处理专家经常为人类大脑能瞬间捕捉到画面中的重点元素的能力而惊叹;其二是单词云的这种杂乱的感觉恰恰与不断跳跃,不断联想的人类思维类似,另一个好的例子就是思维导图。

( 设计方面的延伸:高桥流演示法,是日本Ruby协会会长高桥征义发明的一种PPT演示方法,特点是巨大的文字,简洁的语言,不采用任何图形表格。类似动漫作品EVA的风格。http://www.qiexing.com/post/332.html

  • 单词云的技术起源

 在计算机领域,这种风格的排版的大规模应用是体现在标签云(tag cloud)这种小应用上。

标签云是由可点击的关键字组成的一个矩阵集合——每个关键字因为权重不同现实不同的大小。在web上,有很多允许用户对内容添加标签的应用,那么大半会提供标签云。下图是我曾经用过的wordpress标签云——字体大小代表的是每个标签下文章的数量,颜色不代表任何意义。

 

我曾经使用过的wordpress标签云

 

这种标签云的实现很简单,不论是用前端JS实现还是后端动态脚本预言都很容易,其中心思路是根据每个标签的权重值来给定文字大小,具体方法可用如下公式描述:

A标签的大小 = 最小默认字体号 + (A标签权重 - 全体标签最小权重值) * 字体进阶值

字体进阶值 = (全体标签最大权重值 - 全体标签最小权重值)/(最大默认字体号 - 最小默认字体号)

具体代码实现就不占用版面了。有兴趣的朋友可以参考wordpress的代码实现,参见wp_tag_cloud和wp_generate_tag_cloud两个函数。

当然,纯粹的文字大小变化并不能满足我们,通常我们会加上颜色或透明度的变化,这也很简单。颜色对于标签云毫无意义(这点后面会讲到),故而在预设的默认值中随机挑选就可以了。透明度变化的设置则与字体大小类似。除此以外,还有更进一步、充满幻想的设计。比如,WP-Cumulus,提供了旋转的、三维的标签画面——代价是标签变得难以点击了。而放弃了导航功能的标签云,则拥有了更大的设计空间——于是进一步地催生了只以展示为目的的单词云。

用wp插件wp-cumulus实现的3d标签云

 3.从标签云到单词云

仔细分析上文中标签云的实现方法的公式,可以看到这种实现方法实际上还有很多弊端。权值到字体大小在这里是直接对应的,但在实际使用中可能会遇到权重值差距过大导致个别文字很大,其他都很小,这样看起来空白区域太多,不美观。故而也有用计算对数或者平方的方式缩放权重的解决方案。但是,出现这种空白的根本原因在于标签云中的文字是按顺序排列的,不会互相填充空白区域。如何才能做到让所有文字满满地填充空白区域,以实现本文一开始所引用的wordle生成图片那样密密麻麻的效果?

值得一提的是这种需求是典型的二维装箱问题。“装箱问题(bin-packing problems)”是数学上的经典NPC问题(non deterministic polynomial complete problem)之一,NPC问题即在多项式时间内无法精确求解,通俗的说就是无法在可接受的时间内求出最优解。装箱问题这个组合优化问题看似简单,但寻求最优解的算法复杂度呈指数上升,出现所谓“组合爆炸”现象,故而通常我们只求近似解和满意解。(这里有一篇厦门大学的硕士论文综述了目前的二维装箱问题的求解算法http://www.docin.com/p-261478625.html

有很多计算机科学博士因为逐步改进装箱问题而被授予了博士学位,细细讨论下去够我写几篇综述文章了。考虑到本文的初衷,只是为了寻求单词云的美观,消除空白,因此并不需要过分在意整体最优之类的问题,故而选择简单的算法即可。在wordle里采用的方法就是一个简单有效的算法——随机贪婪算法。你可以随意地把单词拖放到屏幕中某个期望位置附近,而如果该单词和其他单词存在交叠,就重新再试一次,直到它不再与其他单词交叠为止。可以证明,贪心算法中每一步求的的都是该步的最优解,虽然由此产生的全局解通常不是最优的(就像生活中一个人处处便宜占尽结果通常只是个小市民过完一辈子而已),但对我们的问题而言已经是一个满意解。贪心算法不需要回溯,简单可靠,这就是用它的原因。

4.故而wordle程序的处理流程如下:

文本分析:

  1. 输入原始文本
  2. 识别单词(使用正则表达式和java的character类,wordle只能处理unicode文本)
  3. 确定字体类型(wordle根据编码字符类型下载对应的字体用于文字显示)
  4. 猜测语言并删除停用词(停用词表来自某种预言的大语料库的单词统计,然后由用户主观地选择某些词停用。例如英语里的the, it, to这些意义不大的单词就会被列入停用词表。猜测语言的方法是从文本中统计最常出现的50个单词,然后计算在某种语言的停用词表中出现的次数,出现的多就说明是该语言。这种方法只适合英语这样的表音字母语言)
  5. 给单词分配权重(单词出现次数=权重)

布局

  1. 把加权单词转变成图形
  2. 确定展现区域(展现区域可以不是矩形,但是不能太大也不能太小)
  3. 装箱(使用随机贪婪算法将文字填充到指定区域)
  4. 冲突检测(随机贪婪算法中每一步都需要调用的图形是否交叠的检测算法,高效的冲突检测比随机贪婪算法本身还要复杂并且值得研究)
原文例图:在使用随机贪婪算法的某一步中,单词denmark所走过的路径(冲突检测过程)

5.wordle的优点

毫无疑问,wordle是个严格意义上的信息可视化工具。可视化是否成功——这个判断通常是主观的。主观意见要成为客观论据通常需要统计学方面的验证。《数据可视化之美》引用了一个相关的统计调查,被调查的大多数人都认为wordle激发了人们的创造力,并从文本中能够学到一些新知识,这说明wordle通过了可视化效能应用的传统学术评估,至少说明wordle是比较成功的可视化工具。

不论是不是由wordle创造,这种单词云的形式,已经大量地应用于个人爱好的描述,总结和修饰商务演示和博士论文,插图说明文章和电视新闻报道,提炼和抽象记忆,乃至促使不识字的青年参与到享受文本的乐趣中。

wordle的特性源自与文本的特性。只是简单地把一个单词放到屏幕中,其他单词要么对该单词本身的含义进行补充,要么进行反衬,可以马上使读者得到共鸣。wordle对单词的随机组合给人们创造了喜悦、惊喜和某种程度的认可,以及如诗般激发了人们的洞察力。

6.wordle的缺点

在使用过如PS一般强大的Tagxedo后,我感到wordle实在是有些初级。《数据可视化之美》的作者总结并批判了一些问题。结合我的理解,认为有如下几点:

  • 不支持中文

硬伤,需要采用别的软件弥补。

  • 单词大小的调整太初级

wordle在计算字体大小时没有考虑单词长度,这会导致单词越长越容易占领显示区域空间。改进的办法是将单词大小对应于单词权重的平方根,这样小权重的文字会越小、大的会越大(为了体现单词拥有区域而不仅仅是长度这一事实)。但是原文作者并不喜欢这个方法。

  • 颜色毫无意义

在wordle中颜色是毫无意义的,它仅仅用来提高单词边界的对比和增加一些美感。前文中的标签云中的颜色也只起到这个作用,这就解释了为什么标签云的颜色选取完全是随机的。改进的办法是,让颜色用于对各个维度进行编码,如聚集和现实统计学意义。

  • 字体是使人充满遐想的

很多人在用wordle制作单词云的时候都爱用一些美丽但缺乏可读性的字体,这导致最后成品不宜读。对于易读性至关重要的应用,是wordle使用了expressway字体,该字体被美国运输部当作标准字母。

  • 单词权重统计可以更加具体

这个主要是原文作者针对文本分析和统计学需求提出的改进。wordle的单词权重统计只是在全文中统计每个单词出现的次数,这样并不能对相似文本做出有意义的比较。这反映了一个更进一步的需求:我们需要用对单词权重进行更细致的分析,然后应用wordle布局算法来体现不同文章的区别。

 

7.为什么wordle不支持中文?

原因主要出在文本分析上。不像英语这样的表音文字每个单词都有空格分割,中文首先面临的问题是如何确定每个单词的边界——即中文分词——古代这需要秀才熟读诗书,对于如今的电脑这通常需要非常复杂的机器学习算法和大量的运行时数据结构,wordle的作者并不指望把这些都做了。其次,比起英文,中文字体的数据非常大,需要花费用户很长时间去下载,带宽成本过高。结果是即使你能自己进行中文分词和权值统计,也不能用wordle的高级模式来制作中文单词云。

8.如何制作中文单词云?

就没有别的软件程序支持了吗?答案当然是否定的。

 上文中提到的难点——中文分词,作为中文自然语言处理的基础,现在已有很多软件和在线工具可以完成。像百度谷歌这样的搜索引擎公司,背后都有各自独立的中文分词技术团队做支持。国内的大中院校也研发过各种中文分析工具,也有一些商业公司如海量网络(http://www.hylanda.com/)在研究相关技术。关于中文分词基础发展现状,可以查看这篇文章http://www.360doc.com/content/13/0317/14/9156119_272039618.shtml。现在可用的工具例如:中国科学院计算技术研究所的ictclasMFSOU中文分词PHP扩展、武大ROST CM、盘古分词等等。当然,海量语料的分词需要一定数据处理能力和基础架构才能完成,不过少量语料的分词比较简单,用在线工具足矣。

然后就是制作软件。这里推荐使用Tagxedo。Tagxedo是一个类似wordle但更强大的软件,可以说wordle有的功能它都有,wordle没有的功能它也有。你可以访问http://www.tagxedo.com在线制作词云。

Tagxedo制作词云的过程非常简单,不会coding的文科生都可轻易上手。不过制作中文单词云的时候有两个要点需要注意:需要点击控制面板上的word | layout option, 将其中word选项卡下Apply Nonlatin Heuristic (启用非拉丁字符启发模式)选项选择NO,这样中文分词就不会分得过于零散了;此外通常情况下文本分析结果中会有很多单词是我们不想看到的,你需要设置忽略词表,这步可在word | layout option按钮下的skip选项中进行设置。除此以外,其他设置颜色、形状、字体之类的功能,不会比美图秀秀难多少。剩下的就是你的需求和创意了。

Tagxedo是用Silverlight实现的,在交互上比以java实现的wordle要好很多。微软推出Silverlight作为与adobe flash对抗的跨平台插件已经有8年了。遗憾的是除了微软用的人很少(因为相比flash这个东西并没有决定性的替代作用),但是这个技术在交互上还是非常强大的,MVVM模式就是微软在设计Silverlight的时候创造发明出来的。这个Tagxedo算是不错的第三方作品了。

 

我使用tagxedo制作的中文单词云。文本来源子百度百科“林明美”页面,其中忽略了百度百科相关单词,只保留跟林明美相关的单词。

 

文本来源:百度搜索“科比肘击”第一页;忽略词:删除了与主题无关的单词

 

9. 结语

本文依然是《数据可视化之美》摘要与批注系列文章的第三篇。但是,由于从本文起,我改变了文章的形式,以本人的理解为主,加入大量原创性内容(灰蓝色字体);少量、补充性地引用原文(黑色字体)。故而文章不再以“《数据可视化之美》摘要与批注”为标题。化他人之物为我所用,乃是精读此书、书写博客之唯一目的。

最早目标只是写《数据可视化之美》第三章wordle的读后感,但计算机毕竟是一门强调实践的学科,顺着原作的思路我同时调查了排版设计相关案例、标签云的实现、装箱问题的分类及其算法、中文分词研究现状、silverlight技术,  写了简单标签云的实现代码,动手用了wordle、Tagxedo和ictclas。算是理解了“数据可视化这门技术某种程度似一头怪兽,很少有学科需要其从业人员具备如此多的技能”这句话了。关于单词云到此为止,之后研究其他可视化案例及相关技术内容。