Wordle

记录下自己业余时间在做的一个小项目,这个项目的名字叫PageWordle,可以将网络页面上的文本信息用词云的可视化形式展现,出现频率高的词语将以更大的字体展现,其主要用意是让我们在阅读文章之前可以知道这边文章中的主要概念,再决定要不要继续阅读。

demo

主要流程包括:

  1. 获取网页的html内容,使用XPathQuery获取感兴趣的内容,通常是element ‘p’之内的文本。

  2. 获取之后的内容做词法分析。目前使用的是Cocoa中的NSLinguisticTagger类,它支持英文和中文的分词,并且可以分析英文单词的词性。不过遗憾的是目前暂时不能分析中文词性。

  3. 筛选词语。对英文只选取其中的名词,对于中文,因为目前还不能分析词性,只能做一些简单的处理,如手动定义一个dictionary,把里面的dictionary里面的词语过滤掉。对于英文单词,因为它有很多的形态,还需要将其转化成原始的形式,这也可以通过NSLinguisticTagger完成。

  4. 根据词语的出现次数,使用不同大小的字体来绘制词语。这个项目的可视化想法来源于http://www.wordle.net/gallery。其主要特点是一个单词并不是被看成一个矩形,我们可以在字体比较大的单词内部空白处填入字体比较小的单词。项目中使用了二叉空间分割树来解决这个问题。对于要新插入的单词,首先生成图片并获得图片的位图数据,通过二叉空间分割树可以比较快速的判断该位图能不能在特定的位置插入。具体实现可以参考源代码。

  5. Increamental的显示单词,处理完一个之后会马上显示,而不是等所有的都处理完再一起显示。项目中使用Facebook的AsyncDisplayKit库,不过这有点牛刀小试的意思,因为这里的界面展示其实很简单,也没有什么用户的交互。后续的完善中希望可以派上用场。

项目的源代码放在https://github.com/shiyizju/PageWordle.git。目前考虑继续添加的功能有一下几点:

  1. 网页抓取功能的提升,可以抓取整个网站的页面而不是单个页面。
  2. 中文词法分析的优化,希望NSLinguisticTagger可以继续提升对中文的支持,不然得考虑使用其它的技巧或者第三方库。
  3. 添加zoom功能,但是要保证zoom过程中绘制的流畅性。
  4. 丰富界面展示,比如字体颜色,文字的方向(水平或垂直),支持预定义的模版。