话说近两年大数据确实火了,带给我们最直接的视觉感受就是利用图或者表来展示大数据所隐藏的内容,真是真实而又直观。然而技术博客的侧边栏标签云就是一种原始雏形,只不过这种标签是通过作者手动添加而生成的。本文就是想通过自动提取博文标题中的关键字,然后通过插件来进行显示。核心技术就是:中文分词与词频统计。
关于中文分词
中文跟英语在分词技术上差别比较多,中文多个字往往可以组成多个词语,而且词语之还可以缩写。例如:苏州杭州 可以缩写为 苏杭;而英文则相对固定,一个单词就是一个单词。也难怪平时在word中的词语错误提醒功能不能完全纠正中文书写错误,而可以纠正所有的英文书写错误。
目前国内针对中文分词有几个比较流行的库:
- jieba:基于python语言开发,同时最开始接触的也是这个开源库,整体而言也不错,github上关注度也是最高的;
- Yaha:也是基于python语言开发的,跟jieba差不多,貌似功能方面有所改变;
- NLPIR:开发语言C/C++/C#/Java;
- 其它分词可以参见参考链接1;
可以说这些分词库各有差别,选择一款适合自己的库就行了,本次选择的是jieba,主要是由于基于python开发,并且在国内分词中流行度比较高(V2EX原来的主题tag就是基于jieba做的)。
提取所有标题
将数据库中的wp-post表中的数据导出csv格式,然后用excel打开并提取title列存为txt格式,这样子所有的标题都存在txt文件里面了。
标题分词
采用jieba给的实例程序进行标题分词,实际上可以将所有的标题当做一段话进行分词,但是为了更佳准确,还是选择了单个标题进行分词,直接上代码,非常简短:
#encoding=utf-8 import jieba wordsall = {} #define return dic postfile = open(‘title’,’r’) ptitle = postfile.readlines() for ititle in ptitle: ititle = ititle.replace(‘\n’,”) #clean \n seg_list = jieba.cut(ititle, cut_all=False) print ” “.join(seg_list)
这样子就可以直接吧所有的标题进行分词并打印出来。其实jieba在分词的时候有三种模式(可以参考链接2),而本次采用的就是全模式:
- 精确模式,试图将句子最精确地切开,适合文本分析;
- 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
- 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
其实代码还可以写得更好点,统计关键字并统计每个词语出现的次数,代码如下:
#encoding=utf-8 import jieba wordsall = {} #define return dic postfile = open(‘title’,’r’) ptitle = postfile.readlines() for ititle in ptitle: ititle = ititle.replace(‘\n’,”) #clean \n seg_list = jieba.cut(ititle, cut_all=False) rowlist = ” “.join(seg_list) words = rowlist.split(’ ‘) for word in words: if word !=”: if word in wordsall: wordsall[word]+=1 else: wordsall[word] = 1 wordsall = sorted(wordsall.items(), key=lambda d:d[1], reverse = True) for (word, cnt) in wordsall: print “%s:” % word,cnt
文字图显示
其实在上面的过程中虽然对标题的词语进行了分词,但是一般的人还是看不太懂这个博客主要写了什么内容,而目前很流行的文字图则更加方便地普通人快速了解相关信息。这类主要采用在线服务实现文字图的绘画,在线平台只需要提供关键字即可显示文字图,本次采用了worditout的在线服务进行生成;
将上面生成的词语复制到worditout的文本框中,就生成了文章最前面的图形,对比下发现这个文字图的效果和说服力跟我手动标注的标签云差不多,也即是说自动的标签分割技术基本上已经成熟,不需要人工手动添加标签了。
其实,还有很多其它的在线文字图生成系统,可以参照这里的一篇文章;
相关链接