自然語言處理(NLP,Natural Language Processing)是人工智能領域中的一個重要方向问畅,主要研究人與計算機之間用自然語言進行有效通信的各種理論和方法是晨。自然語言處理的底層任務由易到難大致可以分為詞法分析翰撑、句法分析和語義分析置吓。分詞是詞法分析(還包括詞性標注和命名實體識別)中最基本的任務,也是眾多NLP算法中必不可少的第一步边涕,其切分準確與否往往與整體結(jié)果息息相關晤碘。
金融領域分詞的難點
分詞既簡單又復雜褂微。簡單是因為分詞的算法研究已經(jīng)很成熟了,大部分的算法(如HMM分詞园爷、CRF分詞)準確率都可以達到95%以上宠蚂;復雜則是因為剩下的5%很難有突破,主要可以歸結(jié)于三點:
▲粒度童社,即切分時的最小單位求厕,不同應用對粒度的要求不一樣,比如“融資融券”可以是一個詞也可以是兩個詞
▲歧義扰楼,比如“恒生”一詞呀癣,既可指恒生公司,又可指恒生指數(shù)
▲未登錄詞弦赖,即未出現(xiàn)在算法使用的詞典中的詞项栏,比如不常見的專業(yè)金融術語,以及各種上市公司的名稱
在金融領域中蹬竖,分詞也具有上述三個難點忘嫉,并且在未登錄詞方面的難點更為突出,這是因為金融類詞匯本來就多案腺,再加上一些專有名詞不僅有全稱還有簡稱,這就進一步增大了難度康吵。
在實際應用中劈榨,以上難點時常會造成分詞效果欠佳,進而影響之后的任務晦嵌。尤其是在一些金融業(yè)務中同辣,有許多需要與用戶交互的場景,某些用戶會用口語化的詞匯描述業(yè)務惭载,如果分詞錯誤會影響用戶意圖的解析旱函,這對分詞的準確性提出了更高的要求。因此在進行NLP上層應用開發(fā)時描滔,需要對分詞算法有一定的了解棒妨,從而在效果優(yōu)化時有能力對分詞器進行調(diào)整。接下來含长,我們介紹幾種常用的分詞算法及其應用在金融中的優(yōu)劣券腔。
幾種常見的分詞算法
分詞算法根據(jù)其核心思想主要分為兩種:
第一種是基于字典的分詞,先把句子按照字典切分成詞拘泞,再尋找詞的最佳組合方式纷纫,包括最大匹配分詞算法、最短路徑分詞算法陪腌、基于N-Gram model的分詞算法等辱魁;
第二種是基于字的分詞烟瞧,即由字構(gòu)詞,先把句子分成一個個字染簇,再將字組合成詞参滴,尋找最優(yōu)的切分策略,同時也可以轉(zhuǎn)化成序列標注問題剖笙,包括生成式模型分詞算法卵洗、判別式模型分詞算法、神經(jīng)網(wǎng)絡分詞算法等弥咪。
最大匹配分詞算法
最大匹配分詞尋找最優(yōu)組合的方式是將匹配到的最長詞組合在一起过蹂,主要的思路是先將詞典構(gòu)造成一棵Trie樹(也稱為字典樹),Trie樹由詞的公共前綴構(gòu)成節(jié)點聚至,降低了存儲空間的同時可以提升查找效率酷勺。
最大匹配分詞將句子與Trie樹進行匹配,在匹配到根結(jié)點時由下一個字重新開始進行查找扳躬。比如正向(從左至右)匹配“他說的確實在理”脆诉,得出的結(jié)果為“他/說/的確/實在/理”。如果進行反向最大匹配贷币,則為“他/說/的/確實/在理”击胜。
這種方式雖然可以在O(n)時間對句子進行分詞,但是只單向匹配太過絕對役纹,尤其是金融這種詞匯較豐富的場景偶摔,會出現(xiàn)例如“交易費/用”、“報價單/位”等情況促脉,所以除非某些詞的優(yōu)先級很高辰斋,否則要盡量避免使用此算法。
最短路徑分詞算法
最短路徑分詞算法首先將一句話中的所有詞匹配出來瘸味,構(gòu)成詞圖(有向無環(huán)圖DAG)宫仗,之后尋找從起始點到終點的最短路徑作為最佳組合方式,例:
我們認為圖中每個詞的權(quán)重都是相等的旁仿,因此每條邊的權(quán)重都為1藕夫。
在求解DAG圖的最短路徑問題時,總是要利用到一種性質(zhì):即兩點之間的最短路徑也包含了路徑上其他頂點間的最短路徑丁逝。比如S->A->B->E為S到E到最短路徑汁胆,那S->A->B一定是S到B到最短路徑,否則會存在一點C使得d(S->C->B)<d(S->A->B)霜幼,那S到E的最短路徑也會變?yōu)镾->C->B->E嫩码,這就與假設矛盾了。利用上述的最優(yōu)子結(jié)構(gòu)性質(zhì)罪既,可以利用貪心算法或動態(tài)規(guī)劃兩種求解算法:
(1)基于Dijkstra算法求解最短路徑铸题,該算法適用于所有帶權(quán)有向圖铡恕,求解源節(jié)點到其他所有節(jié)點的最短路徑,并可以求得全局最優(yōu)解丢间;
(2)N-最短路徑分詞算法探熔,該方法是對Dijkstra算法的擴展,在每一步保存最短的N條路徑烘挫,并記錄這些路徑上當前節(jié)點的前驅(qū)诀艰,在最后求得最優(yōu)解時回溯得到最短路徑。這種方法的準確率優(yōu)于Dijkstra算法饮六,但在時間和空間復雜度上都更大其垄。
相較于最大匹配分詞算法,最短路徑分詞算法更加靈活卤橄,可以更好地把詞典中的詞組合起來绿满,能更好地解決有歧義的場景。比如上述“他說的確實在理”這句話窟扑,用最短路徑算法的計算結(jié)果為“他/說/的/確實/在理”喇颁,避免了正向最大匹配的錯誤。但是對于詞典中未存在的詞基本沒有識別能力嚎货,無法解決金融領域分詞中的“未登錄詞”難點橘霎。
基于N-Gram model的分詞算法
N-Gram(又稱N元語法模型)是基于一個假設:第n個詞出現(xiàn)與前n-1個詞相關,而與其他任何詞不相關殖属。在此種假設下茎毁,可以簡化詞的條件概率,進而求解整個句子出現(xiàn)的概率忱辅。
現(xiàn)實中,常用詞的出現(xiàn)頻率或者概率肯定比罕見詞要大谭溉。因此墙懂,可以將求解詞圖最短路徑的問題轉(zhuǎn)化為求解最大概率路徑的問題,即分詞結(jié)果為“最有可能的詞的組合“扮念。
計算詞出現(xiàn)的概率损搬,僅有詞典是不夠的,還需要充足的語料柜与,所以分詞任務已經(jīng)從單純的“算法”上升到了“建那汕冢”,即利用統(tǒng)計學方法結(jié)合大數(shù)據(jù)挖掘弄匕,對“語言”(句子出現(xiàn)的概率)進行建模颅悉。
我們將基于N-gram模型所統(tǒng)計出的概率分布應用到詞圖中迁匠,可以得到詞的概率圖剩瓶。對該詞圖用最短路徑分詞算法求解最大概率的路徑,即可得到分詞結(jié)果延曙。
相較于前兩種分詞算法,基于N-Gram model的分詞算法對詞頻進行了統(tǒng)計建模枝缔,在切分有歧義的時候力求得到全局最優(yōu)值布疙,比如在切分方案“證券/自營/業(yè)務”和“證券/自/營業(yè)/務”中,統(tǒng)計出“證券/自營/業(yè)務”出現(xiàn)的概率更大愿卸,因此結(jié)果有更高的準確率。但也依然無法解決金融場景中未登錄詞的問題擦酌。
生成式模型分詞算法
生成式模型主要有隱馬爾可夫模型(HMM,Hidden Markov Model)赊舶、樸素貝葉斯分類等睁搭。HMM是常用的分詞模型,基于Python的jieba分詞器和基于Java的HanLP分詞器都使用了HMM笼平。
HMM模型認為在解決序列標注問題時存在兩種序列园骆,一種是觀測序列寓调,即人們顯性觀察到的句子,另一種是隱狀態(tài)序列夺英,即觀測序列的標簽。假設觀測序列為X痛悯,隱狀態(tài)序列是Y,則因果關系為Y->X载萌。因此要得到標注結(jié)果Y,必須對X的概率扭仁、Y的概率、P(X|Y)進行計算乖坠,即建立P(X,Y)的概率分布模型。
HMM算法可以在一定程度上解決未登錄詞的問題熊泵,但生成式模型的準確率往往沒有接下來要談到的判別式模型高涩赢。
判別式模型分詞算法
判別式模型主要有感知機轩勘、支持向量機(SVM,Support Vector Machine)绊寻、條件隨機場(CRF,Conditional Random Field)澄步、最大熵模型等,其中感知機模型和CRF模型是常用的分詞模型村缸。
(1)平均感知機分詞算法
感知機是一種簡單的二分類線性模型,通過構(gòu)造超平面梯皿,將特征空間(輸入空間)中的樣本分為正負兩類。通過組合剂桥,感知機也可以處理多分類問題。但由于每次迭代都會更新模型的所有權(quán)重权逗,被誤分類的樣本會造成很大影響,因此采用平均的方法斟薇,在處理完一部分樣本后對更新的權(quán)重進行平均。
(2)CRF分詞算法
CRF可以看作一個無向圖模型奔垦,假設給定的標注序列為Y尸疆,觀測序列為X,CRF對條件概率P(Y|X)進行定義寿弱,而不是對聯(lián)合概率建模。
平均感知機算法雖然速度快症革,但仍不夠準確鸯旁。適合一些對速度要求高噪矛、對準確性要求相對不那么高的場景。CRF分詞算法可以說是目前最常用的分詞艇挨、詞性標注和實體識別算法,它對未登陸詞也有很好的識別能力缩滨,是目前在速度、準確率以及未登錄詞識別上綜合表現(xiàn)最突出的算法苞冯,也是我們目前所采用的解決方案,但速度會比感知機慢一些舅锄。
神經(jīng)網(wǎng)絡分詞算法
在NLP中司忱,最常用的神經(jīng)網(wǎng)絡為循環(huán)神經(jīng)網(wǎng)絡(RNN皇忿,Recurrent Neural Network)烘贴,它在處理變長輸入和序列輸入問題中有著巨大的優(yōu)勢。LSTM(Long Short-Term Memory桨踪,長短期記憶網(wǎng)絡)為RNN變種的一種,在一定程度上解決了RNN在訓練過程中梯度消失和梯度爆炸的問題锻离。
目前對于序列標注任務,業(yè)內(nèi)公認效果最好的模型是BiLSTM+CRF卫键。相比于上述其它模型,雙向循環(huán)神經(jīng)網(wǎng)絡BiLSTM莉炉,可以更好地編碼當前字等上下文信息,并在最終增加CRF層絮宁,核心是用Viterbi算法進行解碼服协,以得到全局最優(yōu)解绍昂,避免B,S,E這種不可能的標記結(jié)果的出現(xiàn),提高準確率窘游。
神經(jīng)網(wǎng)絡分詞雖然能在準確率、未登錄詞識別上有更好的表現(xiàn)贪嫂,但RNN無法并行計算,在速度上沒有優(yōu)勢撩荣,所以該算法通常在算法研究、句子精確解析等對速度要求不高的場景下使用餐曹。
小結(jié)
分詞作為NLP底層任務之一敌厘,既簡單又重要台猴,很多時候上層算法的錯誤都是由分詞結(jié)果導致的俱两。因此,對于底層實現(xiàn)的算法工程師宪彩,不僅需要深入理解分詞算法,更需要懂得如何高效地實現(xiàn)和調(diào)試尿孔。
而對于上層應用的算法工程師,在實際分詞時雏婶,需要根據(jù)業(yè)務場景有選擇地應用上述算法,比如在搜索引擎對大規(guī)模網(wǎng)頁進行內(nèi)容解析時留晚,對分詞對速度要求大于精度,而在智能問答中由于句子較短错维,對分詞的精度要求大于速度橄唬。