王 路, 李壽山
(蘇州大學 計算機科學與技術學院 江蘇 蘇州 215006)
當前所有問答相關的研究都是基于正式文本的,可是在實際應用中會存在許多問答文本是非正式的情況.在非正式文本中,沒有問號標志的地方經(jīng)常會存在許多子問題,例如:問題“大家好 是正品嗎,電池耐用嗎.是全新的嗎”當中并沒有出現(xiàn)問號,根據(jù)空格、逗號、頓號、問號、感嘆號和句號作為分隔符可以被劃分為4個子句“大家好”、“是正品嗎”、“電池耐用嗎”和“是全新的嗎”,第1個子句不是問題,而后面的3個子句分別是3個問題.有問號標志的地方,也不一定是問題,例如:根據(jù)上面的劃分規(guī)則,問題“不是用來玩游戲?就是用來辦公 買pro好還是air好”可以被劃分為三個子句“不是用來玩游戲”、“就是用來辦公”和“買pro好還是air好”,“就是用來辦公”不是一個問題,“買pro好還是air好”是一個問題,雖然子句“不是用來玩游戲”以問號結尾,但是它并不是一個問題.
在本文中,我們關注于非正式文本的問題識別.我們從產(chǎn)品評論網(wǎng)站上收集了許多非正式文本的問題,并且人工標注了一部分問題.由于變分自編碼器的廣泛應用以及注意力機制在自然語言處理領域取得的顯著成果,我們決定結合兩者來進行問題識別.
文獻[1-2]利用人工設置的規(guī)則創(chuàng)建了一個高準確性的分句系統(tǒng).文獻[3]利用深度學習得出特征的表示,再將英文字符中每個字符都作為標注位,利用序列標注模型條件隨機場(conditional random filed, CRF)來進行標注.文獻[4]利用CRF來進行文言文的分句.文獻[5]將語音識別中單詞與單詞之間的空格設置為邊界,利用支持向量機(support vector machine, SVM)對每一個邊界進行分類.文獻[6]采用了遞歸卷積神經(jīng)網(wǎng)絡對神經(jīng)心理學的記敘文本進行句子切分.文獻[7]研究了中文中逗號的作用,利用SVM對逗號進行分類,從而進行分句.我們的任務與上述任務都是對一段文字進行分類,與上述任務不同的地方在于,上述文本是對斷句的位置進行分類,我們的任務是判斷子句是否為問題.
當前半監(jiān)督方法在自然語言處理領域獲得了廣泛的應用.文獻[8]利用狄利克雷過程混合模型來進行新聞話題檢測.文獻[9]利用self-training來進行中文問答模式的學習.文獻[10]利用tri-training來進行多標記文檔分類.文獻[11]利用標簽傳播(label propagation,LP)來進行問答分類.我們采用半監(jiān)督神經(jīng)網(wǎng)絡模型-變分自編碼器來進行問題識別.
淘寶是中國最大的電子商務平臺,我們從淘寶的“問大家”板塊收集了200 000個問題文本,這些問題主要來自于數(shù)碼領域.并且我們利用句子切分工具將問題文本切分成子句的集合.為了確保較好的一致性,在進行了多次的少量標注后,我們提出了一些標注規(guī)范.然后,讓更多人根據(jù)該標注規(guī)范來標注整個數(shù)據(jù)集.我們根據(jù)子句的順序來進行判斷,遇到是問題的子句直接標注它的序號,如:
例1問題:是正品嗎?有點不放心?萬一是翻新怎么辦?標注:1,3.
例2問題:像素好不好?容易發(fā)熱嗎 充電多久.標注:1,2,3.
例3問題:親們 網(wǎng)絡怎么樣…不連續(xù)使用的話,可以用多久?標注:2,4.
我們一共標注了3 000個問題文本,一共切分出了5 455個子句.其中4 027個子句屬于“問題”類別,1 428個子句屬于“非問題”類別.對于每個問題文本,我們安排了兩位標注人員來進行標注,一致性檢驗kappa值為0.89.為了應對兩位標注人員標注不一致的情況,我們安排了一位熟練的標注人員來檢查,確保標注的一致性.
長短期記憶(long short-term memory, LSTM)網(wǎng)絡是一種特定形式的循環(huán)神經(jīng)網(wǎng)絡(recurrent neural network, RNN),它使用記憶門和遺忘門相結合的策略,可以解決傳統(tǒng)RNN在長序列上存在的梯度消失和梯度爆炸的問題.LSTM結構示意圖如圖1所示.
LSTM利用記憶單元對歷史信息進行記錄,并通過3個控制門來進行信息的更新.LSTM在t時刻的更新為
it=σ(Wixt+Uiht-1+bi),ft=σ(Wfxt+Ufht-1+bf),ot=σ(Woxt+Uoht-1+bo),
其中:xt為LSTM在t時刻的輸入;ht-1為LSTM在t-1時刻的輸出;ct為記憶單元在t時刻的候選值;W、U是參數(shù)矩陣;b是偏置向量;σ表示Logistic函數(shù);符號?表示向量的Hadamard積;遺忘門ft用來決定當前時刻哪些舊信息需要從記憶單元中拋棄;輸入門it決定當前時刻記憶單元中需要存儲哪些新的信息;輸出門ot決定了當前時刻記憶單元中哪些信息需要輸出.遺忘門ft與上一個時刻記憶單元的值ct-1相乘,得到上一時刻記憶單元保存下的信息,輸入門it與當前時刻記憶單元的候選值ct相乘,得到當前時刻新加入記憶單元的信息,將兩者相加,得到當前時刻記憶單元的值ct.使用tanh函數(shù)將記憶單元ct的值映射到-1與1之間,起到穩(wěn)定數(shù)值的作用.最后將輸出門ot與tanh(ct)相乘,得到LSTM單元在t時刻的輸出ht.
文獻[12-13]是LSTM的一種改進版本,C-LSTM將詞向量和標簽值都作為輸入,我們修改了LSTM的公式,將標簽值y加入到輸入門、遺忘門和輸出門之中.所用公式為
it=σ(Wixt+Uiht-1+Viy),ft=σ(Wfxt+Ufht-1+Vfy),ot=σ(Woxt+Uoht-1+Voy),
在本節(jié)中,我們提出了一個基于變分自編碼器的問題識別方法,即VAE-C,其結構如圖2所示.VAE-C主要由3個部分組成:分類器qφ(y|x);編碼器qφ(z|x,y)以及解碼器pθ(x|y,z).
1) 基于注意力機制的分類器, 如圖2(a)所示.
首先,我們采用LSTM對問題進行編碼,從而獲取每個詞向量的上下文信息,公式為H=LSTM(X),然后,通過公式計算得到句子的注意力權重α,并歸一化,α=softmax(tanh(WAttH+bAtt)),最后,我們將α與HT相乘,并連接一個隱藏層,從而進行分類,公式為y=sigmoid(WHid(αHT)+bHid),其中WHid(αHT)+bHid的維度是1,并且由于是二分類,所以輸出層的隱藏函數(shù)使用sigmoid函數(shù).
圖1 LSTM結構示意圖Fig.1 Structure of LSTM
圖2 基于變分自編碼器的問題識別模型Fig.2 Question detection model based on variational auto-encoder
2) 編碼器,如圖2(b)所示.
3) 解碼器,如圖2(c)所示.
解碼器是給定隱變量z和標簽值y,生成x的概率分布的條件生成模型為pθ(x|y,z)=D(x|fdec(y,z)).其中fdec(·)是解碼函數(shù),用來參數(shù)化概率分布D.D是輸入數(shù)據(jù)的高斯概率分布.本實驗中采用上文介紹的C-LSTM作為解碼器,可以通過C-LSTM構建分類器和自編碼器之間的聯(lián)系,通過標簽來引導自編碼器學習出樣本的共性,從而重構出正確的樣本,并且更新分類器的參數(shù).
VAE-C模型通過已標注樣本和未標注樣本聯(lián)合訓練更新模型參數(shù),目標函數(shù)為
① 數(shù)據(jù)設置.采用第二節(jié)內(nèi)容介紹的數(shù)據(jù)集作為實驗數(shù)據(jù).該數(shù)據(jù)包含5 455個子句.我們將數(shù)據(jù)隨機分為訓練集(每個類別的80%)和測試集(每個類別剩下的20%).此外,將來自訓練集的10%的數(shù)據(jù)作為開發(fā)集,用于學習算法中的參數(shù)調整.② 詞切分和詞向量訓練. 采用Jieba(https:∥pypi.python.org/pypi/jieba/)來進行分詞,并且采用word2vec[14]來訓練詞向量.訓練詞向量的數(shù)據(jù)來自數(shù)碼領域,共計200 000條問答對.詞向量維度設置為100.③ 句子切分. 采用斯坦福大學自然語言處理實驗室公布的CoreNLP(https:∥stanfordnlp.github.io/CoreNLP/download.html)工具來進行句子切分.④ 模型參數(shù). 實驗中所有模型使用深度學習開源框架Keras(http:∥Keras.io/)搭建,后端使用Theano(http:∥deeplearning.net/software/theano/)進行計算.模型中所有的超參數(shù)都是通過開發(fā)集的性能來進行調整.LSTM的單元數(shù)為128,C-LSTM的單元數(shù)為100.Batch size設置為64.采用Adam[15]作為優(yōu)化器,優(yōu)化器的學習率為0.001,迭代次數(shù)為30.
評價標準和顯著性測試:我們用標準的精確率(P)、召回率(R)、F值和準確率來評價性能.我們采用t測試來評價兩個方法間的顯著性程度.
最大熵(MaxEnt)是全監(jiān)督方法,利用已標注樣本的詞特征訓練的最大熵分類器.LSTM是全監(jiān)督方法,利用已標注樣本的詞向量訓練的LSTM分類器.Self-training[9]是半監(jiān)督方法,利用整個特征空間構建分類器,并用其迭代加入置信度最高的樣本擴充標注樣本集合.Tri-training[10]是半監(jiān)督方法,利用3個有較大差異的強分類器,采用“少數(shù)服從多數(shù)”的策略來產(chǎn)生偽標記樣本. 標簽傳播(LP)[11]是半監(jiān)督方法,利用已標注樣本,通過標簽傳播方法預測未標注樣本的類別,將這些已經(jīng)確定類別的樣本全部作為訓練樣本,訓練分類器.
ATT是全監(jiān)督方法,具體實現(xiàn)中,只利用了圖2(a)所示的基于注意力機制的分類器.VAE是半監(jiān)督方法,具體實現(xiàn)中,將圖2(a)所示的基于注意力機制的分類器替換成了一個全連接的LSTM分類器.VAE+ATT是半監(jiān)督方法,具體實現(xiàn)中,同時利用了注意力機制和變分自編碼器,與圖2保持一致.
表1和表2給出了不同問題識別方法的總體性能及每個類別上面的性能,所有的半監(jiān)督方法均添加了一倍的未標注樣本.
表1 不同問題識別方法的整體性能Tab.1 Overall performances of different approaches to question detection
表2 不同問題識別方法在每個類別中的性能Tab.2 Performances of different approaches to question detection in each category
從表2中我們可以發(fā)現(xiàn):在全監(jiān)督方法中,我們提出的ATT模型相較于兩種基線方法MaxEnt和LSTM在F值和準確率上均有一定的提升.在半監(jiān)督方法中,LP的性能較差,兩個指標均比全監(jiān)督方法差.但是我們提出的方法均顯著好于所有的基線方法,特別是在“非問題”這個類別中,VAE+ATT模型的R值和F值比最好的基線方法Tri-training分別提升了0.045和0.027.此外,VAE+ATT的性能在F值和準確率上均優(yōu)于VAE.該結果表明了問題識別中采用注意力機制的重要性.測試結果表明我們的方法帶來的性能提升具有統(tǒng)計顯著性(p-value<0.05).
圖3、圖4給出了加入不同比例未標注樣本時各半監(jiān)督方法的準確率和F值.從圖中我們可以發(fā)現(xiàn),LP模型在樣本提升時性能也得到一定提升,不過還是落后別的半監(jiān)督方法很多.self-training和tri-training性能較為接近,在添加樣本時存在一定小范圍波動,性能逐漸收斂.VAE和VAE+ATT的性能明顯好于別的所有的半監(jiān)督方法,隨著未標注樣本數(shù)目的增加,模型性能得到了一定的提升,不過模型的性能在添加三倍樣本時達到收斂.并且VAE+ATT的性能穩(wěn)定高于VAE.實驗結果表明,變分自編碼器和注意力機制的結合可以有效提升問題識別的性能.
圖3 不同半監(jiān)督方法的準確率Fig.3 Accuracy of different semi-supervised methods
圖4 不同半監(jiān)督方法的macro-F值Fig.4 Macro-F of different semi-supervised methods
為了更好地理解注意力機制,并且檢驗注意力機制是否可以獲取問題句子中的關鍵信息,我們對注意力權重α進行了分析.如:“不要買垃圾電腦”的注意力權值分別為:不要-0.31、買-0.22、垃圾-0.29、電腦-0.18;“大學學CAD用可以嗎”的注意力權值分別為:大學-0.06、學-0.04、CAD-0.02、用-0.06、可以-0.37、嗎-0.45;“手機像素怎么樣”的注意力權值分別為:手機-0.19、像素-0.19、怎么樣-0.62.從而我們可以看出注意力機制可以挑選出和分類較為相關的詞:“可以”,“嗎”以及“怎么樣”這些詞和“問題”這一類較為相關.“不要”以及“垃圾”這些詞和“非問題”這一類較為相關.
為了理解未標注樣本對于分類效果的提升,我們抽取出了樣例進行分析.在全監(jiān)督分類的時候,分類器將“運存不是3 g嗎,怎么玩王者榮耀還這么卡”的第一個子句“運存不是3 g嗎”分類為問題文本,其實這是一句強調句,并不是問題.在半監(jiān)督分類時,分類器添加了“屏幕不是4 K的嘛,為啥包裝盒上寫的2 K”和“不是固態(tài)硬盤的嗎?為什么我是機械的?”這兩個未標注樣本,這兩個樣本中的“屏幕不是4 K的嘛”和“不是固態(tài)硬盤的嗎”都是強調句,通過學習這些特征,分類器可以進行正確分類.
本文構建了一個問題識別語料庫,用于研究非正式文本的問題識別方法.在此基礎上,本文提出了一種基于變分自編碼器的問題識別方法.該方法結合了變分自編碼器以及注意力機制,可以充分利用海量的未標注樣本來提升模型性能.實驗結果表明,本文提出的方法能夠顯著提升問題識別的性能.下一步工作中,我們將測試本文的方法在其他領域或其他語言的問題識別任務中的有效性.此外,我們將進一步修改分類器,或者采用其他深度學習的半監(jiān)督方法,如生成對抗網(wǎng)絡來提升問題識別的性能.