李茂勝,王天一
(貴州大學(xué) 大數(shù)據(jù)與信息工程學(xué)院,貴陽 550025)
進入互聯(lián)網(wǎng)時代以來,各行各業(yè)的數(shù)據(jù)呈指數(shù)級增長,面對這些海量的數(shù)據(jù),以往的搜索引擎[1]已逐漸不能滿足用戶準(zhǔn)確、快速獲取信息的需求。傳統(tǒng)搜索引擎主要存在以下幾點不足:
(1)通過關(guān)鍵字匹配進行搜索,導(dǎo)致返回的信息多且雜亂,有太多無關(guān)的信息被搜索引擎獲取。
(2)沒有對用戶輸入的句子進行句法、語法、語義方面的分析,只是簡單地模糊搜索(同義詞搜索),考慮的因素太少,影響搜索的準(zhǔn)確率。
(3)由于用戶界面的目錄一般是按照類別進行分類,用戶需要逐級進行搜索才能找到最終的類別和結(jié)果,導(dǎo)致速度較慢,耗費了大量時間。
面對以上傳統(tǒng)搜索引擎的不足,問答系統(tǒng)[2]應(yīng)運而生。問答系統(tǒng)是一種高效、智能的信息檢索系統(tǒng)。用戶可以使用自然語言來進行輸入,系統(tǒng)通過相關(guān)的自然語言處理技術(shù),對用戶的輸入進行分析,通過對數(shù)據(jù)庫中的問句進行匹配,最終返還給用戶一個簡潔、準(zhǔn)確的答案。問句相似度計算方法是FAQ 問答系統(tǒng)的核心,很大程度上決定問答系統(tǒng)的好壞。問句相似度計算方法主要分為以下3 種[3],分別是基于字符串的方法、基于知識庫的方法和基于統(tǒng)計的方法。
基于字符串的方法主要是對輸入的句子或組成句子詞語的重復(fù)度、長度、詞序等直接進行比較[4-5]。主要方法有編輯距離、最長公共子序列算法、N-Gram模型、Jaccard 系數(shù)等?;谥R庫的方法主要分為兩類:一是基于結(jié)構(gòu)化詞典來衡量詞語間的相似度,從而計算句子的相似度。常見的詞典有《知網(wǎng)》(HowNet)、《同義詞詞林》、《WordNet》等,另一類則是通過網(wǎng)絡(luò)知識的方法。該方法主要是利用維基百科、百度、搜狗等網(wǎng)絡(luò)知識庫資源,通過網(wǎng)頁鏈接、內(nèi)容進行相似度計算?;诮y(tǒng)計的方法在近年來取得了重要進展,該方法假設(shè)一個文本的語義只與其組成的詞語有關(guān),與上下文、詞序、語法及句子結(jié)構(gòu)無關(guān)。通過把詞語映射為向量,把句子用向量來表示,計算兩個句子向量間的距離來表示句子的相似度?;诮y(tǒng)計的方法主要分為向量空間模型(如VSM[6])和主題模型(如LSA[7]、PLSA[8]、LDA[9])。近年來,隨著深度學(xué)習(xí)的高速發(fā)展,通過神經(jīng)網(wǎng)絡(luò)訓(xùn)練詞向量成為一種主流方法。一些詞向量生成工具,如word2vec[10]、Glove[11]、FastText[12]等,逐漸成為詞向量預(yù)訓(xùn)練手段?;谏窠?jīng)網(wǎng)絡(luò)的詞向量相比于傳統(tǒng)的啞編(one-h(huán)ot)有以下優(yōu)點:
(1)詞向量維度明顯降低。把詞語用固定長度的向量來表示,大大減少了內(nèi)存和計算量。
(2)基于神經(jīng)網(wǎng)絡(luò)的詞向量能夠很好地表示詞語之間的語義。
由于單一的相似度計算方法主要是針對某一方向進行優(yōu)化,均存在一定缺點。許多學(xué)者融合多個相似度計算方法,對算法進行改良,取得了不錯的效果[13-14]。本文通過對多種自然語言處理(Natural Language Processing,NLP)常見特征以及3 種改良的深度學(xué)習(xí)模塊提取的特征進行融合,設(shè)計了一種問句相似度模塊,并運用在羊養(yǎng)殖FAQ 問答系統(tǒng)中。該問答系統(tǒng)將為養(yǎng)羊戶提供簡潔、具體的答案,相信通過該問答系統(tǒng),能夠解決養(yǎng)羊戶在養(yǎng)殖過程中的常見問題。
本文實驗所使用的問句對來源于《山區(qū)肉羊高效養(yǎng)殖問答》、《農(nóng)區(qū)科學(xué)養(yǎng)羊技術(shù)問答》、《現(xiàn)代羊病防制實戰(zhàn)技術(shù)問答》等羊養(yǎng)殖相關(guān)問答書籍。經(jīng)過整理,得到2 500 個養(yǎng)羊基礎(chǔ)問句對。在這2 500個問句對的基礎(chǔ)上,用Python 語言編寫對應(yīng)“百度問答”網(wǎng)站的爬蟲代碼,對這2 500 個養(yǎng)羊基礎(chǔ)問句分詞后的句子進行爬蟲。每個養(yǎng)羊基礎(chǔ)問句爬蟲了10 個相似的問句,經(jīng)過人工篩選并剔除語義無關(guān)的語句后,形成包含2 500 組、11 000 個問句的數(shù)據(jù)集,每組相似句子2~8 個不等。數(shù)據(jù)集實現(xiàn)步驟如下:
Step 1根據(jù)羊養(yǎng)殖相關(guān)問答書籍整理得到2 500個養(yǎng)羊基礎(chǔ)問句。
Step 2對2 500 個養(yǎng)羊基礎(chǔ)問句分詞后進行爬蟲后,人工篩選并剔除與語義無關(guān)的語句,得到2 500組共11 000 個問句,每組相似的句子2~8 個不等。
Step 3在2 500 組問句中,每次選取1 組問句Qi={qi1,qi2,…,qik}。
Step 4由步驟2 可知,Qi中qi1,qi2,…,qik都相似,因此任取2 個問句qi1、qi2就可構(gòu)成一個相似問句對。只需取盡Qi中2 個句子的組合就得到了Qi全部的相似問答對。對于不相似問句對,由于各組句子都不相似,所以只須從Qi中任取一個句子和其他組句子任意組合就可構(gòu)成。最后,把得到的全部問答對存入數(shù)據(jù)集中。
Step 5重復(fù)上述步驟,對2 500 組進行處理,則可得到全部的數(shù)據(jù)集。
通過以上處理可以得到72 260 個問句對。其中相似問句對和不相似問句對的比例為1∶1,數(shù)目均為36 130,避免在深度學(xué)習(xí)訓(xùn)練中造成數(shù)據(jù)平衡性對相似和不相似的權(quán)重的影響。生成的數(shù)據(jù)示例樣本見表1:其中index 為句子對的編號,s1 和s2 分別代表句子對的句子1 和句子2,label 則表示句子對的相似度,1 表示相似,0 表示不相似。
表1 數(shù)據(jù)集樣本Tab.1 Dataset sample
在NLP 任務(wù)中,需要將人類語言建模為向量的形式,這一過程首先需要對句子進行分詞處理,再把詞語嵌入到向量空間中,即詞嵌入。本文使用jieba作為分詞工具,并把養(yǎng)羊相關(guān)領(lǐng)域詞語加入自定義詞典,這樣可以正確切分“農(nóng)膜暖棚式”、“青綠飼料”等羊養(yǎng)殖專業(yè)詞匯。經(jīng)過jieba 分詞前后的樣本見表2。
表2 問句分詞結(jié)果Tab.2 Question partition results
分詞后的句子向量化,使用谷歌開源的訓(xùn)練詞向量工具word2vec 完成,將jieba 切分后的句子向量化,作為深度學(xué)習(xí)特征提取模塊的輸入。本文采用連續(xù)詞袋模型,通過對上下文單詞,來預(yù)測當(dāng)前單詞出現(xiàn)的概率。詞向量維度設(shè)置為300,窗口大小設(shè)置為5,通過養(yǎng)羊相關(guān)的領(lǐng)域知識庫進行詞向量訓(xùn)練。
本文提出了一種基于多特征融合的相似度計算方法。該方法的實現(xiàn)過程是輸入問句對,轉(zhuǎn)化為詞向量矩陣,然后進行特征提取,最后通過stacking 用來訓(xùn)練一個分類器,對問句對進行分類。多特征融合模型結(jié)構(gòu)總體框架如圖1 所示。其中,特征提取是其中的核心部分,主要分為兩個方向:一是直接對數(shù)據(jù)集提取一些常見的NLP 特征,如編輯距離、ngram 相似性等。二是通過神經(jīng)網(wǎng)絡(luò)模型計算問句對的相似度作為特征。主要通過3 個深度學(xué)習(xí)模塊(曼哈頓相似度、注意力機制相似度、比較-聚合相似度)分別提取特征。
圖1 多特征融合模型結(jié)構(gòu)Fig.1 General structure of multi feature fusion model
NLP 數(shù)據(jù)特征主要是通過編寫相對應(yīng)的代碼,提取問句對常見特征。本文提取了10 個NLP 特征,并把提取的特征用列的形式保存,構(gòu)成10 維向量,作為多特征融合模型輸入數(shù)據(jù)的一部分。本文提取的常見特征如下:
(1)長度上的不同:計算兩個句子長度的差。
(2)編輯距離:指兩個字符串A、B,A 編輯為B所需的最少編輯次數(shù)。如果其編輯距離越小,則其越相似。反之,亦然。
(3)N-Gram 相似性:將文本里面的內(nèi)容按照字節(jié)進行大小為N的滑動窗口操作,形成長度是N的字節(jié)片段序列。每一個字節(jié)片段稱為gram,對所有的gram 的出現(xiàn)頻度進行統(tǒng)計,并且按照事先設(shè)定好的閾值進行過濾,形成關(guān)鍵gram 列表,也就是這個文本的向量特征空間。
(4)句子中詞語個數(shù)的特征:將提取6 種與詞語個數(shù)相關(guān)的特征。如,兩個句子中相同詞的個數(shù)分別除句子的最大及最小以及平均個數(shù)作為特征;兩個句子不同詞的個數(shù)分別除以對應(yīng)句子詞語總個數(shù);計算兩個句子的交集除以并集得到杰卡德(Jaccard)相似度等等。
(5)兩個語句詞向量組合的相似度:主要利用經(jīng)word2vec 訓(xùn)練的詞向量對兩個句子進行向量表示,再計算兩個語句詞向量組合的余弦相似度。
在介紹深度學(xué)習(xí)相似度模塊之前,先對后面用到的孿生神經(jīng)網(wǎng)絡(luò)(Siamese network)和長短時神經(jīng)網(wǎng)絡(luò)(Long Short-Term Memory,LSTM)進行簡單介紹。
孿生神經(jīng)網(wǎng)絡(luò)也叫做“連體的神經(jīng)網(wǎng)絡(luò)”。神經(jīng)網(wǎng)絡(luò)的“連體”是通過共享權(quán)值來實現(xiàn)孿生神經(jīng)網(wǎng)絡(luò)。首先將兩個輸入分別輸入兩個神經(jīng)網(wǎng)絡(luò)中,再通過這兩個神經(jīng)網(wǎng)絡(luò)分別將輸入映射到新的空間,形成輸入在新的空間中的表示,最后計算Loss,評價兩個輸入的相似度。
循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN),具有記憶的功能,能夠很好地處理和預(yù)測時間序列,適用于文本處理。但伴隨著序列輸入越長,越可能導(dǎo)致梯度消失和梯度爆炸問題。而RNN 網(wǎng)絡(luò)的變種LSTM,通過特別構(gòu)建的門結(jié)構(gòu),對細胞狀態(tài)進行刪除或添加信息,就能較好地解決這兩個問題。
2.3.1 曼哈頓距離相似度模型(siamese-lstmmandist,SLM)
曼哈頓距離相似度模型是以孿生神經(jīng)網(wǎng)絡(luò)和LSTM 為基礎(chǔ)構(gòu)建的相似度模型[13]。由輸入層、嵌入層、LSTM 層、自定義的曼哈頓層和輸出層5 部分組成,模型結(jié)構(gòu)如圖2 所示。輸入層把每個詞語在詞典中得到一個詞語編號序列傳遞給嵌入層;嵌入層則將各個詞語編號映射為word2vec 詞向量后,作為LSTM層的輸入。兩個LSTM 開始對句子1、2 的詞向量進行學(xué)習(xí),兩個LSTM 層彼此共享權(quán)重;將LSTM 學(xué)習(xí)后的向量輸入曼哈頓層,計算曼哈頓距離;再通過dropout 來防止過擬合,以及歸一化來提高計算速度;最后在輸出層通過softmax函數(shù)輸出結(jié)果。
圖2 曼哈頓距離相似度模型結(jié)構(gòu)圖Fig.2 Manhattan distance similarity model structure
2.3.2 注意力機制相似度模型(Siamese-lstmattention,SLA)
注意力機制相似度模型是以LSTM 和注意力機制(Attention)為基礎(chǔ)構(gòu)建的相似度模型[17]。由輸人層、嵌入層、LSTM 層、注意力層和輸出層5 部分組成,模型結(jié)構(gòu)如圖3 所示。輸入層、嵌入層、LSTM層的功能同上個模型。其不同之處在于,LSTM 學(xué)習(xí)到的向量加上注意力層,對LSTM 輸入的向量分配不同的權(quán)重,進行選擇性輸入,更好地表示句子的語義。再通過全連接層降低維度,dropout 來防止過擬合,歸一化來加速收斂速度;最后在輸出層輸出問句對的相似結(jié)果。
圖3 注意力機制相似度模型結(jié)構(gòu)圖Fig.3 Structure of attention mechanism similarity model
2.3.3 改進的比較-聚合相似度模型
(Approve-Compare-Aggregate-Model,ACAM)
該模型基于Compare-Aggregate-Model[15]進行了改進,模型結(jié)構(gòu)如圖4 所示。該模型主要做了3部分改進。
圖4 改進的比較-聚合相似度模型結(jié)構(gòu)圖Fig.4 Structure of improved comparison-aggregation similarity model
第一部分:在左邊詞向量輸入的情況下,右邊添加了字符向量作為輸入。主要是為了提取詞語內(nèi)字間的信息,以及對超出詞典的詞進行表示。
第二部分:對embedding 層分別用注意力機制和bi-lstm 對向量分別表示,然后把這兩個向量進行拼接。加入注意力機制后使得語句向量在詞上有了重心,分配的權(quán)重不同。
第三部分:對前面處理過的句子向量進行更多的交互處理,對輸入的兩個句子向量進行相乘、相減、取最大值等操作。通過對句子向量進行這幾種交互處理能夠更好地比較句子之間的語義,提高模型準(zhǔn)確率。
最后,模型把交互處理后的向量和前面LSTM和CNN 網(wǎng)絡(luò)提取的向量進行拼接,并通過全連接層進行降維,最后通過輸出層進行輸出。
2.4.1 構(gòu)建多個特征組成的數(shù)據(jù)集
通過代碼提取了NLP 數(shù)據(jù)特征,以及通過3 個不同深度的學(xué)習(xí)網(wǎng)絡(luò)提取了SLM 特征、SLA 特征、ACAM 相似度特征。把提取的12 個特征組合在一起構(gòu)建一個12 維的向量數(shù)據(jù)集,用來訓(xùn)練一個機器學(xué)習(xí)的分類模型。
2.4.2 構(gòu)建分類模型
構(gòu)建的分類模型主要是基于Sklearn 庫的常見分類方法,通過stacking 算法進行融合得到。主要把分類器分為了兩級:第一級別的分類器(初級學(xué)習(xí)器)有隨機森林、樸素貝葉斯、支持向量機、邏輯回歸,第二級分類器(次級學(xué)習(xí)器)為決策樹。前面多個模型提取的特征所組成的數(shù)據(jù)集輸入初級學(xué)習(xí)器分別進行訓(xùn)練,并將訓(xùn)練后所得到的結(jié)果作為次級學(xué)習(xí)器的輸入,最后通過次級學(xué)習(xí)器進行分類以后,輸出最終結(jié)果??傮wStacking 計算過程如圖5 所示。
圖5 Stacking 計算結(jié)構(gòu)圖Fig.5 Stacking calculation structure
實驗環(huán)境設(shè)置為:Intel(R)Core(TM)i5-10200H CPU 8 核處理器;GPU 為RTX 2060,運行內(nèi)存16 G。
實驗通過對72 106 個問句對劃分為訓(xùn)練集、驗證集,比例為8∶2。
本次實驗通過精確度(Accuracy)、查準(zhǔn)率(Precise)、查全率(Recall)、F1 分?jǐn)?shù)這4 個評測標(biāo)準(zhǔn)來衡量模型的性能,評測標(biāo)準(zhǔn)的具體公式見表3。
表3 評測標(biāo)準(zhǔn)公式Tab.3 Evaluation metrics
其中,精確度(Accuracy)表示預(yù)測符合標(biāo)準(zhǔn)的樣本與總樣本的比例;查準(zhǔn)率(Precise)表示正確預(yù)測正樣本占實際預(yù)測為正樣本的比例;查全率(Recall)表示正確預(yù)測正樣本占正樣本的比例。F1分?jǐn)?shù)是分類問題的一個衡量指標(biāo),其是Accuracy和Recall的調(diào)和平均數(shù),能更好地衡量分類的好壞。所以在機器學(xué)習(xí)競賽中,F(xiàn)1 常常作為最終測評的方法。
表3 中TP、FN、FP、TN的含義見表4。TP表示正確地把正樣本預(yù)測為正;FN表示錯誤地把正樣本預(yù)測為負(fù);FP表示錯誤地把負(fù)樣本預(yù)測為正;TN表示正確地把負(fù)樣本預(yù)測為負(fù)。在機器學(xué)習(xí)中尤其是統(tǒng)計分類中,通過混淆矩陣能夠很容易地看到機器學(xué)習(xí)是否混淆了樣本的類別。矩陣的每一列表達了分類器對于樣本的類別預(yù)測,矩陣的每一行表達了樣本所屬真實類別。
表4 混淆矩陣Tab.4 Confusion matrix
4 種方法在養(yǎng)羊驗證集上訓(xùn)練的結(jié)果見表5??梢钥闯觯疚姆椒ㄊ前亚懊嫣崛〉腘LP 特征及幾種深度學(xué)習(xí)提取的特征作為集成學(xué)習(xí)stacking 的輸入,通過訓(xùn)練一個分類器,得到結(jié)果。相較前面3 個方法,本文方法的各項評價指標(biāo)都接近99%,在4 個評價指標(biāo)上具有最優(yōu)的綜合性能,表明該方法能夠很好地計算問句相似度,改善羊養(yǎng)殖問答系統(tǒng)的性能。但是,由于stacking 方法需要計算前面多種模型的特征作為輸入的數(shù)據(jù),在時間效率上的對比,本文方法效率較低,還有值得改善的地方。在后續(xù)設(shè)計羊養(yǎng)殖問答系統(tǒng)時,可以結(jié)合問句分類模型,減少問答系統(tǒng)在相似度計算模塊的匹配數(shù)量,以彌補本方法效率較低的問題。
表5 多種相似度計算方法結(jié)果及時間效率Tab.5 Results of multiple similarity calculation methods
本研究通過對常用的NLP 特征和3 種深度學(xué)習(xí)方法進行特征提取分類,能夠很好地考慮多種特征的情況,相比于提取單一特征的方法,該方法通過對多種方法提取的特征進一步分類,明顯提升了4種評價指標(biāo),且在驗證集上各評價指標(biāo)都接近99%。因此,本文提出的方法明顯優(yōu)于前2 種方法,對比第3 種方法也有了一定提升。
基于該相似度計算方法的羊養(yǎng)殖問答系統(tǒng),能夠準(zhǔn)確匹配用戶的問題,提供對應(yīng)答案。相信這個羊養(yǎng)殖問答系統(tǒng)能夠幫助養(yǎng)殖戶解決許多養(yǎng)殖問題,能夠促進養(yǎng)羊業(yè)更好的發(fā)展。
但本文的工作還有些不足,主要是在創(chuàng)建養(yǎng)羊數(shù)據(jù)集時,對于爬蟲得到的相似問句需要人工進行判斷,費時費力,且具有一定的主觀性。下一步的工作會圍繞如何自動或半自動構(gòu)建知識庫;或者對基于知識圖譜的問答系統(tǒng)進行設(shè)計。