「達觀杯」進行時 | 萬字長文詳解「智能文本抽取」算法進階與應用

首先簡單地介紹一下咱們公司。達觀數據是一家專一於作文本智能處理的科技公司,目前完成了B輪,融資超過2億元,投資機構包括寬帶、軟銀、真格等等。咱們主要作的是利用天然語言處理、光學字符識別(OCR)、知識圖譜等技術,爲大型企業和政府機構提供機器人流程自動化(RPA)、文檔智能審閱、垂直搜索、智能推薦、客戶意見洞察等智能產品,讓計算機代替人工完成業務流程自動化,大幅度提升企業效率。
圖片描述
達觀數據
圖片描述面試

文本挖掘簡介

下面咱們開始介紹一下文本挖掘。下圖中,咱們能夠把人工智能分爲三類——圖像、文本和語音。達觀是主要在文本智能領域的公司。文本相對於圖像和語言來講更難處理,由於文本數據須要作一些邏輯分析。圖像和語音屬於感知智能,而文本屬於認知智能,因此號稱是「人工智能的明珠」,難度很大。算法

clipboard.png

天然語言處理的任務是什麼?簡單來講就是讓機器知道怎麼看、要麼寫。咱們通常把「看」叫天然語言理解(NLU),包括自動化審覈、自動文本比對、信息糾錯,搜索推薦等等,它能夠大幅度減輕人工的負擔。自動寫做叫天然語言生成(NLG),包括自動填表、生成摘要,文本潤色,還有你們看到的「自動生成股市」、「自動生成對聯」等等。目前咱們主要仍是在解決天然語言理解的問題。語言生成由於一些限制,實際落地的效果仍然有待提升的。因此咱們今天主要討論天然語言理解這部分。數據庫

clipboard.png

其實天然語言處理的歷史很是悠久,甚至出如今「AI」這個概念以前,最先叫「符號主義」。剛開始的時候人們選擇了一個很很差的場景:機器翻譯。機器翻譯是一個難度很大的任務,由於涉及了語義的理解和不一樣語種語法的規則。因此早期天然語言處理不是很成功。過了20-30年,到上世紀80年代開始,咱們使用了語法規則,基於天然語言處理的一些基本原理,再經過人工在這些語法的規則上進行修訂,作了一些問答、翻譯和搜索方面的嘗試。網絡

天然語言處理真正的黃金時期是從上世紀90年代開始,那時候咱們搞了統計學,作了不少基於統計機器學習的算法。從下圖中咱們能夠發現,統計模型的效果讓天然語言處理的應用領域更加普遍,產生了很大進步。其實在上世紀90年代的時候,天然語言處理已經能夠在不少場景表現得很不錯了,比以前的技術要先進不少。框架

clipboard.png

從2006年到如今,深度學習已經開始起步。以前「神經網絡」這個概念已經有了,只是當時受限於各類各樣的算法和硬件,無法作得很好。但如今各方面都成熟以後,你們發現深度學習是一個神器。其實深度學習最先的時候在圖像領域的應用較多,但目前天然語言處理也逐漸開始過渡到深度學習的階段。尤爲是去年像BERT這樣的模型出來以後,咱們發現天然語言處理的評測常常被屠榜,這說明神經網絡很是有效,但也說明數據也很重要,後文中咱們會解釋數據的重要性。機器學習

clipboard.png

咱們對比一下人類和計算機之間的差別。其實咱們人類短期內閱讀理解文字的能力還不錯,可是時間久了很容易遺忘。但計算機基本不會忘,只要硬盤不壞。人腦難以長期記憶,但咱們對內容的推理能力比計算機強。所以,咱們能夠請計算機來作一些比較細節的工做。例如文字比對,咱們檢查錯誤要逐字逐句地看,很是累。計算機能作到秒看,卻很難作複雜的邏輯和推理。分佈式

此外,雖然人類閱讀速度很快,但寫做速度很慢。你們高考的時候都要留幾十分鐘來寫做。這是由於寫的時候,咱們手速有限。並且在寫的過程當中還要進行不少思考。寫做本質是把腦中的不少語義信息壓縮到一個點,也就是文章的主題。有了主題後咱們還要再把做文展開,因此要花不少時間構思大綱、設計章節結構和文章主線,很是耗時。因此你們不要催那些網文做者了,他們天天寫得其實挺辛苦的。要把整個大的流程串起來,實際上是一件比較難的事情。函數

咱們在接受信息時能很快地理解總體,可是難以記住細節。咱們看完一個東西馬上能知道它的中心思想。例如,咱們瀏覽了一個企業的信息以後,就能作出「這個企業比較靠譜,願意投資」的判斷。可是企業收入、競爭利潤、負債這些具體數字很難所有記清楚。因此人去尋找局部信息的能力和計算機比很是慢。計算機的優勢就是找這種局部信息,越細的東西它找得越快。工具

