前言
- 如果你想了解word2vec的原理父泳,這篇文章并不適合你般哼,出門右轉(zhuǎn)用google。
- 這篇文章的東西含金量不高惠窄,希望搞NLP蒸眠,ML,DL的專業(yè)人士輕拍杆融。
- 因為含金量不高楞卡,所以有一些諸如數(shù)據(jù)預(yù)處理的一些瑣碎的東西,因此比較適合新手村的新手任務(wù)脾歇。
背景
在我們的系統(tǒng)中蒋腮,有一處是需要校驗一個人提供的學(xué)歷信息是否真實。系統(tǒng)現(xiàn)有的算法準確率比較高藕各,但是召回率比較低池摧。
舉一個例子來說明一下學(xué)歷造假相關(guān)背景。以計算機相關(guān)專業(yè)為例:
計算機科學(xué)與技術(shù)
是一級學(xué)科激况,計算機應(yīng)用技術(shù)
,信息安全
,計算機系統(tǒng)結(jié)構(gòu)
是二級學(xué)科作彤。軟件工程
現(xiàn)在貌似已經(jīng)是一級學(xué)科?
在碩士研究生和博士研究生的授位中,是按照二級學(xué)科來區(qū)分的誉碴。但學(xué)計算機的人都懂的宦棺,其實都一樣。以至于很多人都不知道自己是哪個二級學(xué)科的黔帕,然后問題就來了,讓你填你的畢業(yè)專業(yè)蹈丸,你填哪個呢成黄?填錯了會不會被認為是學(xué)歷造假?
問題
顯然逻杖,這是一個短文本匹配問題奋岁,文本短到僅由兩三個詞構(gòu)成。而且荸百,由于專業(yè)的局限性闻伶,非專業(yè)人士基本分不清某個一級學(xué)科下面有哪些二級學(xué)科。
解決辦法
- 編輯距離够话,這個算法的缺點明顯:
計算機科學(xué)與技術(shù)
和信息安全
的編輯距離蓝翰,想想都覺得大,字面上看來一點關(guān)系都沒有女嘲。 - word2vec: 借助NLP的東西來計算兩個專業(yè)之間的相似度畜份,挖掘隱藏信息。
基于word2vec的短文本相似度
語料
語料我選擇的是中文維基百科欣尼,下載地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
獲得語料之后爆雹,還需要對語料進行一些預(yù)處理:
(此處參考了:http://licstar.net/archives/262)
- 抽取正文文本
- 繁簡轉(zhuǎn)換
分詞
中文相關(guān)的處理,分詞是繞不開的一個步驟,我采用了ICT分詞的java版钙态。
word2vec
我試圖用一些線程的word2vec的jar包來直接訓(xùn)練分詞后的語料慧起,但找了好幾個,內(nèi)存都爆了册倒。無奈蚓挤,我只能在spark mllib上手動做了一個。代碼就不貼了剩失,很簡單屈尼,mllib有現(xiàn)成的word2vec算法庫。
得到詞向量之后拴孤,怎么表達成短文的向量呢脾歧?
我采用了一個簡單粗暴的辦法:向量疊加。直接將短文本分詞后的詞向量疊加起來演熟,再用余弦相似度來計算相似度鞭执。
看一下結(jié)果吧:
其中,相似度A是現(xiàn)在系統(tǒng)跑的算法芒粹,相似度B是基于word2vec向量疊加的相似度兄纺。
可見,word2vec有效地挖掘出來了專業(yè)之間的潛在聯(lián)系化漆。
結(jié)論
- 從上面的圖中可以看出估脆,在word2vec中,一級學(xué)科和二級學(xué)科的相似度顯著提升座云。
- 軟件工程作為一個一級學(xué)科疙赠,跟計算機科學(xué)與技術(shù)也有極高的相似度,帶來了更大的誤導(dǎo)朦拖,但其實軟件工程作為計算機的相關(guān)專業(yè)確實相關(guān)性極高圃阳。
未來工作
- 有比向量疊加更好的點子么?應(yīng)該有吧璧帝,卷積應(yīng)該是一個不錯的選擇捍岳,但是我還沒有想好怎么卷積,畢竟我的場景比較特殊睬隶,沒有標注好的樣本進行訓(xùn)練(因為專業(yè)是有限可枚舉的锣夹,如果有功夫標注的話,我想不需要模型來算相似度了理疙,因此我的場景只是需要一個辦法來計算相似度)晕城。如果各位有啥好的點子,還請不吝賜教窖贤。