数据可视化
多年下来,我的Google Bookmarks
里已经有近万条的书签。大部分内容是我在读过一遍之后就收藏起来的,也有很多看了一眼之后,觉得不错,然后收藏起来准备以后读的(当然,你也知道,再也没有打开过)。
有没有一个方法可以让我以可视化的方式,看到这些年我都学了那些东西呢?将书签列表作为源数据,然后将这些信息可视化出来会非常有意思:比如收藏夹中的热门词是什么,哪段时间收藏了多少条的书签(学习投入程度趋势)等等。
下图是我的书签中,排行前30
的关键字排序。可以明显的看出,我对于JavaScript
的喜爱程度相当高,对美食
的喜爱也超过了python
和linux
。
这里我将使用python
,结合python
的一些库来实现书签可视化
。简而言之,整个过程可以分成这样几个步骤:
- 将Google Bookmarks导出为本地文件
- 将书签文件解析为容易处理的内部格式(比如python的dict等)
- 由于书签中会有中文的句子,所以会涉及到分词
- 统计词语的频率,并绘制成图标
数据源
Google Bookmarks
本身可以直接导出成HTML
文件。该HTML
文件包含了时间戳和书签的标题,我们可以通过python
的库BeautifulSoup
将HTML中的文本抽取出来:
1 2 3 4 5 6 7 8 |
|
BeautifulSoup
提供非常好用的API来抽取结构化文档中的内容。
分词
BeautifulSoup
获得的是一条条独立的句子,我们需要使用分词器将所有的句子分解成片段。这里我使用了jieba
(结巴分词)分词器来完成这个任务:
1 2 3 4 5 6 7 |
|
将会输出:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
我们定义一个方法来将上一步中的文本分词:
1 2 3 |
|
分词之后,我们将单词转换为小写,并剔除掉那些长度小于1的字符串。这样可以保证所有的词都是词语。python的list推导式
写起来非常简洁,一行代码就完成了过滤
和映射
的工作。
可视化
有了分好的词之后,只需要统计每个词出现的频率,然后按照频率来绘制图表。我们使用python
标准库中的Counter
来实现:
1 2 3 4 5 |
|
要获取前N
个,只需要使用most_common(N)
即可:
1
|
|
1
|
|
有了数据之后,使用matplotlib
做一个简单的bar
图标:
1 2 3 4 5 6 7 8 9 10 11 |
|
stopwords
不过,上图中有很多噪音信息,如and
, the
等,这些在所有文章中都会出现的词并没有实际意义,统称为stopwords
。通常在计算过程中会将其忽略:
1 2 3 4 5 6 |
|
重新绘制即可获得上文中的图:
完整的代码请参考这里。