clipboard.png

什麼場景比較適合讓計算機去作?基於現階段的技術,如今大部分場景計算機仍是沒法取代人。咱們能夠看到,不少行業,包括法律,包括企業合同、客戶意見、產品手冊、新聞、問答資料的數據是須要咱們親自來看。雖然這些行業領域不一樣,但作的事情都相似。審一個企業合同的時候,須要看一些關鍵的信息,如甲方、乙方,以及這些東西是否合規,總金額是否正確。在法律行業,法官判案時也要看整個案由,包括被告和原告的相關信息,案件的時間、地點等等。這些都是信息抽取,在不少應用場景下都須要信息抽取。不管咱們作了什麼決策,判斷是否投資,是否經過合同,如何進行法律判決,都須要先從文字中提取信息。學習

其實在一些比較固定的,相對簡單,不須要特別複雜的邏輯推理的場景中,機器學習算法已經能夠完成信息抽取任務。咱們正努力讓計算機在這些場景落地,這不只僅是算法的問題,也是應用的問題。這也是咱們一直在思考的問題。

clipboard.png

抽取算法概述

如今咱們具體講講信息抽取的幾種最主流的算法。
圖片描述
什麼是信息抽取?其實就是從文本中找到指定類型的實體。你們應該聽過命名實體識別(NER),其實命名實體識別只是抽取中的一種。廣義上的信息抽取,除了命名實體識別以外,還包括關係抽取、事件抽取等。其實在我看來,關係抽取和事件抽取比命名實體識別的應用層次更高級一點。由於這兩個抽取同須要作NER,只是在作NER的基礎之上,還要作一些其餘的工做,來知足場景需求。

咱們先從最簡單的NER開始。命名實體通常是指人物、地點、機構、時間等內容。如今咱們以公司抽取爲例詳細說明一下。

clipboard.png

若是從歷史的角度來講,識別公司的任務就是所謂的「符號主義」任務,簡單來講就是窮舉全部公司的名稱作詞典匹配。這樣就是一個命名實體。可是,這麼作場景其實有限。爲何?由於上市公司的集合是有限的,因此直接拿公司字典可能比訓練模型更快。

可是你會發現這種場景並不常見。好比,若是抽取全部公司(不只限於上市公司)就不能用這種辦法,由於公司實在太多了。十年前若是你看到「餓了麼」,若是沒有上下文,你不會以爲這是一個公司,但由於如今你們常常點「餓了麼」,都知道這是一個公司的名字。並且,天天都有大量新公司產生,因此總體的公司是一個無法窮盡的集合。在這種狀況下,咱們沒辦法用字典很好地完成絕大多數任務。

clipboard.png

以前咱們提到了上下文。那咱們如今加入上下文信息,是否是能夠知道某個實體是一個公司呢?最直接的方法是經過語法規則來作,例如「A是一家公司」、「B做爲一家公司」等等。你會看到這樣的一些模板,而後再去分析。若是說得學術/技術一點,至關於把這個任務提煉成一個比較複雜的句法依賴和語法規則。但從代碼角度可能會比較簡單,好比把模板中間的東西摳掉,而後去作匹配,作完匹配再去作填空,填空的內容就是你要的這些公司。

但這樣作也有很大的問題,由於咱們語言表述的方法太多了。例如,「我是A公司的」,「我來自B公司」以及不少種其餘不一樣的表述都是一個意思,咱們沒法窮盡全部的表述方法。甚至周星弛的電影也能增長這種作法的難度。咱們之前說「我先走了」,如今會說「我走了先」、「我吃了先」,這其實跟咱們傳統的語法都不太同樣,但現實生活中就有這麼多表述。不過,和上面的字典相似,在特定的場合,好比一些特定領域的公文等文書文章,仍是有套路或者標準寫法,也許能夠用這種方法。總的來講這種方法比較簡單。

clipboard.png

更高級的是基於統計機器學習的方法,從算法上來講是用序列標註的方式來作。這種方法要求咱們標註數據,例如上圖中咱們標註了一句話:「達觀數據是人工智能公司」。如今它會預測「上海的虛擬數據」中的「虛擬數據」也是一家公司。它是怎麼作到的?後文會詳細介紹。這種作法就跟模板匹配徹底不同了。在圖中,可能第一個預測「虛擬數據是人工智能公司」還有模板的性質,但後面兩個表述和前面徹底不一樣,因此這種基於統計機器學習的方式有了必定的預測能力。

但問題是什麼?它須要兩個條件。首先是數據。大部分的機器學習都是監督學習,要作數據標註。並且咱們傳統機器學習常常要作特徵工程。甚至在不少任務中,一個特徵工程可能要佔到咱們項目時間和精力的90%。咱們以前參加CIKM評測並拿到冠軍的任務中,就耗費了大量時間構建特徵。舉個例子,咱們實際工做中完成文本分類任務的時候,僅僅把文字的長度這個特徵加進去,效果一會兒提高了不少。這種特徵咱們很難想到。特徵的選擇可能有時候還有必定的邏輯推理,但有的時候就是拍腦殼。因此特徵工程作好是很難的,須要不少的經驗,還須要有擴散性的思惟。

