導讀:
本文整理自達觀數(shù)據(jù)聯(lián)合創(chuàng)始人高翔 7 月 11 日的直播公開課——《智能文本信息抽取算法的進階和應(yīng)用》。
本文重點總結(jié)了文本信息抽取的傳統(tǒng)和前沿算法應(yīng)用,以及如何把這些方法應(yīng)用到“達觀杯”文本智能信息抽取挑戰(zhàn)賽中。
首先簡單地介紹一下我們公司。達觀數(shù)據(jù)是一家專注于做文本智能處理的科技公司,目前完成了B輪,融資超過2億元,投資機構(gòu)包括寬帶、軟銀、真格等等。我們主要做的是利用自然語言處理、光學字符識別(OCR)、知識圖譜等技術(shù),為大型企業(yè)和政府機構(gòu)提供機器人流程自動化(RPA)、文檔智能審閱、垂直搜索、智能推薦、客戶意見洞察等智能產(chǎn)品,讓計算機代替人工完成業(yè)務(wù)流程自動化,大幅度提高企業(yè)效率。
達觀數(shù)據(jù)
文本挖掘簡介
下面我們開始介紹一下文本挖掘。下圖中,我們可以把人工智能分為三類——圖像、文本和語音。達觀是主要在文本智能領(lǐng)域的公司。文本相對于圖像和語言來說更難處理,因為文本數(shù)據(jù)需要做一些邏輯分析。圖像和語音屬于感知智能,而文本屬于認知智能,所以號稱是“人工智能的明珠”,難度很大。
自然語言處理的任務(wù)是什么?簡單來說就是讓機器知道怎么看、要么寫。我們一般把“看”叫自然語言理解(NLU),包括自動化審核、自動文本比對、信息糾錯,搜索推薦等等,它可以大幅度減輕人工的負擔。自動寫作叫自然語言生成(NLG),包括自動填表、生成摘要,文本潤色,還有大家看到的“自動生成股市”、“自動生成對聯(lián)”等等。目前我們主要還是在解決自然語言理解的問題。語言生成因為一些限制,實際落地的效果仍然有待提高的。所以我們今天主要討論自然語言理解這部分。
其實自然語言處理的歷史非常悠久,甚至出現(xiàn)在“AI”這個概念之前,最早叫“符號主義”。剛開始的時候人們選擇了一個很不好的場景:機器翻譯。機器翻譯是一個難度很大的任務(wù),因為涉及了語義的理解和不同語種語法的規(guī)則。所以早期自然語言處理不是很成功。過了20-30年,到上世紀80年代開始,我們使用了語法規(guī)則,基于自然語言處理的一些基本原理,再通過人工在這些語法的規(guī)則上進行修訂,做了一些問答、翻譯和搜索方面的嘗試。
自然語言處理真正的黃金時期是從上世紀90年代開始,那時候我們搞了統(tǒng)計學,做了很多基于統(tǒng)計機器學習的算法。從下圖中我們可以發(fā)現(xiàn),統(tǒng)計模型的效果讓自然語言處理的應(yīng)用領(lǐng)域更加廣泛,產(chǎn)生了很大進步。其實在上世紀90年代的時候,自然語言處理已經(jīng)可以在很多場景表現(xiàn)得很不錯了,比之前的技術(shù)要先進很多。
從2006年到現(xiàn)在,深度學習已經(jīng)開始起步。之前“神經(jīng)網(wǎng)絡(luò)”這個概念已經(jīng)有了,只是當時受限于各種各樣的算法和硬件,沒法做得很好。但現(xiàn)在各方面都成熟之后,大家發(fā)現(xiàn)深度學習是一個神器。其實深度學習最早的時候在圖像領(lǐng)域的應(yīng)用較多,但目前自然語言處理也逐漸開始過渡到深度學習的階段。尤其是去年像BERT這樣的模型出來之后,我們發(fā)現(xiàn)自然語言處理的評測經(jīng)常被屠榜,這說明神經(jīng)網(wǎng)絡(luò)非常有效,但也說明數(shù)據(jù)也很重要,后文中我們會解釋數(shù)據(jù)的重要性。
我們對比一下人類和計算機之間的差異。其實我們?nèi)祟惗虝r間內(nèi)閱讀理解文字的能力還不錯,但是時間久了很容易遺忘。但計算機基本不會忘,只要硬盤不壞。人腦難以長期記憶,但我們對內(nèi)容的推理能力比計算機強。因此,我們可以請計算機來做一些比較細節(jié)的工作。例如文字比對,我們檢查錯誤要逐字逐句地看,非常累。計算機能做到秒看,卻很難做復雜的邏輯和推理。
此外,雖然人類閱讀速度很快,但寫作速度很慢。大家高考的時候都要留幾十分鐘來寫作。這是因為寫的時候,我們手速有限。而且在寫的過程中還要進行很多思考。寫作本質(zhì)是把腦中的很多語義信息壓縮到一個點,也就是文章的主題。有了主題后我們還要再把作文展開,所以要花很多時間構(gòu)思大綱、設(shè)計章節(jié)結(jié)構(gòu)和文章主線,非常耗時。所以大家不要催那些網(wǎng)文作者了,他們每天寫得其實挺辛苦的。要把整個大的流程串起來,其實是一件比較難的事情。
我們在接受信息時能很快地理解整體,但是難以記住細節(jié)。我們看完一個東西立刻能知道它的中心思想。例如,我們?yōu)g覽了一個企業(yè)的信息之后,就能做出“這個企業(yè)比較靠譜,愿意投資”的判斷。但是企業(yè)收入、競爭利潤、負債這些具體數(shù)字很難全部記清楚。所以人去尋找局部信息的能力和計算機比非常慢。計算機的優(yōu)點就是找這種局部信息,越細的東西它找得越快。
什么場景比較適合讓計算機去做?基于現(xiàn)階段的技術(shù),現(xiàn)在大部分場景計算機還是無法取代人。我們可以看到,很多行業(yè),包括法律,包括企業(yè)合同、客戶意見、產(chǎn)品手冊、新聞、問答資料的數(shù)據(jù)是需要我們親自來看。雖然這些行業(yè)領(lǐng)域不同,但做的事情都類似。審一個企業(yè)合同的時候,需要看一些關(guān)鍵的信息,如甲方、乙方,以及這些東西是否合規(guī),總金額是否正確。在法律行業(yè),法官判案時也要看整個案由,包括被告和原告的相關(guān)信息,案件的時間、地點等等。這些都是信息抽取,在很多應(yīng)用場景下都需要信息抽取。無論我們做了什么決策,判斷是否投資,是否通過合同,如何進行法律判決,都需要先從文字中提取信息。
其實在一些比較固定的,相對簡單,不需要特別復雜的邏輯推理的場景中,機器學習算法已經(jīng)可以完成信息抽取任務(wù)。我們正努力讓計算機在這些場景落地,這不僅僅是算法的問題,也是應(yīng)用的問題。這也是我們一直在思考的問題。
?
抽取算法概述
現(xiàn)在我們具體講講信息抽取的幾種最主流的算法。
什么是信息抽?。科鋵嵕褪菑奈谋局姓业街付愋偷膶嶓w。大家應(yīng)該聽過命名實體識別(NER),其實命名實體識別只是抽取中的一種。廣義上的信息抽取,除了命名實體識別之外,還包括關(guān)系抽取、事件抽取等。其實在我看來,關(guān)系抽取和事件抽取比命名實體識別的應(yīng)用層次更高級一點。因為這兩個抽取同需要做NER,只是在做NER的基礎(chǔ)之上,還要做一些其他的工作,來滿足場景需求。
我們先從最簡單的NER開始。命名實體一般是指人物、地點、機構(gòu)、時間等內(nèi)容?,F(xiàn)在我們以公司抽取為例詳細說明一下。
如果從歷史的角度來說,識別公司的任務(wù)就是所謂的“符號主義”任務(wù),簡單來說就是窮舉所有公司的名稱做詞典匹配。這樣就是一個命名實體。但是,這么做場景其實有限。為什么?因為上市公司的集合是有限的,所以直接拿公司字典可能比訓練模型更快。
但是你會發(fā)現(xiàn)這種場景并不常見。比如,如果抽取所有公司(不僅限于上市公司)就不能用這種辦法,因為公司實在太多了。十年前如果你看到“餓了么”,如果沒有上下文,你不會覺得這是一個公司,但因為現(xiàn)在大家經(jīng)常點“餓了么”,都知道這是一個公司的名字。而且,每天都有大量新公司產(chǎn)生,所以整體的公司是一個沒法窮盡的集合。在這種情況下,我們沒辦法用字典很好地完成絕大多數(shù)任務(wù)。
之前我們提到了上下文。那我們現(xiàn)在加入上下文信息,是不是可以知道某個實體是一個公司呢?最直接的方法是通過語法規(guī)則來做,例如“A是一家公司”、“B作為一家公司”等等。你會看到這樣的一些模板,然后再去分析。如果說得學術(shù)/技術(shù)一點,相當于把這個任務(wù)提煉成一個比較復雜的句法依賴和語法規(guī)則。但從代碼角度可能會比較簡單,比如把模板中間的東西摳掉,然后去做匹配,做完匹配再去做填空,填空的內(nèi)容就是你要的這些公司。
但這樣做也有很大的問題,因為我們語言表述的方法太多了。例如,“我是A公司的”,“我來自B公司”以及很多種其他不同的表述都是一個意思,我們無法窮盡所有的表述方法。甚至周星弛的電影也能增加這種做法的難度。我們以前說“我先走了”,現(xiàn)在會說“我走了先”、“我吃了先”,這其實跟我們傳統(tǒng)的語法都不太一樣,但現(xiàn)實生活中就有這么多表述。不過,和上面的字典類似,在特定的場合,比如一些特定領(lǐng)域的公文等文書文章,還是有套路或者標準寫法,也許可以用這種方法??偟膩碚f這種方法比較簡單。
更高級的是基于統(tǒng)計機器學習的方法,從算法上來說是用序列標注的方式來做。這種方法要求我們標注數(shù)據(jù),例如上圖中我們標注了一句話:“達觀數(shù)據(jù)是人工智能公司”?,F(xiàn)在它會預(yù)測“上海的虛擬數(shù)據(jù)”中的“虛擬數(shù)據(jù)”也是一家公司。它是怎么做到的?后文會詳細介紹。這種做法就跟模板匹配完全不一樣了。在圖中,可能第一個預(yù)測“虛擬數(shù)據(jù)是人工智能公司”還有模板的性質(zhì),但后面兩個表述和前面完全不同,所以這種基于統(tǒng)計機器學習的方式有了一定的預(yù)測能力。
但問題是什么?它需要兩個條件。首先是數(shù)據(jù)。大部分的機器學習都是監(jiān)督學習,要做數(shù)據(jù)標注。而且我們傳統(tǒng)機器學習經(jīng)常要做特征工程。甚至在很多任務(wù)中,一個特征工程可能要占到我們項目時間和精力的90%。我們之前參加CIKM評測并拿到冠軍的任務(wù)中,就耗費了大量時間構(gòu)建特征。舉個例子,我們實際工作中完成文本分類任務(wù)的時候,僅僅把文字的長度這個特征加進去,效果一下子提升了很多。這種特征我們很難想到。特征的選擇可能有時候還有一定的邏輯推理,但有的時候就是拍腦袋。所以特征工程做好是很難的,需要很多的經(jīng)驗,還需要有擴散性的思維。
此外訓練和預(yù)測需要很多計算資源。某些機器學習(尤其是傳統(tǒng)的機器學習)的訓練過程中,特征有時候會特別耗費內(nèi)存,可能不一定訓練得完,所以對機器有一定的限制。當然,現(xiàn)在做深度學習,限制可能是GPU。深度學習相對于傳統(tǒng)機器學習,對數(shù)據(jù)量地要求更高。因為傳統(tǒng)的機器學習模型的各種參數(shù)沒有深度學習這么多。
?
雖然深度學習的可解釋性經(jīng)常被人詬病,但也有些模型實際上可以給我們一些解釋。尤其是一些基于Attention機制的模型。這里就是一個Attention分類器。圖中可以看到它能從句子級別和詞級別告訴你,對一個分類模型來說,哪句話最重要,哪個詞最重要。這些詞和句子都是有權(quán)重的。因為有Attention這樣的權(quán)重,我們就能把它拿出來做可視化。
所以整體來說還是要通過序列標注來做。上圖有一個序列標注的例子:分詞。要分詞的句子是“它來自達觀數(shù)據(jù)”。我們有一個叫Label Set,也就是標簽集。圖中我們用的是BMES這個很經(jīng)典的標簽集,這個標簽集其實對應(yīng)的英文Begin、Middle、End、Single,大家一看就知道是什么意思。對于分詞來說,每個字可能組成一個詞(單字成詞),也可能是一個詞的開始、的中間或結(jié)尾。
從目前的技術(shù)角度來看,文檔標注的方式和序列標注的方式是略有不同的:
? ? ? ? ? 文檔標注即根據(jù)用戶事先定義好的特定信息對需要標注的文檔進行標注,該模塊是文檔審核和文檔抽取的基礎(chǔ)。被標注的文檔將作為模型訓練的語料,文檔標注的越精確、數(shù)據(jù)越多訓練出來的模型精度也就越高,抽取和審核的效果也就越好,因此,文檔中標注是智能文檔審閱系統(tǒng)的“糧食”;
? ? ? ? ? 文檔標注模塊分為管理員和標注員兩種角色,系統(tǒng)會根據(jù)角色的不同而分配給用戶不同的權(quán)限。
? ? ? ? ? 管理員:可以創(chuàng)建文檔類型、新建標注任務(wù)、將任務(wù)分配給不同的標注員、標注文件;
? ? ? ? ? 標注員:僅可以標注分配給自己的標注文件。
回到序列標注,上圖還可以看到,在分詞之外,命名實體我們用另外一個標簽集。我們做詞性分析可能用不同的標簽集??梢钥吹剑煌臉撕灱梢杂脕碜霾煌氖虑?。所以無論是傳統(tǒng)的機器學習,還是深度學習,我們都是在解決一個叫做“序列標注”的問題。所以標簽集和標注方式都是基礎(chǔ)的、幾乎是一樣的。有什么樣不同?后文會具體討論。
傳統(tǒng)抽取算法介紹
其實傳統(tǒng)抽取算法有很多,這里會介紹一些大家比較常用,也比較好理解的模型。第一個模型叫生成式模型。生成式模型的一個代表就是隱馬爾科夫模型(HMM)。另外一個是判別式模型,代表是條件隨機場(CRF)。這兩個模型都結(jié)合了概率論還有圖論的一些內(nèi)容,也都基于統(tǒng)計機器學習的算法。它們都能根據(jù)訓練集訓練出不同的結(jié)果。下面我們詳細介紹一下這兩個模型。
我人生第一次做序列標注任務(wù)的時候,用的就是HMM模型。馬爾可夫這個名字一聽就像是個數(shù)學很厲害的俄國人,但其實HMM模型并不難。大家只要記住兩部分內(nèi)容:兩個序列、三個矩陣。如下圖所示。我們要做的就就是把這五個部分定義好,整個模型和要解決的問題就定義清楚了。
首先是觀察序列。上圖中“他來自達觀數(shù)據(jù)”,就是我們?nèi)丝吹玫降挠^察序列,但它背后隱藏了分詞?!八笔且粋€詞,“來自”是一個詞,“達觀數(shù)據(jù)”是一個詞,這個是我們說“隱藏序列”,沒有寫到明面上,但需要我們模型預(yù)測。怎么預(yù)測?下圖畫了預(yù)測模型的示意圖。圖中,X_1、X_2、X_3就是我們說的隱藏內(nèi)容,人能看到的是y_1、y_2、y_3、y_4,也就是觀察序列。但其實不同狀態(tài)是可以不停地轉(zhuǎn)換的。比如X_1到X_2之間有一條連線說明X_1和X_2之間可以通過概率a_12做轉(zhuǎn)換;X_2到X_3之間通過概率a_23做轉(zhuǎn)換。所以這個模型其實比鏈式的HMM還要更復雜一點,因為它有X_2到X_1這樣的轉(zhuǎn)換。所有的X都可以轉(zhuǎn)換到y(tǒng)_1、y_2、y_3、y_4這樣的觀察序列,沒對轉(zhuǎn)換關(guān)系都有對應(yīng)的概率。
這樣我們就把模型定義好了。我們只需要求模型的哪幾個部分呢?主要是這三個矩陣:初始狀態(tài)矩陣,發(fā)射狀態(tài)矩陣,以及狀態(tài)轉(zhuǎn)移矩陣。
第一個是初始狀態(tài)矩陣。我們現(xiàn)在舉的例子都是有序列標注,例如多輪分詞。下圖是一個真實的多輪分詞模型里面的圖,這是我們自己訓練的一個模型??梢钥吹?,初始狀態(tài)只可能是S(ingle)或B(egin),因為不可能從代表詞結(jié)尾的標記開始一個句子。所以我們要從所有的語料中統(tǒng)計,單字詞S和多字詞B開始的概率是多少。僅僅統(tǒng)計這兩個矩陣就可以,因為其他兩個標記M(iddle)和E(en)是不可能出現(xiàn)在句首的。圖中的概率有負數(shù),是因為經(jīng)過log和相關(guān)處理,從而可以方便后續(xù)的計算,但本質(zhì)的含義還是概率。
第二個矩陣是發(fā)射狀態(tài)矩陣。什么是發(fā)射狀態(tài)矩陣?簡單來說就是我們在分詞里每個字變成任何一個標簽的概率(如下圖所示)。例如“他”這個字如果來自“他來自達觀數(shù)據(jù)”這句話,就是一個單字詞S(ingle);但如果在“他”出現(xiàn)在“他們”等多字詞里,標簽就是B(egin);在“關(guān)心你我他”里,“他”的標簽可能就是E(end)。所以你會在訓練語料看到“他”有不同的標簽。發(fā)射狀態(tài)矩陣就是把“他”到每一個標簽的概率集合起來。發(fā)射狀態(tài)矩陣非常重要,它說明了每一個字到不同標簽的概率。
第三個是狀態(tài)轉(zhuǎn)移矩陣。什么是狀態(tài)轉(zhuǎn)移矩陣?其實狀態(tài)轉(zhuǎn)移矩陣也是統(tǒng)計出來的,也就是剛才說的X_1和X_2之間的概率。我們訓練語料里面已經(jīng)有了SB、BMME這樣的標簽。其實我們可以觀察到一些現(xiàn)象,例如S(ingle)后面不可能跟E(nd)和M(iddle)。這些就是狀態(tài)轉(zhuǎn)移矩陣描述的內(nèi)容,如下圖所示。它說明E后面跟著S的概率是多少,E后面跟著B的概率又是多少等等。這些值其實都是從語料庫中訓練出來的。
下面討論兩類學習算法:一種是“監(jiān)督學習”,通過極大似然估計就可以得到這些值,非常好算,簡單地說就是統(tǒng)計次數(shù):統(tǒng)計這個標簽一共有多少,相關(guān)概率又是多少,就可以得出結(jié)果了。還有是一個非監(jiān)督學習Baum-Welch,這個算法我們用得比較少,因為根據(jù)我們自己的經(jīng)驗,它的整體效果會比做統(tǒng)計差很多。而且監(jiān)督學習有個好處是因為有了訓練集和相關(guān)的數(shù)據(jù),所以很容易去查錯。
解碼算法基本是用Viterbi來做。當然你也可以把當前最好的狀態(tài)輸出來,找到在當前序列下能夠輸出的最大標簽,通過自己的一些解碼邏輯(比如B后面一定是M或者E,不可能是S)優(yōu)化一些內(nèi)容。但我們經(jīng)常還是用Viterbi去做整體的解碼,取得最優(yōu)路徑的概率。Viterbi解碼算法大家一定要掌握,因為后面有有不少算法與它類似。只要把Viterbi學會了,后面的很多東西就很好理解了。
HMM是我個人學的第一個模型,但是我現(xiàn)在基本上不用這個模型。為什么不用?因為它的效果還是相對差一點。但它也有優(yōu)點。因為做極大似然估計就是簡單的統(tǒng)計,速度非???。所以這個模型的更新可以做到秒級。你做一個數(shù)據(jù)的修改,跑一遍立刻把數(shù)據(jù)統(tǒng)計出來,修改矩陣以后很快就對這個模型做一個更新。所以在項目的初始階段,我們可以快速地用這個方法來做baseline或者動態(tài)的修改。尤其在實際業(yè)務(wù)中,可能客戶做了一些修改后他需要實時知道反饋,這時候可以用HMM,雖然可能不能保證有好的效果。
在實際應(yīng)用中我們用的最多還是條件隨機場(CRF)。因為CRF往往效果更好。下圖說明了HMM和CRF的關(guān)系是什么,我們可以看到一個HMM是鏈式傳遞,但加上一個條件就是我們最常見的鏈式條件隨機場。通用CRF就是下圖中右下角的圖,但是我們做序列標注的話可能是最下面一行中間的這個圖,也就是鏈式的CRF。它跟上面一行的圖的區(qū)別是什么?大家可以看到下面一行圖中有好多小的黑色正方形,這就是我們說的條件。我們是如何得出條件的?下面我們就來介紹一下如何通過真實訓練得到條件。
我們先看下面這張圖。圖中nz在詞性里表示是一個“其他”類型的實體。這種類型很難歸入時間、地點、人物等常見的實體類型,比如“蘋果手機”可能就可以算是一個nz。我們把所有不太好分類的實體都歸入到nz里。在這里,標簽集還是BMES,但是加了一個“O”。標簽后面的后綴其實就是類型。剛才提到的“其他”是nz,還可以有其他類型(如地名、時間、機構(gòu)等)可以用其他字符串表示,比如nr、ns、nt。定義好這套標簽集后,我們就開始定義特征函數(shù)。
下圖是我們是用CRF++、CRFPP做的特征模板。大家可以看到,圖里有U00到U08,最后還有一個字母“B”,B說明它會學習標簽間的轉(zhuǎn)移。U00到U08都是特征,U00表示第一個特征,U01是第二個特征。此外還有一個x%,它代表了前面特征的內(nèi)容。
首先看第一個特征:U00: %X[-3,0]。U00表示把我們要研究的字左邊的第三個字作為特征,向量后一個數(shù)0表示我們沒有添加人工特征。我們把這些拼接起來就是一個最終的特征。
下圖中包括了特征函數(shù)的權(quán)重(weight)。我們可以看到“U06:徑”,這表示當前的字右邊第三個字是一個“徑”字。我們會給出每個標簽的得分??蛇x的標簽就是BEMOS。這里的數(shù)字代表得分(不是概率),有正有負。我們最終就是要把訓練集所有的數(shù)據(jù)先通過這個特征模板變成一個特征。對于每個字,都有8個特征,第一個特征就是當前字左邊的第三個字,第二個特征是左邊第二個字,U03就是當前字本身。
所以大家可以看到CRF和HMM最大的不同。我們定義了這樣一個特征函數(shù)(或者特征模板)。我們還可以人工設(shè)置一些特征影響特征模板。比如在研究當前字時,如果用了這樣的模板,我就知道前三個字和后三個字會對當前這個字的標簽的輸出產(chǎn)生影響。除此之外,還可以用前一個字和當前字,或者當前字和后一個字的組合作為特征。有了這些特征,我們就要計算特征的結(jié)果。這時可以迭代訓練模型,CRF使用了L-BFGS來訓練。最終訓練出來的模型可以告訴我們每個特征值對于不同的標簽的值是多少,相當于是一個全局最優(yōu)的值。
下面這張圖代表了標簽之間的轉(zhuǎn)移,這跟HMM非常像,也可以算出來。所以CRF最終在一個全局最優(yōu)的情況下達到了一個最優(yōu)點。我們可以存儲這個最優(yōu)點情況下每一個特征的值,用來解碼。
CRF的解碼較為簡單,我們根據(jù)當前序列的位置,根據(jù)特征的模板生成很多特征函數(shù),直接去查我們的模型,找到其對應(yīng)的特征函數(shù)權(quán)重,之后每一個特征函數(shù)權(quán)重加起來。查到這個特征函數(shù)就把相應(yīng)的權(quán)重取出來,加起來,沒有查到就是0,就不用去做了,最終有一個得分,這樣每一個標簽都會有相關(guān)的得分。這個字生成的Score會有BEMOS相對應(yīng)的,最終得到一個圖,我們就用Viterbi解碼,跟前面一樣就能解出來了。
為什么CRF效果好?因為我們可以定義特征模板,包括了很多上下文比較遠的特征。CRF的特征是人工選擇的,可以選擇前兩個、前三個,甚至更多,所以可以讓模型學到更多上下文,而且是遠距離的上下文,輔助我們判斷,提升整體效果。但條件隨機場需要迭代優(yōu)化,根據(jù)梯度下降的方向去找最優(yōu)點,所以整體速度相對較慢,算出來的模型也不會小。很多時候必須要篩選或裁剪標簽。
以上內(nèi)容就是HMM和CRF這兩個傳統(tǒng)的算法。
基于深度學習的抽取算法
??
經(jīng)典機器學習的很多算法需要比較強的數(shù)學功底,通過數(shù)學公式做出優(yōu)美完整的論證。但現(xiàn)在經(jīng)典機器學習算法的收益已經(jīng)沒有以前大了。原因如下圖所示,圖中列出了文本挖掘領(lǐng)域中,經(jīng)典的機器學習和深度學習的對比。
最大的區(qū)別就是紫色的框:特征工程。其實算法并不多,但特征工程五花八門,包括我們做文本處理時經(jīng)常遇到的TF-IDF、互信息、信息增益、期望交叉熵等等。其實這些提取特征的方式都有一些科學依據(jù),但很多場景下我們需要靠直覺。特征工程往往占到項目時間的90%。
而深度學習不在乎特征。模型定好之后只管輸入,有了輸入就能輸出一個最好的結(jié)果?;静挥酶拇a的,只需要調(diào)參。如果數(shù)據(jù)小,還需要修改一下過擬合方面的東西就可以了。但是用經(jīng)典機器學習做特征工程可能要改很多代碼才能做出一個非常好的特征,這就是傳統(tǒng)機器學習和深度學習最大的區(qū)別。
用深度學習做文本處理基本繞不開LSTM。雖然現(xiàn)在有很多模型,但也采用LSTM做baseline。下面是一篇著名的介紹LSTM的文章的截圖,建議大家看一下原文。文章中最精華的就是下面四張圖,展示了LSTM的工作原理。
第一個步驟是單元狀態(tài)丟棄(如下圖),圖中有兩個量x_t和h_t-1。x_t就是當前的輸入,h_t-1是上一時刻的隱層的輸出。這個公式求出來一個0-1之間的值,決定要留下多少東西。(任何東西乘以0-1其實就是計算要留多少東西,乘以0什么都留不了,乘以1就都留下,乘0.8就留80%。)
第一步:單元狀態(tài)丟棄
第二步是新信息的選擇。當前輸入包括上一時刻隱層的輸出和當前的輸入。這一步驟判斷應(yīng)該留下來多少內(nèi)容。它還是計算兩個系數(shù),一個i_t,這也是一個0-1之間的值。第二個是C_t,表示當前cell的狀態(tài)。計算完畢后需要把這兩個系數(shù)的值保存下來。
第二步:新信息選擇
第三步是更新狀態(tài)。上面一步已經(jīng)決定可以留下的新內(nèi)容和老內(nèi)容。這一步要決定如何組合新老內(nèi)容。老內(nèi)容可以乘以第一步計算出的f_t,新內(nèi)容可以乘以第二步算出來的i_t,然后把新老內(nèi)容相加,就是最新的狀態(tài)了。
第三步:單元狀態(tài)更新
第四步是得出最后的輸出值。Cell不會一股腦輸出,而是計算出了系數(shù)o_t和狀態(tài)相關(guān)的函數(shù)結(jié)果相乘后得出輸出。
第四步:確定輸出
以上四步定義了LSTM基本的原理。LSTM其實提出來已經(jīng)很多年了,在很多場景下都經(jīng)受了考驗。所以希望大家一定要把上面介紹的基礎(chǔ)原理了解好。
下圖顯示了基于深度學習的信息抽取技術(shù)Bi-LSTM+CRF的原理。這個方法代表了深度學習和傳統(tǒng)的機器學習一個很好的結(jié)合。傳統(tǒng)CRF最大的問題是特征很稀疏,想做一個很好的特征要花費很多時間。我們可能會有幾套比較經(jīng)典的特征,但不一定保證效果最好,特別是訓練數(shù)據(jù)發(fā)生變化以后。而詞向量和Bi-LSTM可以做很多的特征提取工作。
為什么要用Bi-LSTM而不是簡單的LSTM?舉個例子,“華為發(fā)布了新一代的麒麟處理X”這句話中,“X”一看就是處理器的“器”。因為我們都知道前文“麒麟處理”后面肯定跟著“器”。類似地,根據(jù)“X鮮和美國簽訂了新一輪的諒解備忘錄”很容易猜出X是“朝鮮”的“鮮”,這是根據(jù)后文做出的判斷。天然的語言中存在前后文的信號,都會影響當前字的選擇。Bi-LSTM可以兼顧前后文的影響,所以是從理論上來說是個很符合人類直覺的工具。
如果不用CRF,可能整體效果還不錯,但會出現(xiàn)很多bad case。比如B后面出現(xiàn)S,S后面出現(xiàn)O。因為算法只考慮當前的最優(yōu)輸出,沒有考慮整個序列的最優(yōu)結(jié)果。而CRF是一個考慮全局的算法,也考慮到標簽間的轉(zhuǎn)移概率。所以用CRF會得到一個比較可控的結(jié)果。
總得來說,上圖介紹的Bi-LSTM+CRF方法,結(jié)合了CRF和Bi-LSTM,把“小明去達觀數(shù)據(jù)開會”這幾個字變成向量,通過中間的Bi-LSTM隱層,提取出來高維的特征,輸入CRF層,CRF最后就會給出標簽和結(jié)果。
下面我們會介紹這篇文章最重要的部分:預(yù)訓練模型。深度學習除了不用做大量的特征工程,還可以對文本做非常好的表示。這里的例子是用Word2Vec做出詞向量,然后用TensorBoard可視化,如下圖所示。
在圖中“威海”、“濰坊”、“棗莊”這三個山東的城市的詞匯,被轉(zhuǎn)化成了三個低維向量,向量中的數(shù)都是浮點數(shù),有正數(shù)也有負數(shù)。如果從空間的角度來看這三個向量,可以發(fā)現(xiàn)它們距離很近,說明從語義角度來看它們的含義很接近。而且我們還可以直接對這些詞向量進行計算,例如山東-威海=廣東-佛山,皇帝-皇后+女人=男人,所以詞向量是很優(yōu)秀的自然語言的表征方式。
上圖用的是Word2Vec模型。下圖還有一些其他的模型,比如Glove。這兩個模型都是靜態(tài)表示。靜態(tài)表示有天然的缺陷,例如它們很難區(qū)分“蘋果好吃”和“蘋果手機”中的兩個“蘋果”。就好像我們學技術(shù)的時候什么都想學,但因為時間是有限,所以每種技術(shù)學得都不夠深入。
?所以從2018年開始,出現(xiàn)了很多新的預(yù)訓練模型,不少模型都用《芝麻街》里怪物的名字命名,比如ELMO、BERT和ERNIE。除此之外還有微軟的MASS,Google最新的XLNet等等。這些模型本質(zhì)上都用深度學習的神經(jīng)網(wǎng)絡(luò)做表示,雖然有的用Attention,有的用Transform,但本質(zhì)差別不大。
這些模型和Word2Vec/Glove最大的區(qū)別在于它們是動態(tài)模型。下圖是一個真實的例子。輸入“蘋果好吃”和“蘋果手機”后,用BERT對每個字建模,發(fā)現(xiàn)前兩個字的向量很不一樣。這說明BERT可以根據(jù)不同的上下文語境編碼每個字,或者說可以根據(jù)上下文語境對同一個字做出不同的表示。
?BERT可以根據(jù)上下文,對同一個字做出不同的表示。
如何選擇預(yù)訓練模型呢?我建議大家可以都嘗試一下。大部分同學都可以訓練ELMO,它的結(jié)構(gòu)和LSTM很像,我們可以自己訓練一個語言模型。BERT訓練的成本就要高很多,但現(xiàn)在已經(jīng)有一些其他的框架或語言做處理。我們自己用中文維基百科訓練BERT只用了幾天,也沒有用很多顯卡,當然我們也做了不少優(yōu)化工作。可以先試著用Word2Vec看看效果,有可能效果已經(jīng)很不錯。關(guān)鍵在于要找到在能力范圍內(nèi)按時訓練完的模型。
?
抽取算法在達觀的具體實踐
下面我們分享一下在達觀的實踐中完成抽取任務(wù)的一些經(jīng)驗和教訓。
首先我們要注重場景。應(yīng)用場景一般就是客戶提供的文檔,包括財務(wù)報表、基金合同等等。文檔處理的核心是自然語言處理,特別是抽取技術(shù)。我們也需要考慮實際應(yīng)用,結(jié)合一些其他的工程技術(shù),比如外部系統(tǒng)、分布式技術(shù)、數(shù)據(jù)庫技術(shù)等等。
第二是要解決數(shù)據(jù)不足的問題。尤其是序列標注比文本分類需要更多的標注成本,所以很可能數(shù)據(jù)量不夠。雖然目前有一些通用的數(shù)據(jù)(比如《人民日報》的數(shù)據(jù)),但針對具體的業(yè)務(wù)場景可能沒有足夠多的語料和標注數(shù)據(jù)。這時候我們就要做數(shù)據(jù)增強。數(shù)據(jù)增強是一種通用的方法,可以應(yīng)用于傳統(tǒng)的機器學習和深度學習中。
在上圖中,我們可以看到標注數(shù)據(jù)只有三句話,黃色表示要做機構(gòu)識別。怎么增加標注數(shù)據(jù)的量?我們可以直接暴力地把它們兩兩隨機組合。初聽起來可能會覺得有點不可理喻,但確實有效果。上圖中右邊的三段話中,前兩段是兩兩隨機組合,最后一段是把三句話全部混合到一起。把這些新生成的數(shù)據(jù)加入原數(shù)據(jù)起去做模型,就會發(fā)現(xiàn)效果的確好了很多。數(shù)據(jù)增強為什么有效?從模型的角度簡單地說,這樣可以看到更多上下文,特別是可以跨句子看到上下文,所以會有幫助?;旧蠈?-10行代碼就能產(chǎn)生一些收益。
還有一種方法是非監(jiān)督的Embeddin的學習。下圖是我們的一個真實的例子。當時登貝萊剛轉(zhuǎn)會到巴塞羅那俱樂部。我們用標準語料去訓練,發(fā)現(xiàn)“登貝萊”這個名字一定會被切開,無論怎么訓練分詞都不行。潛在的解決方法之一是增加很多登貝萊相關(guān)的標注數(shù)據(jù),但是這么做收益不足。所以我們就找了很多外部的語料做嵌入。
如上圖所示,我們在網(wǎng)上找了一些登貝萊的新聞補充到《人民日報》等語料里一起訓練。在完全沒有修改,只是重新訓練了預(yù)訓練模型的情況下,“登貝萊”就成了一個詞。這說明深度學習的預(yù)訓練模型,可以非常好地捕捉到上下文,而且我們知道大部分的神經(jīng)網(wǎng)絡(luò)的語言模型訓練是非監(jiān)督學習,所以不需要很多標注數(shù)據(jù)。可以有很大數(shù)據(jù)量。總體來說數(shù)據(jù)越多,模型會學得越準,效果越好。BERT訓練了一兩千萬的中文后,可以達到非常好的效果,我覺得這是個大力出奇跡的模型。
除了NER,還可以抽取別的內(nèi)容。例如知識圖譜就要做關(guān)系抽取。輸入一句話,“美國總統(tǒng)特朗普將考察蘋果公司,該公司由喬布斯創(chuàng)立”,怎么抽取關(guān)系?有兩種方法。一種方式是把實體抽出來,然后兩兩實體做一些分類,分到一些關(guān)系里面。另一種依靠序列標注,也就是基于聯(lián)合標注的方法。這么做的好處是不用修改標注框架。
我們總結(jié)一下本文內(nèi)容。在實際工作中,到底怎么來用深度學習挖掘文本?最重要的一點是要用預(yù)訓練模型,通過非監(jiān)督數(shù)據(jù)訓練向量,提升泛化能力。雖然中間步驟難以分解,但因為深度學習有端到端的能力,所以對中間步驟要求較低。而且,深度學習能克服一些傳統(tǒng)模型的缺點,例如LSTM的上下文依賴就比CRF強。
但是深度學習也有一些缺點,它在小數(shù)據(jù)集上的效果難以保證,很可能會過擬合或者難以收斂。例如大家看到TensorBoard經(jīng)常在抖,就是有這樣的問題。而且大家現(xiàn)在把深度學習調(diào)參的工作叫煉丹室,你也不知道好壞就在反復調(diào)。有時候調(diào)參的工作量不亞于特征工程,特征工程至少知道在做什么,而想分析調(diào)參結(jié)果更加困難。另外深度學習對計算資源的要求更高。
所以我們最終的思考是:第一要盡可能地收集數(shù)據(jù)、理解數(shù)據(jù),這是所有做機器學習的同學第一步就應(yīng)該做的事情。我們應(yīng)該去分析數(shù)據(jù)、看數(shù)據(jù),而不是一開始就上模型。如果不做數(shù)據(jù)清洗,好數(shù)據(jù)、亂數(shù)據(jù)、臟數(shù)據(jù)都在里面,模型是做不好的。就像教孩子一樣,如果好的壞的都教,他就不知道什么是好壞了。而且我們要分析問題的本質(zhì),選擇合適的模型。例如,對于已有數(shù)據(jù)的數(shù)據(jù)量,選先進模型有用嗎?如果沒有用,就要趕緊去收集數(shù)據(jù)。
而且在任務(wù)一開始的階段,我比較推薦大家做傳統(tǒng)的機器學習,因為這些模型比較現(xiàn)成,也比較通用。在做了一個非常好的baseline之后,你就知道底線在哪,然后再引用深度學習。去年的達觀杯我們就發(fā)現(xiàn)很多參賽者一上來就在用深度學習,結(jié)果做了各種調(diào)參,效果還不如我們自己20行代碼的傳統(tǒng)的機器學習。所以剛開始的時候一定要讓傳統(tǒng)機器學習幫助你,這樣你更有信心做后面的事情。另外,這句話一定要送給大家:“數(shù)據(jù)決定效果上限,模型逼近此上限”,所以大家一定要重視數(shù)據(jù)清理,數(shù)據(jù)的分析真的比調(diào)參調(diào)模型收益更大。
如果遇到疑難雜癥,端到端技術(shù)經(jīng)常會有驚喜,但不能保證每次都有驚喜。大家在學習的過程中一定要關(guān)心最前沿的技術(shù)。
做機器學習肯定會遇到失敗和挫折,重要的是從挫折中總結(jié)規(guī)律才是最重要的,不要被同一個坑絆。這樣的經(jīng)驗很難依靠別人教會,因為所處的環(huán)境、場景、場合、數(shù)據(jù)不可能完全一致,所以需要有自己的思考。
最后,看完了這篇文章能做什么呢?可以參加我們的“達觀杯”文本智能信息抽取挑戰(zhàn)賽。這是我們第三次組織“達觀杯”比賽。比賽的一等獎有30000元獎金,二等獎2支隊伍有10000元的獎金,三等獎有5000元的獎金,優(yōu)勝獎還有3000元。除此之外,TOP30同學直接直通面試。下圖有賽事QQ群,點擊【原文鏈接】可以進入官網(wǎng)。
大家看完這篇文章可以用我們介紹的內(nèi)容做一些實踐。比賽的數(shù)據(jù)很有意思,文字經(jīng)過了加密,每個字都做了一個隨機的映射。這么做的好處是可以更多地關(guān)注算法的本身,而不用去想如何補充數(shù)據(jù)。雖然補充數(shù)據(jù)在實際工作中很重要,但我們的比賽主要還是考察算法。
比賽數(shù)據(jù)有兩部分,一部分是有標注的數(shù)據(jù),另外一部分是一個規(guī)模達到上百萬的非標注的數(shù)據(jù)。比賽的關(guān)鍵就是如何利用這些非標注的數(shù)據(jù)來提升整個模型的效果。而這就是我們最終在實際生活和工作中遇到的問題:只有少量標注數(shù)據(jù),但是有大量的未標注數(shù)據(jù)。歡迎大家在比賽中實際運用一些算法和理論。因為有時候光看別人的分享難以獲得深刻的理解,但是經(jīng)過“達觀杯”這樣的比賽就能把知識掌握地更好。
選手問答環(huán)節(jié)?
問:為什么我的模型分數(shù)只有 0.72??
答:其實就如前文所說,應(yīng)該先研究一下數(shù)據(jù),并用傳統(tǒng)的方法提出一些baseline模型。否則就不知道這個任務(wù)的底線,也可能會出現(xiàn)過擬合。我們自己內(nèi)部用Python 串起來十幾行代碼,就能跑到0.8+。我覺得不到0.8可能出現(xiàn)了過擬合,沒有使用預(yù)訓練數(shù)據(jù),只是使用了標注數(shù)據(jù)。所以建議先用標準模型試試,得到一個baseline,獲得一些信息,再去做一些比較復雜的模型。
???
問:如何調(diào)參?
答:這個問題特別深奧。很多情況下我們把一些同學叫“調(diào)包俠”,他們沒有很好地理解算法本質(zhì),只是在瞎調(diào)。比如我曾經(jīng)遇到一個同學在LSTM里把ReLu當成激活函數(shù)。但LSTM要求輸出為0-1,而ReLu的輸出范圍是0到無窮大,所以梯度直接就爆炸了。我覺得調(diào)參有兩個重要的方面,首先是經(jīng)驗的積累,這點只能靠自己;其次需要對模型和數(shù)學有一定的了解,這些不會直接告訴你如何調(diào)參,但是能給你一些靈感和方向。我也建議大家搜索一些網(wǎng)上的經(jīng)典套路。
問:如何使用ELMO能訓練出更好的詞向量?
答:這個要看與什么比較。我們的實踐經(jīng)驗不一定跟你相符。我們發(fā)現(xiàn),ELMO訓練出來的東西的確會比Word2Vec會好,而且要好不少,但跟BERT相比還是會差一些。如果你要訓練一個不停地迭代的模型,可能花很多時間調(diào)參,但是可能沒有換掉整個模型框架的收益大。因為BERT效果的確要好很多,無論從機制還是attention思路來說,都會比簡單的LSTM這種方式做得更好。
問:第31名能面試嗎?如何發(fā)簡歷?
答:如果你的成績是第31名,和第30名差了0.01,我們不在乎這種差異,可以直接來。簡歷可以發(fā)到maxinyi@datagrand.com,注明參加了“達觀杯”比賽。
【關(guān)于“達觀杯”】
“達觀杯”大賽由國內(nèi)領(lǐng)先的文本智能處理科技公司達觀數(shù)據(jù)主辦,面向全球范圍的學生、學者和企業(yè)研發(fā)人員,旨在通過提供業(yè)務(wù)場景、真實數(shù)據(jù)、專家指導,借助社會和學界的技術(shù)力量,進一步提升中文自然語言處理技術(shù)的研究水平,為業(yè)界選拔和培養(yǎng)有志于自然語言處理領(lǐng)域的算法研究和應(yīng)用探索的青年才俊,探索更多可能、開啟無限未來。
本次“達觀杯”文本信息智能抽取挑戰(zhàn)賽是達觀數(shù)據(jù)舉辦的第三屆“達觀杯”算法大賽。2017年和2018年,達觀分別以“個性化推薦”和“文本分類”為主題主辦過兩次大賽,在全國范圍內(nèi)引起了很大的反響,兩次比賽吸引了海內(nèi)外近萬支隊伍參賽。
本次比賽的任務(wù)是信息抽取,給定一定數(shù)量的標注語料以及海量的未標注語料,在3個字段上做信息抽取任務(wù)。截至目前,“達觀杯”文本信息智能抽取挑戰(zhàn)賽已吸引來自海內(nèi)外2200余名選手參賽。