Albert Cheng's blog

word2vec在学历造假中的探索

前言

  1. 如果你想了解word2vec的原理,这篇文章并不适合你,出门右转用google。
  2. 这篇文章的东西含金量不高,希望搞NLP,ML,DL的专业人士轻拍。
  3. 因为含金量不高,所以有一些诸如数据预处理的一些琐碎的东西,因此比较适合新手村的新手任务。

背景

在我们的系统中,有一处是需要校验一个人提供的学历信息是否真实。系统现有的算法准确率比较高,但是召回率比较低。
举一个例子来说明一下学历造假相关背景。以计算机相关专业为例:
计算机科学与技术是一级学科,计算机应用技术,信息安全,计算机系统结构是二级学科。软件工程现在貌似已经是一级学科?
在硕士研究生和博士研究生的授位中,是按照二级学科来区分的。但学计算机的人都懂的,其实都一样。以至于很多人都不知道自己是哪个二级学科的,然后问题就来了,让你填你的毕业专业,你填哪个呢?填错了会不会被认为是学历造假?

问题

显然,这是一个短文本匹配问题,文本短到仅由两三个词构成。而且,由于专业的局限性,非专业人士基本分不清某个一级学科下面有哪些二级学科。

解决办法

  1. 编辑距离,这个算法的缺点明显:计算机科学与技术信息安全的编辑距离,想想都觉得大,字面上看来一点关系都没有。
  2. word2vec: 借助NLP的东西来计算两个专业之间的相似度,挖掘隐藏信息。

基于word2vec的短文本相似度

语料

语料我选择的是中文维基百科,下载地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
获得语料之后,还需要对语料进行一些预处理:
(此处参考了:http://licstar.net/archives/262)

  1. 抽取正文文本
  2. 繁简转换

分词

中文相关的处理,分词是绕不开的一个步骤,我采用了ICT分词的java版。

word2vec

我试图用一些线程的word2vec的jar包来直接训练分词后的语料,但找了好几个,内存都爆了。无奈,我只能在spark mllib上手动做了一个。代码就不贴了,很简单,mllib有现成的word2vec算法库。

得到词向量之后,怎么表达成短文的向量呢?
我采用了一个简单粗暴的办法:向量叠加。直接将短文本分词后的词向量叠加起来,再用余弦相似度来计算相似度。
看一下结果吧:
实验结果对比
其中,相似度A是现在系统跑的算法,相似度B是基于word2vec向量叠加的相似度。
可见,word2vec有效地挖掘出来了专业之间的潜在联系。

结论

  1. 从上面的图中可以看出,在word2vec中,一级学科和二级学科的相似度显著提升。
  2. 软件工程作为一个一级学科,跟计算机科学与技术也有极高的相似度,带来了更大的误导,但其实软件工程作为计算机的相关专业确实相关性极高。

未来工作

  1. 有比向量叠加更好的点子么?应该有吧,卷积应该是一个不错的选择,但是我还没有想好怎么卷积,毕竟我的场景比较特殊,没有标注好的样本进行训练(因为专业是有限可枚举的,如果有功夫标注的话,我想不需要模型来算相似度了,因此我的场景只是需要一个办法来计算相似度)。如果各位有啥好的点子,还请不吝赐教。

参考文献

  1. http://licstar.net/archives/262