此外訓練和預測須要不少計算資源。某些機器學習(尤爲是傳統的機器學習)的訓練過程當中,特徵有時候會特別耗費內存,可能不必定訓練得完,因此對機器有必定的限制。固然,如今作深度學習,限制多是GPU。深度學習相對於傳統機器學習,對數據量地要求更高。由於傳統的機器學習模型的各類參數沒有深度學習這麼多。

clipboard.png

雖然深度學習的可解釋性常常被人詬病,但也有些模型實際上能夠給咱們一些解釋。尤爲是一些基於Attention機制的模型。這裏就是一個Attention分類器。圖中能夠看到它能從句子級別和詞級別告訴你,對一個分類模型來講,哪句話最重要,哪一個詞最重要。這些詞和句子都是有權重的。由於有Attention這樣的權重,咱們就能把它拿出來作可視化。

clipboard.png

因此總體來講仍是要經過序列標註來作。上圖有一個序列標註的例子:分詞。要分詞的句子是「它來自達觀數據」。咱們有一個叫Label Set,也就是標籤集。圖中咱們用的是BMES這個很經典的標籤集,這個標籤集其實對應的英文Begin、Middle、End、Single,你們一看就知道是什麼意思。對於分詞來講,每一個字可能組成一個詞(單字成詞),也多是一個詞的開始、的中間或結尾。

上圖還能夠看到,在分詞以外,命名實體咱們用另一個標籤集。咱們作詞性分析可能用不一樣的標籤集。能夠看到,不一樣的標籤集能夠用來作不一樣的事情。因此不管是傳統的機器學習,仍是深度學習,咱們都是在解決一個叫作「序列標註」的問題。因此標籤集和標註方式都是基礎的、幾乎是同樣的。有什麼樣不一樣?後文會具體討論。

clipboard.png

傳統抽取算法介紹

其實傳統抽取算法有不少,這裏會介紹一些你們比較經常使用,也比較好理解的模型。第一個模型叫生成式模型。生成式模型的一個表明就是隱馬爾科夫模型(HMM)。另一個是判別式模型,表明是條件隨機場(CRF)。這兩個模型都結合了機率論還有圖論的一些內容,也都基於統計機器學習的算法。它們都能根據訓練集訓練出不一樣的結果。下面咱們詳細介紹一下這兩個模型。

clipboard.png

我人生第一次作序列標註任務的時候,用的就是HMM模型。馬爾可夫這個名字一聽就像是個數學很厲害的俄國人,但其實HMM模型並不難。你們只要記住兩部份內容:兩個序列、三個矩陣。以下圖所示。咱們要作的就就是把這五個部分定義好,整個模型和要解決的問題就定義清楚了。

clipboard.png

首先是觀察序列。上圖中「他來自達觀數據」,就是咱們人看獲得的觀察序列,但它背後隱藏了分詞。「他」是一個詞,「來自」是一個詞,「達觀數據」是一個詞,這個是咱們說「隱藏序列」,沒有寫到明面上,但須要咱們模型預測。怎麼預測?下圖畫了預測模型的示意圖。圖中,X_一、X_二、X_3就是咱們說的隱藏內容,人能看到的是y_一、y_二、y_三、y_4,也就是觀察序列。但其實不一樣狀態是能夠不停地轉換的。好比X_1到X_2之間有一條連線說明X_1和X_2之間能夠經過幾率a_12作轉換;X_2到X_3之間經過幾率a_23作轉換。因此這個模型其實比鏈式的HMM還要更復雜一點,由於它有X_2到X_1這樣的轉換。全部的X均可以轉換到y_一、y_二、y_三、y_4這樣的觀察序列,沒對轉換關係都有對應的機率。

clipboard.png

這樣咱們就把模型定義好了。咱們只須要求模型的哪幾個部分呢?主要是這三個矩陣:初始狀態矩陣,發射狀態矩陣,以及狀態轉移矩陣。

第一個是初始狀態矩陣。咱們如今舉的例子都是有序列標註,例如多輪分詞。下圖是一個真實的多輪分詞模型裏面的圖,這是咱們本身訓練的一個模型。能夠看到,初始狀態只多是S(ingle)或B(egin),由於不可能從表明詞結尾的標記開始一個句子。因此咱們要從全部的語料中統計,單字詞S和多字詞B開始的機率是多少。僅僅統計這兩個矩陣就能夠,由於其餘兩個標記M(iddle)和E(en)是不可能出如今句首的。圖中的機率有負數,是由於通過log和相關處理,從而能夠方便後續的計算,但本質的含義仍是機率。

