趙浩新,俞敬松,林 杰
(1. 北京大學(xué) 軟件與微電子學(xué)院,北京 102600;2. 中國(guó)人民大學(xué) 信息學(xué)院,北京 100872)
數(shù)據(jù)表示是機(jī)器學(xué)習(xí)任務(wù)的基礎(chǔ)問(wèn)題,在自然語(yǔ)言處理(natural language processing,NLP)領(lǐng)域中,任務(wù)轉(zhuǎn)換為問(wèn)題的第一步便是文本數(shù)字化。1954年,Harris提出分布式假說(shuō)——“上下文相似的詞,其語(yǔ)義也相似”。這為以后的詞向量研究提供了理論基礎(chǔ)。
在NLP中,單詞最初采用one-hot編碼方式表示。但是這種表示方式,存在語(yǔ)義鴻溝、維度災(zāi)難等問(wèn)題。2006年,Bengio等在神經(jīng)網(wǎng)絡(luò)語(yǔ)言模型(neural network language model,NNLM)中使用分布式方式構(gòu)造并訓(xùn)練了詞向量[1]。Andriy Mnih等在此基礎(chǔ)上引入層級(jí)思想[2]。隨后Mikolov提出使用循環(huán)神經(jīng)網(wǎng)絡(luò),構(gòu)建語(yǔ)言模型,有效利用了長(zhǎng)距離文本信息[3]。2013年Mikolov等總結(jié)C&W、ivLBL等模型特點(diǎn),對(duì)模型進(jìn)行了簡(jiǎn)化,提出了Word2Vec模型[4-6]。Yoav Goldberg等從矩陣分解的角度分析了Word2Vec模型[7],Shihao Ji等基于該理論提出了WordRank模型,在使用更少的數(shù)據(jù)基礎(chǔ)上達(dá)到了不次于Word2Vec的效果[8]。隨后斯坦福大學(xué)Jeffrey Pennington等引入單詞共現(xiàn)信息,提出了GloVe模型[9]。然而現(xiàn)有的模型都是基于統(tǒng)計(jì)學(xué)理論,無(wú)法為未登錄詞、低頻詞等產(chǎn)生高質(zhì)量的詞向量。P Bojanowski等提出使用sub-word信息緩解這一問(wèn)題[10]。Yoval Pinter等提出從字符粒度構(gòu)建詞向量,有效解決了未登錄詞等問(wèn)題[11]。
中文詞向量研究大都借鑒英文詞向量研究技術(shù)。清華大學(xué)陳新雄等基于Word2Vec中CBOW模型提出了一種混合漢字后的中文詞向量模型[12]。該模型在構(gòu)造詞向量的時(shí)候根據(jù)漢字出現(xiàn)位置引入字向量,豐富詞向量構(gòu)造信息,成功添加了漢字信息。哈工大孫亞明等提出在使用上下文信息預(yù)測(cè)當(dāng)前字的同時(shí)預(yù)測(cè)該字的部首[13]。
螞蟻金服團(tuán)隊(duì)從筆畫(huà)角度出發(fā),提出Stroke n-gram模型[14]。參考sub-word模型將中文筆畫(huà)縮減為5種,將漢字詞組拆分為對(duì)應(yīng)筆畫(huà)序列,但是這需要投入巨大成本構(gòu)建新的漢字筆畫(huà)映射關(guān)系。且部分詞組筆畫(huà)序列完全相同,例如,“大夫”“丈夫”。
現(xiàn)有的中文詞向量研究很少?gòu)墓P畫(huà)粒度出發(fā),根據(jù)筆畫(huà)序列直接構(gòu)造漢字字向量。在本文中,我們擴(kuò)展CBOW模型,提出了一種新的基于筆畫(huà)的中文字向量技術(shù)Stroke2Vec,旨在學(xué)習(xí)筆畫(huà)序列生成漢字的規(guī)律。
測(cè)評(píng)工作對(duì)比了Stroke2Vec、Word2Vec、GloVe等模型產(chǎn)生字向量在命名實(shí)體識(shí)別、中文分詞任務(wù)上的實(shí)際效果,以Word2Vec計(jì)算得到的字向量作為baseline。結(jié)果表明,在命名實(shí)體任務(wù)中,Stroke2Vec模型效果均優(yōu)于Word2Vec、GloVe;中文分詞任務(wù)中,模型效果與Word2Vec、GloVe效果基本相同。通過(guò)實(shí)驗(yàn)分析,模型可以在一定程度上從筆畫(huà)序列中提取漢字部件信息,并生成字向量,為低頻字、未登錄字做補(bǔ)充,且模型在訓(xùn)練過(guò)程中需要的語(yǔ)料數(shù)據(jù)少于其他模型。
漢字可以分為兩種: 單體字、合體字。具有相同部件的合體字,大都在語(yǔ)義上具有一定的相關(guān)度。如“語(yǔ)、訴、話(huà)”,都具有相同的“言字旁”。
漢字的構(gòu)造符合“筆畫(huà)—部件—漢字”的規(guī)律。然而漢字是標(biāo)準(zhǔn)的“方塊字”。學(xué)習(xí)筆畫(huà)構(gòu)造漢字的規(guī)律,面臨著以下兩種困難:
(1) 漢字由部件組成,部件由筆畫(huà)組成。但是部件在組成漢字時(shí),其在漢字中位置不同,會(huì)導(dǎo)致語(yǔ)義的變化。而筆畫(huà)序列很難捕捉到部件的“二維”位置信息,如“杳、杲”的部件完全相同,但是位置不同,導(dǎo)致語(yǔ)義完全不同。
(2) 漢字的筆畫(huà)序列不能唯一地確定一個(gè)漢字,即漢字筆畫(huà)和漢字之間是一對(duì)多的關(guān)系。而且相同筆畫(huà)序列的漢字語(yǔ)義完全不同,如“人、八、乂”筆畫(huà)序列均為“撇、捺”,“日、曰”筆畫(huà)序列為“豎、橫折、橫、橫”,它們的筆畫(huà)序列完全一致,但語(yǔ)義毫不相關(guān)。
我們仔細(xì)研究了漢字的構(gòu)成規(guī)律,以及現(xiàn)有的字向量技術(shù),將Stroke2Vec模型劃分為上下文信息抽取組件、字向量生成組件、注意力組件,如圖1所示。
圖1 Stroke2Vec整體結(jié)構(gòu)
Stroke2Vec擴(kuò)展了Word2Vec中的CBOW模型。因此,Stroke2Vec模型是基于當(dāng)前字的上下文信息,計(jì)算當(dāng)前字的概率。
本文中使用單獨(dú)的網(wǎng)絡(luò)結(jié)構(gòu)替換Word2Vec模型中上下文信息矩陣,稱(chēng)作上下文信息抽取器。該模塊借鑒了Cao等[15]等提出的模型,使用卷積神經(jīng)網(wǎng)絡(luò),捕獲更加豐富的上下文信息,在輸出層新增全鏈接層,用于將卷積神經(jīng)網(wǎng)絡(luò)提取的上下文信息映射為任意維度的向量,解耦合上下文信息抽取器、字向量生成器輸出向量的維度關(guān)系。
如圖2所示,在輸入層中為了計(jì)算更加豐富的上下文信息,我們引入了上下文漢字的拼音、部首、拆字等特征,而非簡(jiǎn)單的漢字id,其中拆字信息,是指一個(gè)漢字拆分為其他漢字的形式。如“林”拆分為“木 木”,“樹(shù)”拆分為“權(quán) 寸”等。而漢字是“音形義”相結(jié)合的文字。
圖2 上下文信息抽取器模型結(jié)構(gòu)
通過(guò)引入漢字的拼音、部首等信息,可以使得上下文包含的信息更加的豐富,有利于提取具有辨識(shí)度的特征。
中文漢字主要分為兩類(lèi),單體字與合體字。據(jù)統(tǒng)計(jì),90%以上的漢字為合體字。單體字是指那些無(wú)法進(jìn)行拆分的漢字,即由部件直接組成的漢字,這些單體字構(gòu)成了合體字的原子部件。合體字便是由這些原子部件按照其在二維空間中的不同位置組合而成。
假設(shè)筆畫(huà)構(gòu)字符合某種規(guī)律,我們做出以下定義:
S={橫、豎、撇、捺、點(diǎn)、…},si∈RN,N表示筆畫(huà)向量維度大??;
SC={筆畫(huà)所有排列組合},SCi∈RK×N,K表示漢字具有筆畫(huà)序列最大長(zhǎng)度;
W={一、二、三、…},wi∈RM,中文漢字集合,M表示漢字字向量維度;
具有相同部件的合體字在語(yǔ)義上具有一定的相關(guān)度:
“甜”——“舌”+“甘”,用舌頭品嘗甘甜的東西后的感覺(jué)。
“話(huà)”——“言”+“舌”,用嘴說(shuō)出來(lái)的文字。
“凝”——“兩點(diǎn)水”+“疑”,氣體變?yōu)橐后w或液體變?yōu)楣腆w,(疑,止也)。
對(duì)于大多數(shù)合體字,其筆畫(huà)序列完全不同,但又局部相似,即構(gòu)成合體字的筆畫(huà)是局部有序的。因此我們采用卷積神經(jīng)網(wǎng)絡(luò)提取筆畫(huà)序列中的部件信息。而且CNN具有平移不變性[16],不會(huì)因?yàn)椴考跐h字中位置不同而無(wú)法捕捉。文獻(xiàn)[17]已經(jīng)證明CNN在翻譯任務(wù)中有不俗的表現(xiàn),可以用于處理序列數(shù)據(jù)。
字向量生成組件將注意力組件計(jì)算筆畫(huà)權(quán)重得到的新的筆畫(huà)序列作為輸入,然后經(jīng)過(guò)CNN卷積神經(jīng)網(wǎng)絡(luò)計(jì)算得到字向量。
本文中提出了三種字向量生成器,如圖3所示。
CNN-1表示,我們使用不同寬度的卷積核提取不同筆畫(huà)長(zhǎng)度的部件,通過(guò)最大池化過(guò)濾最有效漢字部件,接著直接使用這些部件序列對(duì)漢字進(jìn)行表示,然后通過(guò)全鏈接層映射成任意維度的字向量。
CNN-2、CNN-3則是在卷積層提取的部件特征的基礎(chǔ)上,使用卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)部件組合形成漢字的規(guī)律。區(qū)別在于,CNN-2是雙卷積層連接池化層。CNN-3是標(biāo)準(zhǔn)的雙卷積神經(jīng)網(wǎng)絡(luò)。
正如前文所述,不同漢字可能具有相同的筆畫(huà)序列。我們通過(guò)漢字拼音等外部信息,計(jì)算了筆畫(huà)對(duì)于漢字的貢獻(xiàn)度,如式(1)所示。
圖3 字向量生成器網(wǎng)絡(luò)結(jié)構(gòu)
本文采用乘法注意力機(jī)制作為計(jì)算筆畫(huà)貢獻(xiàn)度的方法,如式(2)所示。
乘法注意力組件如圖4所示。
圖4 乘法注意力組件
Stroke2Vec模型通過(guò)上下文信息抽取器計(jì)算當(dāng)前漢字的上下文信息,使用注意力組件和字向量構(gòu)造器,計(jì)算當(dāng)前漢字的字向量,然后這兩個(gè)向量進(jìn)行相似度計(jì)算,使用softmax歸一化后,表示當(dāng)前漢字的概率,如式(3)所示。
(3)
采用負(fù)采樣算法,則目標(biāo)函數(shù)如式(4)所示。
其中,NEG(w)表示當(dāng)前字w的負(fù)采樣集合。
本文中Word2Vec[注]https://github.com/svn2github/word2vec工具、GloVe[注]http://nlp.stanford.edu/projects/glove/詞向量開(kāi)源工具均來(lái)自官方開(kāi)源代碼。
為保證一致性,模型窗口大小為3,最低詞頻為3,負(fù)采樣個(gè)數(shù)為5,詞向量維度為100。然后我們使用相同的維基百科語(yǔ)料訓(xùn)練了Word2Vec的CBOW模型、GloVe模型。
本文數(shù)據(jù)主要分為兩類(lèi),詞向量訓(xùn)練語(yǔ)料、測(cè)評(píng)任務(wù)語(yǔ)料。
詞向量訓(xùn)練語(yǔ)料主要分為5種: 中文維基百科數(shù)據(jù)[注]https://dumps.wikimedia.org/zhwiki/、漢字筆畫(huà)數(shù)據(jù)[注]https://github.com/DongSky/zhHanSequence、漢字拼音數(shù)據(jù)[注]https://github.com/cleverdeng/pinyin.py、漢字偏旁部首數(shù)據(jù)[注]https://github.com/yyd27/Chinese_radicals、漢字拆字?jǐn)?shù)據(jù)[注]https://github.com/kfcd/chaizi。其中中文維基百科語(yǔ)料選自維基百科官方2017年12月23日開(kāi)源數(shù)據(jù)。其余4種語(yǔ)料來(lái)源于Github官方開(kāi)源數(shù)據(jù)。
測(cè)評(píng)任務(wù)分為命名實(shí)體識(shí)別、中文分詞。其中命名實(shí)體識(shí)別語(yǔ)料來(lái)源于微軟亞洲研究院開(kāi)源的中文命名實(shí)體語(yǔ)料,共43 364行,實(shí)體分為人名、地名、機(jī)構(gòu)名三類(lèi)。其中人名共11 466個(gè)、地點(diǎn)名稱(chēng)共17 068個(gè)、機(jī)構(gòu)名稱(chēng)12 695個(gè),按照9∶1比例,將數(shù)據(jù)分為訓(xùn)練集、評(píng)測(cè)集。
分詞任務(wù)數(shù)據(jù)為NLPCC-2016年中文分詞語(yǔ)料,訓(xùn)練文本20 135行,測(cè)試數(shù)據(jù)2 052行。
命名實(shí)體識(shí)別、中文分詞任務(wù)可以看作序列標(biāo)注問(wèn)題。本文采用Huang等提出的Bi-LSTM+CRF模型作為評(píng)測(cè)模型[18],對(duì)比不同字向量的效果。評(píng)測(cè)模型的代碼來(lái)自Github中fork最多的開(kāi)源項(xiàng)目。評(píng)測(cè)指標(biāo)嚴(yán)格按照分詞邊界、命名實(shí)體邊界計(jì)算準(zhǔn)確率、召回率、F1值。
在命名實(shí)體任務(wù)中共有四大種類(lèi)的標(biāo)簽: PER、LOC、ORG、O,分別對(duì)應(yīng)數(shù)據(jù)中的nr、nt、ns、o標(biāo)簽,表示任務(wù)、地點(diǎn)、組織機(jī)構(gòu)、非實(shí)體。又根據(jù)實(shí)體詞的個(gè)數(shù)、漢字在實(shí)體中的位置進(jìn)一步細(xì)化了四個(gè)類(lèi)別的標(biāo)簽: S、B、I、E,當(dāng)實(shí)體詞為單獨(dú)一個(gè)字時(shí),在標(biāo)簽名稱(chēng)后添加后綴“-S”,例如“我 今天 在 京(LOC-S)”,至于“B、I、E”則按照漢字在實(shí)體中的具體位置添加后綴??傆?jì)有16種標(biāo)簽。
本節(jié)橫向?qū)Ρ攘瞬煌P彤a(chǎn)生的字向量在命名實(shí)體識(shí)別任務(wù)中的效果,如表1所示主要對(duì)比了Word2Vec中CBOW模型(后面使用Word2Vec特指CBOW模型)、GloVe模型、Stroke2Vec模型,混合Word2Vec詞向量與Stroke2Vec字向量結(jié)果,以及混合GloVe詞向量與Stroke2Vec字向量結(jié)果5種實(shí)驗(yàn)。
表1 不同模型NER效果展示(%)
然后縱向?qū)Ρ攘嘶诠P畫(huà)字向量模型中不同結(jié)構(gòu)字向量構(gòu)成器組件產(chǎn)生的字向量,以及上下文信息抽取組件中不引入拼音數(shù)據(jù)情況下生成的字向量在NER任務(wù)中的效果,如表2所示。
表2 不同字向量生成器NER效果展示(%)
在中文分詞任務(wù)中,共有4種標(biāo)簽{B、E、M、S},表示漢字在詞組中的位置。以切詞最終結(jié)果為標(biāo)準(zhǔn),本節(jié)橫向?qū)Ρ攘瞬煌P彤a(chǎn)生的字向量在切詞任務(wù)中的效果、縱向?qū)Ρ攘瞬煌窒蛄可善鞯那性~效果,如表3、表4所示。
表3 不同模型CWS效果展示(%)
表4 不同字向量生成器分詞結(jié)果(%)
2.5.1 Stroke2Vec模型分析
漢字是部件在二維空間中的組合構(gòu)成,部件是筆畫(huà)在二維空間中的組合構(gòu)成。本文針對(duì)此提出了三種字向量生成器的變種,實(shí)驗(yàn)結(jié)果(表2、表4)顯示,使用單層CNN結(jié)構(gòu)的字向量生成器效果最好。即從筆畫(huà)序列中提取漢字部件信息,然后將部件信息組合映射為漢字向量,較符合筆畫(huà)組合形成漢字的規(guī)律。
針對(duì)此種情況,隨機(jī)抽取了50個(gè)漢字的字向量,采用余弦相似度算法計(jì)算最相似的漢字,最終得到50組相似漢字,其中有32個(gè)漢字字形較相似,18個(gè)漢字無(wú)法直觀判斷,如表5所示。
表5 漢字相似度展示
Stroke2Vec可以有效地捕捉到存在于筆畫(huà)序列中的局部漢字部件信息,如“和”最相似的漢字為“種”。但是由于卷積神經(jīng)網(wǎng)絡(luò)具有平移不變性的特征,也會(huì)對(duì)生成的字向量產(chǎn)生負(fù)影響,如“的”“閬”都具有部件“白”。
如圖5、圖6 所示,為注意力組件計(jì)算得到“日”、“曰”筆畫(huà)貢獻(xiàn)度,由此生成的新的筆畫(huà)序列雖然可以區(qū)分這兩個(gè)字,但是與實(shí)際情況有較大差距。每一個(gè)真實(shí)筆畫(huà)對(duì)于漢字的貢獻(xiàn)度都不相同,但它們之間的差異并不是很大,即這些筆畫(huà)貢獻(xiàn)度之間應(yīng)該相對(duì)平滑。
圖5 “日”字筆畫(huà)貢獻(xiàn)度
圖6 “曰”字筆畫(huà)貢獻(xiàn)度
2.5.2 橫向分析
在NER任務(wù)中,Stroke2Vec模型的表現(xiàn)優(yōu)于GloVe和Word2Vec,在CWS任務(wù)中,三者基本持平,Stroke2Vec模型表現(xiàn)略次。使用Stroke2Vec生成字向量替換Word2Vec中UNK字后,在NER任務(wù)中有較好的表現(xiàn),與CWS任務(wù)持平。使用Stroke2Vec替換GloVe中UNK字后,在NER、CWS任務(wù)中效果基本不變。因此本文提出模型Stroke2Vec生成的字向量一定程度上緩解了有未登錄字、低頻字產(chǎn)生的負(fù)面影響。
在NER任務(wù)中,命名實(shí)體一般以名詞居多。一些漢字含有的名詞性部件可以增強(qiáng)這種信息,使其免于誤判。如“組織”,本義偏動(dòng)詞性,但是在實(shí)際文本中,會(huì)頻繁出現(xiàn)“某某組織”這種機(jī)構(gòu)詞語(yǔ),導(dǎo)致模型誤判“組織”為機(jī)構(gòu)實(shí)體。隨機(jī)抽取了Word2Vec、GloVe模型共同出現(xiàn)錯(cuò)誤但不在Stroke2Vec中的樣例如表6所示。
表6 Word2Vec/GloVe/Stroke2Vec在NER中錯(cuò)誤示例
Stroke2Vec模型可以從筆畫(huà)序列中提取部件信息生成字向量,這對(duì)于命名實(shí)體識(shí)別任務(wù)產(chǎn)生了一定的效果。但是,現(xiàn)有的Stroke2Vec模型依然存在以下不足:
(1) 注意力組件生成筆畫(huà)貢獻(xiàn)度與實(shí)際相比仍有較大差異。漢字筆畫(huà)貢獻(xiàn)度應(yīng)該與部件一一對(duì)應(yīng),是局部平滑的,而現(xiàn)有模型無(wú)法做到。
(2) 字向量生成組件可以從筆畫(huà)序列中提取部件信息,但是并不能判斷筆畫(huà)序列中哪一部分筆畫(huà)應(yīng)該組成什么樣的部件。
因此在未來(lái)的研究中,可以基于這兩點(diǎn)出發(fā),嘗試更加有效的注意力機(jī)制、網(wǎng)絡(luò)結(jié)構(gòu),對(duì)筆畫(huà)序列進(jìn)行自動(dòng)切分,提升模型的效果。