中文词向量可视化流程

sdq
Explore, Think, Create
5 min readJan 29, 2017

文本,尤其是中文文本,是一个高度抽象的对象,极为复杂且难以量化,这对大数据分析中发现文本中的关联性造成了阻碍,也是挖掘文本大数据中潜在价值所必须跨越的难题。而中文文本的可视化可以使普通人也能通过简单的交互体验从而发现文本中蕴藏的价值。本文结合互联网以及论文上相关知识,总结了一下中文文本可视化的一套可行方案与实施流程,共勉学习。

与英文文本不同,在进行文本处理的第一步时不得不面对的是中文文本分词技术,所谓分词是将完整的句子划分成若干独立的词汇。比如“我喜欢你“会被分词为“我”“喜欢”“你”。常采用的中文分词库为jieba,可以有效通过几种模式(最大概率法、隐式马尔科夫模型、混合模式、全模式 、搜索模式)进行分词。jieba是开源项目,如果是mac用户可以通过我之前写的这个mac中文分词软件体验下jieba的分词能力。

我们的目标是将文本可视化,最重要的一步是将所有的中文词变成空间向量,以数字形式呈现。最简单可以想到的方法我这里称其为1向量。向量的维度为词的总数,第N个词可以表达为第N位为1,向量中其余的元素全部为0。形如: [0,0,0,……0,1,0,……0,0,0]

这个方案导致的结果是维度灾难,计算机难以计算,并且也很难找到向量间的关联性。

工业界给出的解决方案是word2vec,这是一套根据语料库进行训练,通过发现每个词与上下文间关系(CBOW或Skip-gram方法)来产生的词嵌入(Word Embedding)方案。所谓的词嵌入,其实就是将超高维度抽象化的词向量嵌入到一个较低维度的空间中。当然除了word2vec,现在也有wordrank等其它方案。总之,经过这一步处理后,基本可以把中文词向量的维度降到100维左右。

到达这一步以后其实就已经可以做一些有趣的事情了,这里举几个应用的例子:可以在这个空间中找出与某个词距离最近的词,比如“麦当劳“,可能和它最近的就是“肯德基““汉堡”之类的词汇。读者可能会觉得没什么,会说那凭人的直觉也可以发现呀。但如果是在人未知的领域或者不熟悉的领域作用就大了,比如对一本你没看过的小说,你可以通过某个书中的事件探索到和它相关的人名或者有联系的事物,是不是很方便呢。

下一个应用其实比较经典,就是可以对中文词进行数学运算。说起来可能比较难以理解,词语怎么做数学运算呢?但如果有了之前生成的词向量的话一切就变成了可能。最老套的例子是:“国王” - “男人” + “女人” = “皇后” 的例子。那大家可以开脑洞想想可以做点什么事情:比如你喜欢吃“火锅“,又喜欢吃“日料“,那你想不想看看“火锅”加“日料”是个啥呢?“火锅”减“日料”又会是啥?会不会就是你潜在喜欢的下一种美食。

最后再给个例子是一个自动给词向量分类的应用,那就是聚类,通过非监督的机器学习的方法自动为向量进行分类,归为一类的词理论上它们之间更有相似性,可以以此作为推荐系统的基础原型。这里聚类最常用的聚类算法是kmeans算法,这里给一个之前在iOS上做的kmeans小应用,大家可以体会一下kmeans的作用。

好了,到了这里可能发现我们已经完工了,还有可视化什么事情吗?似乎没有了可视化我们也基本上可以完成所有任务了。然而事实并不是这样,可视化最大的意义是能够让人们直观地发现事物间的关联,更快速地寻找事物的规律。可视化意义在于能让我们通过直觉去发现,而不仅仅是被动寻找。

那如果要将上述结果可视化的话麻烦又来了,我们人类是标准的低维度生物,怎么才能看到上面所说的100维的空间呢?答案其实也很简单,降维呗。通过降维算法,把高纬度空间降到三维甚至二维。比较成熟的方法是PCA(主成分分析)、SNE(Geoffrey Hinton大神的神作)、t-SNE .. 等。大致的思路就是在选取低纬度的过程中,尽量地保证所有向量之间的区分度。经过这一步的努力,通过降维算法我们就可以愉快的把词向量展现在我们的屏幕上啦。下面这个图呢,是Google自家推出的Embedding Projector,可以直观地感受一下,然后想象一下换成中文的感觉。

好了,有了这样一套可视化模型,我们又可以脑洞大开想应用了。这里给一个最近看到的好玩例子:食物向量。采用大量食谱作为语料库进行训练,然后把和食物相关的词都提取出来,形成可视化模型,可以从下面这张图看到同一个地区的食物在空间上也是归为一类的,是不是很有趣呢?

到了这里本文也差不多到了尾声,文章里提到的当然都只是冰山一角,除了算法和模型,大而全的语料库其实才是让词向量空间更加精准。这里随手也给一个中文维基百科语料库的链接

--

--