clipboard.png

第二個矩陣是發射狀態矩陣。什麼是發射狀態矩陣?簡單來講就是咱們在分詞裏每一個字變成任何一個標籤的機率(以下圖所示)。例如「他」這個字若是來自「他來自達觀數據」這句話,就是一個單字詞S(ingle);但若是在「他」出如今「他們」等多字詞裏,標籤就是B(egin);在「關心你我他」裏,「他」的標籤可能就是E(end)。因此你會在訓練語料看到「他」有不一樣的標籤。發射狀態矩陣就是把「他」到每個標籤的機率集合起來。發射狀態矩陣很是重要,它說明了每個字到不一樣標籤的機率。

clipboard.png

第三個是狀態轉移矩陣。什麼是狀態轉移矩陣?其實狀態轉移矩陣也是統計出來的,也就是剛纔說的X_1和X_2之間的機率。咱們訓練語料裏面已經有了SB、BMME這樣的標籤。其實咱們能夠觀察到一些現象,例如S(ingle)後面不可能跟E(nd)和M(iddle)。這些就是狀態轉移矩陣描述的內容,以下圖所示。它說明E後面跟着S的機率是多少,E後面跟着B的機率又是多少等等。這些值其實都是從語料庫中訓練出來的。

clipboard.png

下面討論兩類學習算法:一種是「監督學習」,經過極大似然估計就能夠獲得這些值,很是好算,簡單地說就是統計次數:統計這個標籤一共有多少,相關機率又是多少,就能夠得出結果了。還有是一個非監督學習Baum-Welch,這個算法咱們用得比較少,由於根據咱們本身的經驗,它的總體效果會比作統計差不少。並且監督學習有個好處是由於有了訓練集和相關的數據,因此很容易去查錯。

解碼算法基本是用Viterbi來作。固然你也能夠把當前最好的狀態輸出來,找到在當前序列下可以輸出的最大標籤,經過本身的一些解碼邏輯(好比B後面必定是M或者E,不多是S)優化一些內容。但咱們常常仍是用Viterbi去作總體的解碼,取得最優路徑的機率。Viterbi解碼算法你們必定要掌握,由於後面有有很多算法與它相似。只要把Viterbi學會了,後面的不少東西就很好理解了。

HMM是我我的學的第一個模型,可是我如今基本上不用這個模型。爲何不用?由於它的效果仍是相對差一點。但它也有優勢。由於作極大似然估計就是簡單的統計,速度很是快。因此這個模型的更新能夠作到秒級。你作一個數據的修改,跑一遍馬上把數據統計出來,修改矩陣之後很快就對這個模型作一個更新。因此在項目的初始階段,咱們能夠快速地用這個方法來作baseline或者動態的修改。尤爲在實際業務中,可能客戶作了一些修改後他須要實時知道反饋,這時候能夠用HMM,雖然可能不能保證有好的效果。

clipboard.png

在實際應用中咱們用的最多仍是條件隨機場(CRF)。由於CRF每每效果更好。下圖說明了HMM和CRF的關係是什麼,咱們能夠看到一個HMM是鏈式傳遞,但加上一個條件就是咱們最多見的鏈式條件隨機場。通用CRF就是下圖中右下角的圖,可是咱們作序列標註的話多是最下面一行中間的這個圖,也就是鏈式的CRF。它跟上面一行的圖的區別是什麼?你們能夠看到下面一行圖中有好多小的黑色正方形,這就是咱們說的條件。咱們是如何得出條件的?下面咱們就來介紹一下如何經過真實訓練獲得條件。

clipboard.png

咱們先看下面這張圖。圖中nz在詞性裏表示是一個「其餘」類型的實體。這種類型很難納入時間、地點、人物等常見的實體類型,好比「蘋果手機」可能就能夠算是一個nz。咱們把全部不太好分類的實體都納入到nz裏。在這裏,標籤集仍是BMES,可是加了一個「O」。標籤後面的後綴其實就是類型。剛纔提到的「其餘」是nz,還能夠有其餘類型(如地名、時間、機構等)能夠用其餘字符串表示,好比nr、ns、nt。定義好這套標籤集後,咱們就開始定義特徵函數。

clipboard.png

下圖是咱們是用CRF++、CRFPP作的特徵模板。你們能夠看到,圖裏有U00到U08,最後還有一個字母「B」,B說明它會學習標籤間的轉移。U00到U08都是特徵,U00表示第一個特徵,U01是第二個特徵。此外還有一個x%,它表明了前面特徵的內容。

首先看第一個特徵:U00: %X[-3,0]。U00表示把咱們要研究的字左邊的第三個字做爲特徵,向量後一個數0表示咱們沒有添加人工特徵。咱們把這些拼接起來就是一個最終的特徵。

clipboard.png

