劉峻松 唐明靖 薛 崗* 楊成榮
1(云南大學(xué)軟件學(xué)院 云南 昆明 650000)2(云南師范大學(xué)生命科學(xué)學(xué)院 云南 昆明 650000)3(六盤水師范學(xué)院 貴州 六盤水 553004)
Stack Overflow是一個(gè)熱門的計(jì)算機(jī)編程領(lǐng)域的問答社區(qū),它為世界范圍內(nèi)的計(jì)算機(jī)編程愛好者提供了一個(gè)解決問題的平臺(tái)。因此論壇中的問答文本具有很高的價(jià)值,每年都有很多人以Stack Overflow中的問題答案文本為研究對(duì)象,在海量的文本數(shù)據(jù)中挖掘不同的信息,為不同領(lǐng)域的研究提供數(shù)據(jù)基礎(chǔ)。
由于Stack Overflow是一個(gè)開放式的問答社區(qū)平臺(tái),其中所有的文本數(shù)據(jù)均為來自世界各地用戶的輸入,因此其文本數(shù)據(jù)中存在大量的拼寫錯(cuò)誤。在對(duì)文本進(jìn)行分析時(shí),拼寫錯(cuò)誤對(duì)基于統(tǒng)計(jì)學(xué)理論的很多分析方法來說是相對(duì)致命的。以分析熱門問題和熱搜問題為例,在通過關(guān)鍵詞進(jìn)行分析和檢索的過程中,如果某段文本的語義中心詞存在拼寫錯(cuò)誤,根據(jù)計(jì)算機(jī)的模式匹配原則,該文段將會(huì)被錯(cuò)誤地認(rèn)知或歸類,當(dāng)錯(cuò)誤詞匯出現(xiàn)的頻率較高時(shí),對(duì)于統(tǒng)計(jì)結(jié)果乃至最終的分析結(jié)果都會(huì)產(chǎn)生較大的影響。絕大多數(shù)人類輸入的文字都會(huì)出現(xiàn)文本拼寫錯(cuò)誤,而諸如Stack Overflow這種開放平臺(tái)下的自然語言文本來說,其中拼寫錯(cuò)誤文本的數(shù)量更是不可忽視。
本文提出了一種基于詞向量的文本拼寫錯(cuò)誤自動(dòng)檢測(cè)算法,通過結(jié)合文段語義及部分計(jì)算機(jī)輸入習(xí)慣所造成的常見錯(cuò)誤情況,對(duì)Stack Overflow中計(jì)算機(jī)編程領(lǐng)域的文本數(shù)據(jù)進(jìn)行自動(dòng)的單詞拼寫檢測(cè)和糾正。實(shí)驗(yàn)結(jié)果表明,與現(xiàn)有的以編輯距離為基礎(chǔ)的候選詞檢測(cè)和糾錯(cuò)方式相比,使用本文算法對(duì)文本進(jìn)行自動(dòng)校正后,所獲得的結(jié)果文本與標(biāo)準(zhǔn)文本對(duì)比,語義相似度更高,針對(duì)部分計(jì)算機(jī)編程領(lǐng)域的專業(yè)詞匯及縮寫等情況的檢測(cè)和糾正效果更好,且在面對(duì)海量文本數(shù)據(jù)時(shí)能夠做到快速自動(dòng)檢測(cè)和糾正,從而驗(yàn)證了基于Word2Vec的計(jì)算機(jī)編程領(lǐng)域詞語拼寫錯(cuò)誤檢測(cè)算法在針對(duì)計(jì)算機(jī)編程領(lǐng)域自然語言文本的單詞拼寫自動(dòng)糾錯(cuò)問題中具有較好的效果。
單詞拼寫錯(cuò)誤的檢測(cè)和糾正在自然語言處理領(lǐng)域是一個(gè)很早就已經(jīng)出現(xiàn)的問題,Kukich[1]使用UNIX實(shí)現(xiàn)了英文文本的拼寫檢查方法,同時(shí)提出了單詞拼寫錯(cuò)誤應(yīng)包括非詞錯(cuò)誤(Non-word error)和真詞錯(cuò)誤(Real-word error),這些理論為后續(xù)的單詞拼寫檢測(cè)和糾錯(cuò)提供了基礎(chǔ)。Levenshtein[2]提出了編輯距離的概念,如今編輯距離被廣泛應(yīng)用于單詞拼寫檢測(cè)和糾錯(cuò)中,Soleh等[3]提出了使用詞法分析和查找字典的方式檢測(cè)錯(cuò)誤詞匯,通過錯(cuò)誤詞匯編輯距離構(gòu)建候選詞集合,最后使用隱馬爾可夫模型對(duì)詞匯文本進(jìn)行分析進(jìn)而對(duì)候選詞集合的所有詞匯進(jìn)行排序,選取序列中排列首位的詞匯作為錯(cuò)誤詞匯的改正詞匯進(jìn)行替換。謝文慧等[4]提出在編輯距離的計(jì)算中引入鍵盤物理布局這一因素,將鍵盤鍵位間的最短距離直接引入到編輯距離算法中,但該文使用絕對(duì)的物理距離作為參數(shù),實(shí)際上用戶的鍵盤輸入誤差僅存在于周圍的鍵位當(dāng)中,更遠(yuǎn)的鍵位距離值會(huì)對(duì)最終的判別產(chǎn)生負(fù)向的影響。且上述所有方法均是以字典和編輯距離為核心判斷標(biāo)準(zhǔn),因此對(duì)于部分專業(yè)領(lǐng)域較強(qiáng)的特殊詞匯及字典中沒有記錄的網(wǎng)絡(luò)新興詞匯的檢測(cè)能力不強(qiáng),甚至可能會(huì)出現(xiàn)誤判的情況,而且對(duì)于網(wǎng)絡(luò)開放社區(qū)的文本來說存在大量諸如用戶名、郵箱地址等特定且無實(shí)際意義的詞匯,該類詞匯可能由某個(gè)具有實(shí)意的單詞演變而來且二者編輯距離極有可能很小,對(duì)該類詞匯的誤判會(huì)對(duì)文段的語義產(chǎn)生較大影響。
Bergsma等[5]將N-gram模型引入到拼寫糾錯(cuò)問題當(dāng)中,基于統(tǒng)計(jì)語言模型,分別利用了有監(jiān)督和無監(jiān)督的方法,結(jié)合上下文語義對(duì)單詞進(jìn)行拼寫糾錯(cuò)。Kim等[6]結(jié)合了單詞的相似性和N-gram模型,使用N-gram模型計(jì)算的語義相似性對(duì)單詞的拼寫相似度進(jìn)行修正,提高了拼寫糾錯(cuò)的準(zhǔn)確性,但是N-gram模型具有參數(shù)空間大且數(shù)據(jù)稀疏嚴(yán)重的弊端,因此在處理大量文本時(shí)效率較低。
目前從文本拼寫糾錯(cuò)領(lǐng)域的研究情況看,大部分方法是基于文本拼寫特征或基于統(tǒng)計(jì)的詞匯替換方法進(jìn)行詞語拼寫矯正,上述方法存在準(zhǔn)確度低、速度較慢等問題,而本文算法以Word2Vec運(yùn)算的詞向量構(gòu)建文本的向量空間,通過余弦相似度構(gòu)建與檢測(cè)詞匯語義相似詞匯的集合,結(jié)合余弦相似度、詞頻、基于鍵盤鍵位改進(jìn)的文本編輯距離的復(fù)合評(píng)分標(biāo)準(zhǔn)來對(duì)錯(cuò)誤詞匯進(jìn)行檢測(cè)和糾正。相較于上述已有的方法,本文提出的方法復(fù)合了多種對(duì)詞匯正誤判斷及候選集合選取有影響的因素。通過實(shí)驗(yàn)表明,本文方法能夠在保證語義的前提下自動(dòng)對(duì)大量文本進(jìn)行檢測(cè)和糾錯(cuò),并且對(duì)部分專業(yè)性較強(qiáng)的生僻詞匯、新詞匯、縮寫詞匯有較好的檢測(cè)和糾正效果。
為了表達(dá)詞與詞之間的關(guān)系,Hinton[7]提出了詞語的分布式表達(dá)形式,每個(gè)詞對(duì)應(yīng)的分布式表達(dá)是一個(gè)低維度的實(shí)值向量,其中每一個(gè)維度均可以表示一個(gè)詞的潛在特征。通過對(duì)大量文本語料的分析和訓(xùn)練,將已知文本中的每一個(gè)詞匯映射為低維向量空間中的一個(gè)向量,這個(gè)向量空間稱為詞向量空間,其中的每一個(gè)向量稱之為詞向量。在這個(gè)空間中引入“距離”的概念,這個(gè)“距離”一般使用向量間的余弦值,多維向量的余弦值由歐幾里得向量點(diǎn)積公式推導(dǎo)得出,以此值作為兩個(gè)詞語的余弦相似度[8]。假設(shè)空間內(nèi)現(xiàn)有兩個(gè)n維向量a=(A1,A2,…,An)、b=(B1,B2,…,Bn),向量夾角為θ,余弦相似度計(jì)算式表示為:
(1)
由于詞向量本身包含了詞語潛在的上下文特征,因此通過對(duì)向量間余弦值的計(jì)算可以判斷其對(duì)應(yīng)詞匯之間在語義或者上下文使用上的相似度。
Word2Vec是在2013年由Google的Mikolov等[9-10]提出并實(shí)現(xiàn)的一種工具,用于快速地對(duì)文本進(jìn)行訓(xùn)練并獲得低維詞向量,其核心是一個(gè)淺層的神經(jīng)網(wǎng)絡(luò)。Word2Vec中包含了兩種訓(xùn)練模型[10],分別為CBOW和Skip-gram,兩種模型如圖1所示。
(a) CBOW模型 (b) Skip-gram模型圖1 Word2Vec中的兩種訓(xùn)練模型
可以看出,兩種模型均是包含輸入層、輸出層及映射層的淺層神經(jīng)網(wǎng)絡(luò)模型,核心理論是貝葉斯條件概率,研究w和Context(w)之間的條件概率關(guān)系,即P(w|Context(w))或P(Context(w)|w),此處Context(w)定義為詞語w的上下文,數(shù)學(xué)表達(dá)如下:
Context(wi)=wi-t,…,wi-1,wi,wi+1,…,wi+t
(2)
式中:wi表示當(dāng)前詞匯;t表示納入上下文計(jì)算的詞匯數(shù)量,即從當(dāng)前詞匯開始計(jì)算前后需要納入計(jì)算的連續(xù)詞匯的數(shù)量。CBOW模型是通過輸入上下文對(duì)其中詞匯進(jìn)行預(yù)測(cè),而Skip-gram與之相反,通過詞匯對(duì)上下文進(jìn)行預(yù)測(cè)。Word2Vec為了提高訓(xùn)練的效率,還提供了兩種優(yōu)化算法,分別是Hierachy Softmax和Negative Sampling,通過使用Word2Vec訓(xùn)練可以輸出一組質(zhì)量相對(duì)較高的低維詞向量,并且語義相近的詞匯將被映射到空間距離相近的位置上。
編輯距離(Levenshtein Distance)是Levenshtein[2]提出的方法,用于表示一個(gè)字符串轉(zhuǎn)變?yōu)榱硪粋€(gè)字符串所需的最小操作步數(shù)。一步操作包括刪除一個(gè)字符、增加一個(gè)字符和修改一個(gè)字符三種情況,假設(shè)現(xiàn)有字符串A和字符串B,使用Ai表示A字符串前i個(gè)字符構(gòu)成的子串,同理使用Bj表示B字符串前j個(gè)字符構(gòu)成的子串,用LD(i,j)表示字符串A和B之間的編輯距離,則根據(jù)編輯距離算法可得計(jì)算式:
(3)
本文以文本詞向量為詞義相似度的評(píng)判基礎(chǔ),通過改進(jìn)的編輯距離模型對(duì)詞義相似度的模型進(jìn)行修正,綜合考慮文本的語義和編輯距離的影響提出一種文本相似度計(jì)算方法,以此為基礎(chǔ)提出了一種文本單詞拼寫檢測(cè)糾錯(cuò)的算法。本節(jié)通過對(duì)編輯距離模型、綜合文本相似度模型及單詞拼寫錯(cuò)誤檢測(cè)方法三個(gè)方面進(jìn)行概述。
Levenshtein[2]提出的編輯距離可以一定程度的描述兩個(gè)單詞之間的拼寫相似程度,但是Stack Overflow是一個(gè)開放的網(wǎng)絡(luò)社區(qū),其中絕大多數(shù)詞匯都是通過計(jì)算機(jī)鍵盤進(jìn)行輸入的,因此有一部分詞匯錯(cuò)誤是鍵盤鍵位相近導(dǎo)致的誤操作所造成的。本文將在原始編輯距離公式上進(jìn)行改進(jìn),將因鍵盤鍵位相近導(dǎo)致誤操作的情況納入編輯距離計(jì)算中。
本文使用無向圖的方式表示鍵盤鍵位,根據(jù)國(guó)際標(biāo)準(zhǔn)QWERTY鍵盤的物理鍵位位置,構(gòu)建如圖2所示的無向圖。文獻(xiàn)[4]使用無向圖中的最短路徑作為距離引入到編輯距離當(dāng)中,但實(shí)際上針對(duì)國(guó)際標(biāo)準(zhǔn)鍵盤布局,有一種較為常用的輸入指法,在該指法下,用戶在輸入的過程中,不同的輸入錯(cuò)誤情況出現(xiàn)的概率會(huì)根據(jù)指法中鍵位的分布而存在偏差,鍵盤指法的分布如圖2所示。
圖2 鍵盤布局和鍵盤指法分布圖
文獻(xiàn)[11]中針對(duì)鍵盤指法提出了三種輸入錯(cuò)誤的類型:(1) 錯(cuò)誤字母與正確字母位于同一個(gè)手指負(fù)責(zé)的區(qū)域(此類錯(cuò)誤情況定義為W1);(2) 錯(cuò)誤字母與正確字母位于同一只手的相鄰手指負(fù)責(zé)的區(qū)域(此類錯(cuò)誤情況定義為W2);(3) 錯(cuò)誤字母與正確字母位于不同手的相鄰手指負(fù)責(zé)的區(qū)域(此類錯(cuò)誤情況定義為W3)。
以單詞“word2vec”為例,與字母“w”相鄰部分的鍵位如圖3所示,用戶在執(zhí)行鍵入“W”的操作時(shí),若錯(cuò)誤輸入為“2”“S”則屬于W1情況,若錯(cuò)誤輸入為“3”“Q”“E”“A”則屬于W2情況。
圖3 字母“W”相鄰布局圖
文獻(xiàn)[11]通過大量的統(tǒng)計(jì)實(shí)驗(yàn)表明,上述三種錯(cuò)誤情況出現(xiàn)的概率滿足如下關(guān)系:
(4)
式中:W1、W2、W3分別代表上文提及的發(fā)生三種輸入錯(cuò)誤類型的事件;P(W)表示不同輸入錯(cuò)誤類型所代表的事件的發(fā)生概率。因此,將上述無向圖改為加權(quán)無向圖,將邊賦予不同的權(quán)值。同樣以“word2vec”為例,如果使用圖的最短距離直接作為鍵盤鍵位對(duì)編輯距離的影響因子,則“mord2vec”和“tord2vec”的影響程度是不一樣的,但是實(shí)際上,一旦超過“相鄰”鍵位這個(gè)范疇,這種詞語中字符的區(qū)別則更傾向于不同單詞或其他錯(cuò)誤情況,因此本文在上述基礎(chǔ)上引入一個(gè)閾值,當(dāng)其最短距離超過閾值時(shí),則認(rèn)為該字符差異不是由鍵盤物理鍵位的誤操作引起的。
根據(jù)上述思路,首先根據(jù)三種錯(cuò)誤情況出現(xiàn)的概率對(duì)鍵盤鍵位圖中各邊的權(quán)值進(jìn)行設(shè)定,根據(jù)上述規(guī)則,設(shè)W1=1、W2=2、W3=3。盡管某些情況下,同一手指負(fù)責(zé)的區(qū)域出錯(cuò)的可能性較大。由于兩個(gè)字母按鍵相隔距離較遠(yuǎn)時(shí),其混淆輸入的可能性將大幅度下降,因此在加權(quán)圖的距離計(jì)算時(shí)將距離乘跳數(shù)作為其距離的最終值,同時(shí)引入閾值T=4,將誤操作范圍界定于圖3所示的范圍內(nèi)。則任意兩個(gè)鍵盤可輸入字符串A和B之間的距離Dk的計(jì)算公式如下:
(5)
(6)
則推導(dǎo)可得任意兩個(gè)字符串A和B,改進(jìn)后編輯距離的影響因子I(A,B)的計(jì)算式如下:
(7)
綜上,對(duì)原始編輯距離公式修正為:
LDk(A[i],B[j])=
(8)
基于詞向量關(guān)注每個(gè)詞匯上下文情況,而不關(guān)注詞匯拼寫本身的特性,且絕大部分拼寫錯(cuò)誤詞匯,輸入者所想表達(dá)的語義與其對(duì)應(yīng)的正確詞匯是一致的,因此錯(cuò)誤詞匯的上下文特征與正確詞匯的上下文特征相似度較高,也就是在向量空間中二者詞向量間的夾角余弦值較小,因此將詞向量間的余弦相似度值與上述改進(jìn)的編輯距離同時(shí)納入到綜合相似度評(píng)分的計(jì)算中。
對(duì)任意兩個(gè)詞A和B的綜合相似度評(píng)分S(A,B)進(jìn)行計(jì)算,S(A,B)與A、B對(duì)應(yīng)詞向量的余弦相似度成正比,與LDk成反比,由此可得S(A,B)計(jì)算公式為:
特深井實(shí)施應(yīng)依據(jù)地層深度方向宏觀分布規(guī)律將特深井分為上部、中部和下部三段分別考慮。本文依據(jù)科學(xué)特深井地層深度方向的不同特點(diǎn),以孔內(nèi)安全問題為技術(shù)主線,提出具有針對(duì)性的鉆孔安全技術(shù)措施,從而提出特深井施工技術(shù)體系初步方案及其重大關(guān)鍵技術(shù)構(gòu)想。
(9)
式中:a、b表示詞語A、B所對(duì)應(yīng)的詞向量;cos(a·b)表示A、B詞語對(duì)應(yīng)詞向量的余弦相似度;LDk(A,B)表示改進(jìn)的詞語A、B的編輯距離;max()表示選取最大值函數(shù);len()表示字符串長(zhǎng)度。若兩個(gè)詞語的編輯距離等于最長(zhǎng)詞語的字符數(shù),則意味著在本文模型中,這兩個(gè)詞匯沒有任何相似之處,因此將其相似度綜合評(píng)分直接定為0。
本文提出的算法會(huì)對(duì)文本中每一個(gè)詞語進(jìn)行分析。對(duì)于每一個(gè)被檢測(cè)詞語,首先通過Word2Vec計(jì)算的模型獲得與當(dāng)前詞語向量余弦語義相似度最高的十個(gè)詞語組成候選詞集合,分別對(duì)當(dāng)前詞語和候選詞集合中的所有詞語計(jì)算綜合相似度評(píng)分,獲取評(píng)分最高的詞語,對(duì)比兩個(gè)詞語的詞頻。若當(dāng)前被檢測(cè)詞語的詞頻低于候選集中評(píng)分最高的詞語,則使用該詞語替換當(dāng)前詞語,達(dá)到詞語糾錯(cuò)的目的。因此要對(duì)文本語料進(jìn)行處理和訓(xùn)練,獲得詞向量模型。首先對(duì)文本進(jìn)行預(yù)處理,原始Stack Overflow的文本數(shù)據(jù)如下:
PyXML works well.
You didn t say what platform you re using, however if you re on Ubuntu you can get it with sudo apt-get install python-xml
. I m sure other Linux distros have it as well.
If you re on a Mac, xpath is already installed but not immediately accessible. You can set PY_USE_XMLPLUS
in your environment or do it the Python way before you import xml.xpath:
if sys.platform.startswith(′darwin′):
os.environ[′PY_USE_XMLPLUS′]=′1′
In the worst case you may have to build it yourself. This package is no longer maintained but still builds fine and works with modern 2.x Pythons.Basic docs are here.
Stack Overflow的原始文本是按照HTML的格式組織的,其中包含大量的HTML標(biāo)簽和無意義的格式信息,因此對(duì)上述原始數(shù)據(jù)的處理步驟如下:
(1) 解析HTML結(jié)構(gòu)文本獲得自然語言文本。在解析HTML文本的過程中,包含兩類標(biāo)簽,一類是諸如