AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法
導(dǎo)讀:詞向量算法是自然語言處理領(lǐng)域的基礎(chǔ)算法,在序列標(biāo)注、問答系統(tǒng)和機(jī)器翻譯等諸多任務(wù)中都發(fā)揮了重要作用。詞向量算法最早由谷歌在2013年提出的word2vec,在接下來的幾年里,該算法也經(jīng)歷不斷的改進(jìn),但大多是僅適用于拉丁字符構(gòu)成的單詞(比如英文),結(jié)合中文語言特性的詞向量研究相對較少。本文介紹了螞蟻金服人工智能部與新加坡科技大學(xué)一項(xiàng)最新的合作成果:cw2vec——基于漢字筆畫信息的中文詞向量算法研究 ,用科學(xué)的方法揭示隱藏在一筆一劃之間的秘密。
作者:?曹紹升 陸巍 周俊 李小龍
AAAI大會(Association for the Advancement of Artificial Intelligence),是一年一度在人工智能方向的頂級會議之一,旨在匯集世界各地的人工智能理論和領(lǐng)域應(yīng)用的最新成果。該會議固定在每年的2月份舉行,由AAAI協(xié)會主辦。
第32屆AAAI大會-AAAI 2018將于2月2號-7號在美國新奧爾良召開,其中螞蟻金服人工智能部和新加坡科技大學(xué)合作的一篇基于漢字筆畫信息的中文詞向量算法研究的論文“cw2vec: Learning Chinese Word Embeddings with Stroke n-grams”被高分錄用(其中一位審稿人給出了滿分,剩下兩位也給出了接近滿分的評價(jià))。我們將在2月7日在大會上做口頭報(bào)告(Oral),歡迎大家一起討論交流。
單個(gè)英文字符(character)是不具備語義的,而中文漢字往往具有很強(qiáng)的語義信息。不同于前人的工作,我們提出了“n元筆畫”的概念。所謂“n元筆畫”,即就是中文詞語(或漢字)連續(xù)的n個(gè)筆畫構(gòu)成的語義結(jié)構(gòu)。
▲圖1?n元筆畫生成的例子
如上圖,n元筆畫的生成共有四個(gè)步驟。比如說,“大人”這個(gè)詞語,可以拆開為兩個(gè)漢字“大”和“人”,然后將這兩個(gè)漢字拆分成筆畫,再將筆畫映射到數(shù)字編號,進(jìn)而利用窗口滑動產(chǎn)生n元筆畫。其中,n是一個(gè)范圍,在上述例子中,我們將n取值為3, 4和5。
在論文中我們提出了一種基于n元筆畫的新型的損失函數(shù),如下:
其中,W和C分別為當(dāng)前詞語和上下文詞語,σ是sigmoid函數(shù),T(w)是當(dāng)前詞語劃窗內(nèi)的所有詞語集合,D是訓(xùn)練語料的全部文本。為了避免傳統(tǒng)softmax帶來的巨大計(jì)算量,這篇論文也采用了負(fù)采樣的方式。C'為隨機(jī)選取的詞語,稱為“負(fù)樣例”,λ是負(fù)樣例的個(gè)數(shù),而 則表示負(fù)樣例C'按照詞頻分布進(jìn)行的采樣,其中語料中出現(xiàn)次數(shù)越多的詞語越容易被采樣到。相似性sim(·,·)函數(shù)被按照如下構(gòu)造:
其中, 為當(dāng)前詞語對應(yīng)的一個(gè)n元筆畫向量,而 是其對應(yīng)的上下文詞語的詞向量。這項(xiàng)技術(shù)將當(dāng)前詞語拆解為其對應(yīng)的n元筆畫,但保留每一個(gè)上下文詞語不進(jìn)行拆解。S(w)為詞語w所對應(yīng)的n元筆畫的集合。在算法執(zhí)行前,這項(xiàng)研究先掃描每一個(gè)詞語,生成n元筆畫集合,針對每一個(gè)n元筆畫,都有對應(yīng)的一個(gè)n元筆畫向量,在算法開始之前做隨機(jī)初始化,其向量維度和詞向量的維度相同。
▲圖2?算法過程的舉例
如上圖所示,對于“治理 霧霾 刻不容緩”這句話,假設(shè)此刻當(dāng)前詞語恰好是“霧霾”,上下文詞語是“治理”和“刻不容緩”。首先將當(dāng)前詞語“霧霾”拆解成n元筆畫并映射成數(shù)字編碼,然后劃窗得到所有的n元筆畫,根據(jù)設(shè)計(jì)的損失函數(shù),計(jì)算每一個(gè)n元筆畫和上下文詞語的相似度,進(jìn)而根據(jù)損失函數(shù)求梯度并對上下文詞向量和n元筆畫向量進(jìn)行更新。
為了驗(yàn)證這項(xiàng)研究提出的cw2vec算法的效果,在公開數(shù)據(jù)集上,與業(yè)界最優(yōu)的幾個(gè)詞向量算法做了對比:
▲圖3 實(shí)驗(yàn)結(jié)果
上圖中包括2013年谷歌提出的word2vec的兩個(gè)模型skipgram和cbow,2014年斯坦福提出的GloVe算法,2015年清華大學(xué)提出的基于漢字的CWE模型,以及2017年最新發(fā)表的基于像素和偏旁的中文詞向量算法,可以看出cw2vec在word similarity,word analogy,以及文本分類和命名實(shí)體識別的任務(wù)中均取得了一致性的提升。同時(shí),這篇文章也展示了不同詞向量維度下的實(shí)驗(yàn)效果:
▲圖4 不同詞向量維度下的實(shí)驗(yàn)結(jié)果
上圖為不同維度下在word analogy測試集上的實(shí)驗(yàn)結(jié)果,左側(cè)為3cosadd,右側(cè)為3cosmul的測試方法。可以看出這項(xiàng)算法在不同維度的設(shè)置下均取得了不錯(cuò)的效果。此外,也在小規(guī)模語料上進(jìn)行了測試:
▲圖5 小訓(xùn)練數(shù)據(jù)下的實(shí)驗(yàn)結(jié)果
上圖是僅選取20%中文維基百科訓(xùn)練語料,在word similarity下測試的結(jié)果,skipgram, cbow和GloVe算法由于沒有利用中文的特性信息進(jìn)行加強(qiáng),所以在小語料上表現(xiàn)較差,而其余四個(gè)算法取得了不錯(cuò)的效果,其中cw2vec的算法在兩個(gè)數(shù)據(jù)集上均取得的了最優(yōu)效果。
▲圖6 案例分析結(jié)果
為了更好的探究不同算法的實(shí)際效果,這項(xiàng)研究專門選取了兩個(gè)詞語做案例分析。第一個(gè)是環(huán)境相關(guān)的“水污染”,然后根據(jù)詞向量利用向量夾角余弦找到與其語義最接近的詞語。GWE找到了一些和“污”字相關(guān)的詞語,比如“污泥”,“污漬”和“污垢”,而JWE則更加強(qiáng)調(diào)后兩個(gè)字“污染”GloVe找到了一些奇怪的相近詞語,比如“循環(huán)系統(tǒng)”,“神經(jīng)系統(tǒng)”。CWE找到的相近詞語均包含“水”和“污”這兩個(gè)字,猜測是由于其利用漢字信息直接進(jìn)行詞向量加強(qiáng)的原因。此外,只有cw2vec找到了“水質(zhì)”這個(gè)相關(guān)詞語,分析認(rèn)為是由于n元筆畫和上下文信息對詞向量共同作用的結(jié)果。第二個(gè)例子,特別選擇了“孫悟空”這個(gè)詞語,該角色出現(xiàn)在中國的名著《西游記》和知名日本動漫《七龍珠》中,cw2vec找到的均為相關(guān)的角色或著作名稱。
作為一項(xiàng)基礎(chǔ)研究成果,cw2vec在螞蟻和阿里的諸多場景上也有落地。在智能客服、文本風(fēng)控和推薦等實(shí)際場景中均發(fā)揮了作用。此外,不單單是中文詞向量,對于日文、韓文等其他語言也進(jìn)行類似的嘗試,相關(guān)的發(fā)明技術(shù)專利已經(jīng)申請近二十項(xiàng)。
我們希望能夠在基礎(chǔ)研究上追趕學(xué)術(shù)界、有所建樹,更重要的是,在具體的實(shí)際場景之中,能夠把人工智能技術(shù)真正的賦能到產(chǎn)品里,為用戶提供更好的服務(wù)。
福利-論文下載鏈接:
https://github.com/ShelsonCao/cw2vec/blob/master/cw2vec.pdf(請將網(wǎng)址復(fù)制至瀏覽器打開,或點(diǎn)擊閱讀原文)
— END —
詞向量作為文本的基本結(jié)構(gòu)——詞的模型,以其優(yōu)越的性能,受到自然語言處理領(lǐng)域研究人員的青睞。良好的詞向量可以達(dá)到語義相近的詞在詞向量空間里聚集在一起,這對后續(xù)的文本分類,文本聚類等等操作提供了便利,本文將詳細(xì)介紹如何使用word2vec構(gòu)建中文詞向量。
一、中文語料庫
本文采用的是搜狗實(shí)驗(yàn)室的搜狗新聞?wù)Z料庫,數(shù)據(jù)鏈接?http://www.sogou.com/labs/resource/cs.php
下載下來的文件名為: news_sohusite_xml.full.tar.gz
二、數(shù)據(jù)預(yù)處理
2.1 解壓并查看原始數(shù)據(jù)
cd 到原始文件目錄下,執(zhí)行解壓命令:
tar -zvxf news_sohusite_xml.full.tar.gz得到文件 news_sohusite_xml.dat, 用vim打開該文件,
vim news_sohusite_xml.dat?得到如下結(jié)果:
2.2 取出內(nèi)容
取出<content> ?</content> 中的內(nèi)容,執(zhí)行如下命令:
cat news_tensite_xml.dat | iconv -f gbk -t utf-8 -c | grep "<content>" > corpus.txt?得到文件名為corpus.txt的文件,可以通過vim 打開
vim corpus.txt得到如下效果:
?
2.3 分詞
注意,送給word2vec的文件是需要分詞的,分詞可以采用jieba分詞實(shí)現(xiàn),安裝jieba 分詞?
pip install jieba?對原始文本內(nèi)容進(jìn)行分詞,python 程序如下:?
1 ##!/usr/bin/env python2 ## coding=utf-83 import jieba4 5 filePath='corpus.txt'6 fileSegWordDonePath ='corpusSegDone.txt'7 # read the file by line8 fileTrainRead = []9 #fileTestRead = [] 10 with open(filePath) as fileTrainRaw: 11 for line in fileTrainRaw: 12 fileTrainRead.append(line) 13 14 15 # define this function to print a list with Chinese 16 def PrintListChinese(list): 17 for i in range(len(list)): 18 print list[i], 19 # segment word with jieba 20 fileTrainSeg=[] 21 for i in range(len(fileTrainRead)): 22 fileTrainSeg.append([' '.join(list(jieba.cut(fileTrainRead[i][9:-11],cut_all=False)))]) 23 if i % 100 == 0 : 24 print i 25 26 # to test the segment result 27 #PrintListChinese(fileTrainSeg[10]) 28 29 # save the result 30 with open(fileSegWordDonePath,'wb') as fW: 31 for i in range(len(fileTrainSeg)): 32 fW.write(fileTrainSeg[i][0].encode('utf-8')) 33 fW.write('\n')?
可以得到文件名為 corpusSegDone.txt 的文件,需要注意的是,對于讀入文件的每一行,使用結(jié)巴分詞的時(shí)候并不是從0到結(jié)尾的全部都進(jìn)行分詞,而是對[9:-11]分詞 (如行22中所示: fileTrainRead[i][9:-11] ),這樣可以去掉每行(一篇新聞稿)起始的<content> 和結(jié)尾的</content>。
同樣的,可以通過vim 打開分詞之后的文件,執(zhí)行命令:
vim corpusSegDone.txt得到如下圖所示的結(jié)果:
?三、構(gòu)建詞向量
3.1 安裝word2vec
pip install word2vec3.2 構(gòu)建詞向量
執(zhí)行以下程序:
import word2vec word2vec.word2vec('corpusSegDone.txt', 'corpusWord2Vec.bin', size=300,verbose=True)即可構(gòu)建詞向量,得到結(jié)果放在文件名為 corpusWord2Vec.bin的文件中。可以通過設(shè)定size 的大小來指定詞向量的維數(shù)。用vim打開生成的二進(jìn)制文件會出現(xiàn)亂碼,目前不知道解決方法。
3.3 顯示并使用詞向量
3.3.1 查看詞向量
import word2vec model = word2vec.load('corpusWord2Vec.bin') print (model.vectors)可以得到如下結(jié)果:
?3.3.2 查看詞表中的詞
import word2vec model = word2vec.load('corpusWord2Vec.bin') index = 1000 print (model.vocab[index]得到結(jié)果如下:
可以得到詞表中第1000個(gè)詞為 確保。
3.3.3 顯示空間距離相近的詞
一個(gè)好的詞向量可以實(shí)現(xiàn)詞義相近的一組詞在詞向量空間中也是接近的,可以通過顯示詞向量空間中相近的一組詞并判斷它們語義是否相近來評價(jià)詞向量構(gòu)建的好壞。代碼如下:
import word2vec model = word2vec.load('corpusWord2Vec.bin') indexes = model.cosine(u'加拿大') for index in indexes[0]:print (model.vocab[index])得到的結(jié)果如下:
可以修改希望查找的中文詞,例子如下:
?
四、二維空間中顯示詞向量
將詞向量采用PCA進(jìn)行降維,得到二維的詞向量,并打印出來,代碼如下:
1 #!/usr/bin/env python2 # coding=utf-83 import numpy as np4 import matplotlib5 import matplotlib.pyplot as plt6 7 from sklearn.decomposition import PCA8 import word2vec9 # load the word2vec model 10 model = word2vec.load('corpusWord2Vec.bin') 11 rawWordVec=model.vectors 12 13 # reduce the dimension of word vector 14 X_reduced = PCA(n_components=2).fit_transform(rawWordVec) 15 16 # show some word(center word) and it's similar words 17 index1,metrics1 = model.cosine(u'中國') 18 index2,metrics2 = model.cosine(u'清華') 19 index3,metrics3 = model.cosine(u'牛頓') 20 index4,metrics4 = model.cosine(u'自動化') 21 index5,metrics5 = model.cosine(u'劉亦菲') 22 23 # add the index of center word 24 index01=np.where(model.vocab==u'中國') 25 index02=np.where(model.vocab==u'清華') 26 index03=np.where(model.vocab==u'牛頓') 27 index04=np.where(model.vocab==u'自動化') 28 index05=np.where(model.vocab==u'劉亦菲') 29 30 index1=np.append(index1,index01) 31 index2=np.append(index2,index03) 32 index3=np.append(index3,index03) 33 index4=np.append(index4,index04) 34 index5=np.append(index5,index05) 35 36 # plot the result 37 zhfont = matplotlib.font_manager.FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-microhei.ttc') 38 fig = plt.figure() 39 ax = fig.add_subplot(111) 40 41 for i in index1: 42 ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='r') 43 44 for i in index2: 45 ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='b') 46 47 for i in index3: 48 ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='g') 49 50 for i in index4: 51 ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='k') 52 53 for i in index5: 54 ax.text(X_reduced[i][0],X_reduced[i][1], model.vocab[i], fontproperties=zhfont,color='c') 55 56 ax.axis([0,0.8,-0.5,0.5]) 57 plt.show()中文的顯示需要做特殊處理,詳見代碼 line: 37
下圖是執(zhí)行結(jié)果:
?
主要參考?
http://blog.csdn.net/zhaoxinfan/article/details/11069485
http://nbviewer.jupyter.org/github/danielfrg/word2vec/blob/master/examples/word2vec.ipynb
?
總結(jié)
以上是生活随笔為你收集整理的AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超级好用的使用python批量更新MYs
- 下一篇: CCKS 2018 | 最佳论文:南京大