下圖中包括了特徵函數的權重(weight)。咱們能夠看到「U06:徑」,這表示當前的字右邊第三個字是一個「徑」字。咱們會給出每一個標籤的得分。可選的標籤就是BEMOS。這裏的數字表明得分(不是機率),有正有負。咱們最終就是要把訓練集全部的數據先經過這個特徵模板變成一個特徵。對於每一個字,都有8個特徵,第一個特徵就是當前字左邊的第三個字,第二個特徵是左邊第二個字,U03就是當前字自己。

clipboard.png

因此你們能夠看到CRF和HMM最大的不一樣。咱們定義了這樣一個特徵函數(或者特徵模板)。咱們還能夠人工設置一些特徵影響特徵模板。好比在研究當前字時,若是用了這樣的模板,我就知道前三個字和後三個字會對當前這個字的標籤的輸出產生影響。除此以外,還能夠用前一個字和當前字,或者當前字和後一個字的組合做爲特徵。有了這些特徵,咱們就要計算特徵的結果。這時能夠迭代訓練模型,CRF使用了L-BFGS來訓練。最終訓練出來的模型能夠告訴咱們每一個特徵值對於不一樣的標籤的值是多少,至關因而一個全局最優的值。

下面這張圖表明瞭標籤之間的轉移,這跟HMM很是像,也能夠算出來。因此CRF最終在一個全局最優的狀況下達到了一個最優勢。咱們能夠存儲這個最優勢狀況下每個特徵的值,用來解碼。

clipboard.png

CRF的解碼較爲簡單,咱們根據當前序列的位置,根據特徵的模板生成不少特徵函數,直接去查咱們的模型,找到其對應的特徵函數權重,以後每個特徵函數權重加起來。查到這個特徵函數就把相應的權重取出來,加起來,沒有查到就是0,就不用去作了,最終有一個得分,這樣每個標籤都會有相關的得分。這個字生成的Score會有BEMOS相對應的,最終獲得一個圖,咱們就用Viterbi解碼,跟前面同樣就能解出來了。

爲何CRF效果好?由於咱們能夠定義特徵模板,包括了不少上下文比較遠的特徵。CRF的特徵是人工選擇的,能夠選擇前兩個、前三個,甚至更多,因此可讓模型學到更多上下文,並且是遠距離的上下文,輔助咱們判斷,提高總體效果。但條件隨機場須要迭代優化,根據梯度降低的方向去找最優勢,因此總體速度相對較慢,算出來的模型也不會小。不少時候必需要篩選或裁剪標籤。

以上內容就是HMM和CRF這兩個傳統的算法。

clipboard.png

基於深度學習的抽取算法

經典機器學習的不少算法須要比較強的數學功底,經過數學公式作出優美完整的論證。但如今經典機器學習算法的收益已經沒有之前大了。緣由以下圖所示,圖中列出了文本挖掘領域中,經典的機器學習和深度學習的對比。

clipboard.png

最大的區別就是紫色的框:特徵工程。其實算法並很少,但特徵工程五花八門,包括咱們作文本處理時常常遇到的TF-IDF、互信息、信息增益、指望交叉熵等等。其實這些提取特徵的方式都有一些科學依據,但不少場景下咱們須要靠直覺。特徵工程每每佔到項目時間的90%。

而深度學習不在意特徵。模型定好以後只管輸入,有了輸入就能輸出一個最好的結果。基本不用改代碼的,只須要調參。若是數據小,還須要修改一下過擬合方面的東西就能夠了。可是用經典機器學習作特徵工程可能要改不少代碼才能作出一個很是好的特徵,這就是傳統機器學習和深度學習最大的區別。

用深度學習作文本處理基本繞不開LSTM。雖然如今有不少模型,但也採用LSTM作baseline。下面是一篇著名的介紹LSTM的文章的截圖,建議你們看一下原文。文章中最精華的就是下面四張圖,展現了LSTM的工做原理。

clipboard.png

第一個步驟是單元狀態丟棄(以下圖),圖中有兩個量x_t和h_t-1。x_t就是當前的輸入,h_t-1是上一時刻的隱層的輸出。這個公式求出來一個0-1之間的值,決定要留下多少東西。(任何東西乘以0-1其實就是計算要留多少東西,乘以0什麼都留不了,乘以1就都留下,乘0.8就留80%。)

clipboard.png

第一步:單元狀態丟棄

第二步是新信息的選擇。當前輸入包括上一時刻隱層的輸出和當前的輸入。這一步驟判斷應該留下來多少內容。它仍是計算兩個係數,一個i_t,這也是一個0-1之間的值。第二個是C_t,表示當前cell的狀態。計算完畢後須要把這兩個係數的值保存下來。

clipboard.png

第二步:新信息選擇

第三步是更新狀態。上面一步已經決定能夠留下的新內容和老內容。這一步要決定如何組合新老內容。老內容能夠乘以第一步計算出的f_t,新內容能夠乘以第二步算出來的i_t,而後把新老內容相加,就是最新的狀態了。

clipboard.png

第三步:單元狀態更新

第四步是得出最後的輸出值。Cell不會一股腦輸出,而是計算出了係數o_t和狀態相關的函數結果相乘後得出輸出。

clipboard.png

第四步:肯定輸出

以上四步定義了LSTM基本的原理。LSTM其實提出來已經不少年了,在不少場景下都經受了考驗。因此但願你們必定要把上面介紹的基礎原理了解好。

下圖顯示了基於深度學習的信息抽取技術Bi-LSTM+CRF的原理。這個方法表明了深度學習和傳統的機器學習一個很好的結合。傳統CRF最大的問題是特徵很稀疏,想作一個很好的特徵要花費不少時間。咱們可能會有幾套比較經典的特徵,但不必定保證效果最好,特別是訓練數據發生變化之後。而詞向量和Bi-LSTM能夠作不少的特徵提取工做。

clipboard.png

爲何要用Bi-LSTM而不是簡單的LSTM?舉個例子,「華爲發佈了新一代的麒麟處理X」這句話中,「X」一看就是處理器的「器」。由於咱們都知道前文「麒麟處理」後面確定跟着「器」。相似地,根據「X鮮和美國簽定了新一輪的諒解備忘錄」很容易猜出X是「朝鮮」的「鮮」,這是根據後文作出的判斷。自然的語言中存在先後文的信號,都會影響當前字的選擇。Bi-LSTM能夠兼顧先後文的影響,因此是從理論上來講是個很符合人類直覺的工具。

若是不用CRF,可能總體效果還不錯,但會出現不少bad case。好比B後面出現S,S後面出現O。由於算法只考慮當前的最優輸出,沒有考慮整個序列的最優結果。而CRF是一個考慮全局的算法,也考慮到標籤間的轉移機率。因此用CRF會獲得一個比較可控的結果。

總得來講,上圖介紹的Bi-LSTM+CRF方法,結合了CRF和Bi-LSTM,把「小明去達觀數據開會」這幾個字變成向量,經過中間的Bi-LSTM隱層,提取出來高維的特徵,輸入CRF層,CRF最後就會給出標籤和結果。

下面咱們會介紹這篇文章最重要的部分:預訓練模型。深度學習除了不用作大量的特徵工程,還能夠對文本作很是好的表示。這裏的例子是用Word2Vec作出詞向量,而後用TensorBoard可視化,以下圖所示。

clipboard.png

在圖中「威海」、「濰坊」、「棗莊」這三個山東的城市的詞彙,被轉化成了三個低維向量,向量中的數都是浮點數,有正數也有負數。若是從空間的角度來看這三個向量,能夠發現它們距離很近,說明從語義角度來看它們的含義很接近。並且咱們還能夠直接對這些詞向量進行計算,例如山東-威海=廣東-佛山,皇帝-皇后+女人=男人,因此詞向量是很優秀的天然語言的表徵方式。

上圖用的是Word2Vec模型。下圖還有一些其餘的模型,好比Glove。這兩個模型都是靜態表示。靜態表示有自然的缺陷,例如它們很難區分「蘋果好吃」和「蘋果手機」中的兩個「蘋果」。就好像咱們學技術的時候什麼都想學,但由於時間是有限,因此每種技術學得都不夠深刻。

clipboard.png

因此從2018年開始,出現了不少新的預訓練模型,很多模型都用《芝麻街》裏怪物的名字命名,好比ELMO、BERT和ERNIE。除此以外還有微軟的MASS,Google最新的XLNet等等。這些模型本質上都用深度學習的神經網絡作表示,雖然有的用Attention,有的用Transform,但本質差異不大。

這些模型和Word2Vec/Glove最大的區別在於它們是動態模型。下圖是一個真實的例子。輸入「蘋果好吃」和「蘋果手機」後,用BERT對每一個字建模,發現前兩個字的向量很不同。這說明BERT能夠根據不一樣的上下文語境編碼每一個字,或者說能夠根據上下文語境對同一個字作出不一樣的表示。

clipboard.png

BERT能夠根據上下文,對同一個字作出不一樣的表示。

如何選擇預訓練模型呢?我建議你們能夠都嘗試一下。大部分同窗均可以訓練ELMO,它的結構和LSTM很像,咱們能夠本身訓練一個語言模型。BERT訓練的成本就要高不少,但如今已經有一些其餘的框架或語言作處理。咱們本身用中文維基百科訓練BERT只用了幾天,也沒有用不少顯卡,固然咱們也作了很多優化工做。能夠先試着用Word2Vec看看效果,有可能效果已經很不錯。關鍵在於要找到在能力範圍內按時訓練完的模型。

clipboard.png

抽取算法在達觀的具體實踐

下面咱們分享一下在達觀的實踐中完成抽取任務的一些經驗和教訓。

首先咱們要注重場景。應用場景通常就是客戶提供的文檔,包括財務報表、基金合同等等。文檔處理的核心是天然語言處理,特別是抽取技術。咱們也須要考慮實際應用,結合一些其餘的工程技術,好比外部系統、分佈式技術、數據庫技術等等。

clipboard.png

第二是要解決數據不足的問題。尤爲是序列標註比文本分類須要更多的標註成本,因此極可能數據量不夠。雖然目前有一些通用的數據(好比《人民日報》的數據),但針對具體的業務場景可能沒有足夠多的語料和標註數據。這時候咱們就要作數據加強。數據加強是一種通用的方法,能夠應用於傳統的機器學習和深度學習中。

clipboard.png

在上圖中,咱們能夠看到標註數據只有三句話,黃色表示要作機構識別。怎麼增長標註數據的量?咱們能夠直接暴力地把它們兩兩隨機組合。初聽起來可能會以爲有點不可理喻,但確實有效果。上圖中右邊的三段話中,前兩段是兩兩隨機組合,最後一段是把三句話所有混合到一塊兒。把這些新生成的數據加入原數據起去作模型,就會發現效果的確好了不少。數據加強爲何有效?從模型的角度簡單地說,這樣能夠看到更多上下文,特別是能夠跨句子看到上下文,因此會有幫助。基本上寫5-10行代碼就能產生一些收益。

還有一種方法是非監督的Embeddin的學習。下圖是咱們的一個真實的例子。當時登貝萊剛轉會到巴塞羅那俱樂部。咱們用標準語料去訓練,發現「登貝萊」這個名字必定會被切開,不管怎麼訓練分詞都不行。潛在的解決方法之一是增長不少登貝萊相關的標註數據,可是這麼作收益不足。因此咱們就找了不少外部的語料作嵌入。

clipboard.png

如上圖所示,咱們在網上找了一些登貝萊的新聞補充到《人民日報》等語料裏一塊兒訓練。在徹底沒有修改,只是從新訓練了預訓練模型的狀況下,「登貝萊」就成了一個詞。這說明深度學習的預訓練模型,能夠很是好地捕捉到上下文,並且咱們知道大部分的神經網絡的語言模型訓練是非監督學習,因此不須要不少標註數據。能夠有很大數據量。整體來講數據越多,模型會學得越準,效果越好。BERT訓練了一兩千萬的中文後,能夠達到很是好的效果,我以爲這是個大力出奇跡的模型。

除了NER,還能夠抽取別的內容。例如知識圖譜就要作關係抽取。輸入一句話,「美國總統特朗普將考察蘋果公司,該公司由喬布斯創立」,怎麼抽取關係?有兩種方法。一種方式是把實體抽出來,而後兩兩實體作一些分類,分到一些關係裏面。另外一種依靠序列標註,也就是基於聯合標註的方法。這麼作的好處是不用修改標註框架。

clipboard.png

咱們總結一下本文內容。在實際工做中,到底怎麼來用深度學習挖掘文本?最重要的一點是要用預訓練模型,經過非監督數據訓練向量,提高泛化能力。雖然中間步驟難以分解,但由於深度學習有端到端的能力,因此對中間步驟要求較低。並且,深度學習能克服一些傳統模型的缺點,例如LSTM的上下文依賴就比CRF強。

clipboard.png

可是深度學習也有一些缺點,它在小數據集上的效果難以保證,極可能會過擬合或者難以收斂。例如你們看到TensorBoard常常在抖,就是有這樣的問題。並且你們如今把深度學習調參的工做叫煉丹室,你也不知道好壞就在反覆調。有時候調參的工做量不亞於特徵工程,特徵工程至少知道在作什麼,而想分析調參結果更加困難。另外深度學習對計算資源的要求更高。

因此咱們最終的思考是:第一要儘量地收集數據、理解數據,這是全部作機器學習的同窗第一步就應該作的事情。咱們應該去分析數據、看數據,而不是一開始就上模型。若是不作數據清洗,好數據、亂數據、髒數據都在裏面,模型是作很差的。就像教孩子同樣,若是好的壞的都教,他就不知道什麼是好壞了。並且咱們要分析問題的本質,選擇合適的模型。例如,對於已有數據的數據量,選先進模型有用嗎?若是沒有用,就要趕忙去收集數據。

並且在任務一開始的階段,我比較推薦你們作傳統的機器學習,由於這些模型比較現成,也比較通用。在作了一個很是好的baseline以後,你就知道底線在哪,而後再引用深度學習。去年的達觀杯咱們就發現不少參賽者一上來就在用深度學習,結果作了各類調參,效果還不如咱們本身20行代碼的傳統的機器學習。因此剛開始的時候必定要讓傳統機器學習幫助你,這樣你更有信心作後面的事情。另外,這句話必定要送給你們:「數據決定效果上限,模型逼近此上限」,因此你們必定要重視數據清理,數據的分析真的比調參調模型收益更大。

若是遇到疑難雜症,端到端技術常常會有驚喜,但不能保證每次都有驚喜。你們在學習的過程當中必定要關心最前沿的技術。

作機器學習確定會遇到失敗和挫折,重要的是從挫折中總結規律纔是最重要的,不要被同一個坑絆。這樣的經驗很難依靠別人教會,由於所處的環境、場景、場合、數據不可能徹底一致,因此須要有本身的思考。

最後,看完了這篇文章能作什麼呢?能夠參加咱們的「達觀杯」文本智能信息抽取挑戰賽。這是咱們第三次組織「達觀杯」比賽。比賽的一等獎有30000元獎金,二等獎2支隊伍有10000元的獎金,三等獎有5000元的獎金,優勝獎還有3000元。除此以外,TOP30同窗直接直通面試。下圖有賽事QQ羣,點擊【原文連接】能夠進入官網。

clipboard.png

你們看完這篇文章能夠用咱們介紹的內容作一些實踐。比賽的數據頗有意思,文字通過了加密,每一個字都作了一個隨機的映射。這麼作的好處是能夠更多地關注算法的自己,而不用去想如何補充數據。雖然補充數據在實際工做中很重要,但咱們的比賽主要仍是考察算法。

比賽數據有兩部分,一部分是有標註的數據,另一部分是一個規模達到上百萬的非標註的數據。比賽的關鍵就是如何利用這些非標註的數據來提高整個模型的效果。而這就是咱們最終在實際生活和工做中遇到的問題:只有少許標註數據,可是有大量的未標註數據。歡迎你們在比賽中實際運用一些算法和理論。由於有時候光看別人的分享難以得到深入的理解,可是通過「達觀杯」這樣的比賽就能把知識掌握地更好。

選手問答環節

問:爲何個人模型分數只有 0.72?

答:其實就如前文所說,應該先研究一下數據,並用傳統的方法提出一些baseline模型。不然就不知道這個任務的底線,也可能會出現過擬合。咱們本身內部用Python 串起來十幾行代碼,就能跑到0.8+。我以爲不到0.8可能出現了過擬合,沒有使用預訓練數據,只是使用了標註數據。因此建議先用標準模型試試,獲得一個baseline,得到一些信息,再去作一些比較複雜的模型。

問:如何調參?

答:這個問題特別深奧。不少狀況下咱們把一些同窗叫「調包俠」,他們沒有很好地理解算法本質,只是在瞎調。好比我曾經遇到一個同窗在LSTM裏把ReLu當成激活函數。但LSTM要求輸出爲0-1,而ReLu的輸出範圍是0到無窮大,因此梯度直接就爆炸了。我以爲調參有兩個重要的方面,首先是經驗的積累,這點只能靠本身;其次須要對模型和數學有必定的瞭解,這些不會直接告訴你如何調參,可是能給你一些靈感和方向。我也建議你們搜索一些網上的經典套路。

問:如何使用ELMO能訓練出更好的詞向量?

答:這個要看與什麼比較。咱們的實踐經驗不必定跟你相符。咱們發現,ELMO訓練出來的東西的確會比Word2Vec會好,並且要好很多,但跟BERT相比仍是會差一些。若是你要訓練一個不停地迭代的模型,可能花不少時間調參,可是可能沒有換掉整個模型框架的收益大。由於BERT效果的確要好不少,不管從機制仍是attention思路來講,都會比簡單的LSTM這種方式作得更好。

問:第31名能面試嗎?如何發簡歷?

答:若是你的成績是第31名,和第30名差了0.01,咱們不在意這種差別,能夠直接來。簡歷能夠發到maxinyi@datagrand.com,註明參加了「達觀杯」比賽。

【關於「達觀杯」】

「達觀杯」大賽由國內領先的文本智能處理科技公司達觀數據主辦,面向全球範圍的學生、學者和企業研發人員,旨在經過提供業務場景、真實數據、專家指導,藉助社會和學界的技術力量,進一步提高中文天然語言處理技術的研究水平,爲業界選拔和培養有志於天然語言處理領域的算法研究和應用探索的青年才俊,探索更多可能、開啓無限將來。

本次「達觀杯」文本信息智能抽取挑戰賽是達觀數據舉辦的第三屆「達觀杯」算法大賽。2017年和2018年,達觀分別以「個性化推薦」和「文本分類」爲主題主辦過兩次大賽,在全國範圍內引發了很大的反響,兩次比賽吸引了海內外近萬支隊伍參賽。

本次比賽的任務是信息抽取,給定必定數量的標註語料以及海量的未標註語料,在3個字段上作信息抽取任務。截至目前,「達觀杯」文本信息智能抽取挑戰賽已吸引來自海內外2200餘名選手參賽。

相關文章
相關標籤/搜索