日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

​万字长文详解文本抽取:从算法理论到实践(附“达观杯”官方baseline实现解析及答疑)...

發(fā)布時(shí)間:2023/12/20 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ​万字长文详解文本抽取:从算法理论到实践(附“达观杯”官方baseline实现解析及答疑)... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[ 導(dǎo)讀 ]“達(dá)觀杯”文本智能信息抽取挑戰(zhàn)賽已吸引來自中、美、英、法、德等26個(gè)國(guó)家和地區(qū)的2400余名選手參賽,目前仍在火熱進(jìn)行中(點(diǎn)擊“閱讀原文”進(jìn)入比賽頁(yè)面,QQ群見下圖或文末二維碼)。達(dá)觀數(shù)據(jù)目前已經(jīng)舉行過兩次圍繞比賽的技術(shù)直播分享,并開源了baseline模型。本文是這兩次技術(shù)直播的內(nèi)容總結(jié),包括信息抽取傳統(tǒng)算法和前沿算法詳解、比賽介紹,以及比賽baseline模型代碼分析和改進(jìn)建議。



在前半部分,達(dá)觀數(shù)據(jù)的聯(lián)合創(chuàng)始人高翔詳細(xì)講解了自然語言處理中信息抽取算法技術(shù)。在后半部分,達(dá)觀數(shù)據(jù)的工程師們分享并介紹了“達(dá)觀杯”文本信息抽取挑戰(zhàn)賽的baseline代碼以及改進(jìn)建議。最后,針對(duì)參賽選手和其他觀眾的疑問,三位專家也一一做了解答。


作者介紹:


高翔是達(dá)觀數(shù)據(jù)聯(lián)合創(chuàng)始人,達(dá)觀數(shù)據(jù)前端產(chǎn)品組、文本挖掘組總負(fù)責(zé)人;自然語言處理技術(shù)專家,負(fù)責(zé)文本閱讀類產(chǎn)品、搜索引擎、文本挖掘及大數(shù)據(jù)調(diào)度系統(tǒng)的開發(fā)工作,在自然語言處理和機(jī)器學(xué)習(xí)等技術(shù)方向有著豐富的理論與工程經(jīng)驗(yàn)。?

?

目錄:


第一部分:文本信息抽取詳解

第二部分:“達(dá)觀杯”baseline代碼分享

第三部分:問題答疑


第一部分:文本信息抽取詳解


  • 文本挖掘簡(jiǎn)介


下面我們開始介紹一下文本挖掘。下圖中,我們可以把人工智能分為三類——圖像、文本和語音,達(dá)觀是一家專注于做文本智能處理的科技公司。文本相對(duì)于圖像和語言來說更難處理,因?yàn)槲谋緮?shù)據(jù)需要做一些邏輯分析。圖像和語音屬于感知智能,而文本屬于認(rèn)知智能,所以號(hào)稱是“人工智能的明珠”,難度很大。



自然語言處理的任務(wù)是什么?簡(jiǎn)單來說就是讓機(jī)器知道怎么看、要么寫。我們一般把“看”叫自然語言理解(NLU),包括自動(dòng)化審核、自動(dòng)文本比對(duì)、信息糾錯(cuò),搜索推薦等等,它可以大幅度減輕人工的負(fù)擔(dān)。自動(dòng)寫作叫自然語言生成(NLG),包括自動(dòng)填表、生成摘要,文本潤(rùn)色,還有大家看到的“自動(dòng)生成股市”、“自動(dòng)生成對(duì)聯(lián)”等等。目前我們主要還是在解決自然語言理解的問題。語言生成因?yàn)橐恍┫拗?#xff0c;實(shí)際落地的效果仍然有待提高的。所以我們今天主要討論自然語言理解這部分。



其實(shí)自然語言處理的歷史非常悠久,甚至出現(xiàn)在“AI”這個(gè)概念之前,最早叫“符號(hào)主義”。剛開始的時(shí)候人們選擇了一個(gè)很不好的場(chǎng)景:機(jī)器翻譯。機(jī)器翻譯是一個(gè)難度很大的任務(wù),因?yàn)樯婕傲苏Z義的理解和不同語種語法的規(guī)則。所以早期自然語言處理不是很成功。過了20-30年,到上世紀(jì)80年代開始,我們使用了語法規(guī)則,基于自然語言處理的一些基本原理,再通過人工在這些語法的規(guī)則上進(jìn)行修訂,做了一些問答、翻譯和搜索方面的嘗試。

自然語言處理真正的黃金時(shí)期是從上世紀(jì)90年代開始,那時(shí)候我們搞了統(tǒng)計(jì)學(xué),做了很多基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)的算法。從下圖中我們可以發(fā)現(xiàn),統(tǒng)計(jì)模型的效果讓自然語言處理的應(yīng)用領(lǐng)域更加廣泛,產(chǎn)生了很大進(jìn)步。其實(shí)在上世紀(jì)90年代的時(shí)候,自然語言處理已經(jīng)可以在很多場(chǎng)景表現(xiàn)得很不錯(cuò)了,比之前的技術(shù)要先進(jìn)很多。



從2006年到現(xiàn)在,深度學(xué)習(xí)已經(jīng)開始起步。之前“神經(jīng)網(wǎng)絡(luò)”這個(gè)概念已經(jīng)有了,只是當(dāng)時(shí)受限于各種各樣的算法和硬件,沒法做得很好。但現(xiàn)在各方面都成熟之后,大家發(fā)現(xiàn)深度學(xué)習(xí)是一個(gè)神器。其實(shí)深度學(xué)習(xí)最早的時(shí)候在圖像領(lǐng)域的應(yīng)用較多,但目前自然語言處理也逐漸開始過渡到深度學(xué)習(xí)的階段。尤其是去年像BERT這樣的模型出來之后,我們發(fā)現(xiàn)自然語言處理的評(píng)測(cè)經(jīng)常被屠榜,這說明神經(jīng)網(wǎng)絡(luò)非常有效,但也說明數(shù)據(jù)也很重要,后文中我們會(huì)解釋數(shù)據(jù)的重要性。



我們對(duì)比一下人類和計(jì)算機(jī)之間的差異。其實(shí)我們?nèi)祟惗虝r(shí)間內(nèi)閱讀理解文字的能力還不錯(cuò),但是時(shí)間久了很容易遺忘。但計(jì)算機(jī)基本不會(huì)忘,只要硬盤不壞。人腦難以長(zhǎng)期記憶,但我們對(duì)內(nèi)容的推理能力比計(jì)算機(jī)強(qiáng)。因此,我們可以請(qǐng)計(jì)算機(jī)來做一些比較細(xì)節(jié)的工作。例如文字比對(duì),我們檢查錯(cuò)誤要逐字逐句地看,非常累。計(jì)算機(jī)能做到秒看,卻很難做復(fù)雜的邏輯和推理。


此外,雖然人類閱讀速度很快,但寫作速度很慢。大家高考的時(shí)候都要留幾十分鐘來寫作。這是因?yàn)閷懙臅r(shí)候,我們手速有限。而且在寫的過程中還要進(jìn)行很多思考。寫作本質(zhì)是把腦中的很多語義信息壓縮到一個(gè)點(diǎn),也就是文章的主題。有了主題后我們還要再把作文展開,所以要花很多時(shí)間構(gòu)思大綱、設(shè)計(jì)章節(jié)結(jié)構(gòu)和文章主線,非常耗時(shí)。

我們?cè)诮邮苄畔r(shí)能很快地理解整體,但是難以記住細(xì)節(jié)。我們看完一個(gè)東西立刻能知道它的中心思想。例如,我們?yōu)g覽了一個(gè)企業(yè)的信息之后,就能做出“這個(gè)企業(yè)比較靠譜,愿意投資”的判斷。但是企業(yè)收入、競(jìng)爭(zhēng)利潤(rùn)、負(fù)債這些具體數(shù)字很難全部記清楚。所以人去尋找局部信息的能力和計(jì)算機(jī)比非常慢。計(jì)算機(jī)的優(yōu)點(diǎn)就是找這種局部信息,越細(xì)的東西它找得越快。



什么場(chǎng)景比較適合讓計(jì)算機(jī)去做?基于現(xiàn)階段的技術(shù),現(xiàn)在大部分場(chǎng)景計(jì)算機(jī)還是無法取代人。我們可以看到,很多行業(yè),包括法律,包括企業(yè)合同、客戶意見、產(chǎn)品手冊(cè)、新聞、問答資料的數(shù)據(jù)是需要我們親自來看。雖然這些行業(yè)領(lǐng)域不同,但做的事情都類似。審一個(gè)企業(yè)合同的時(shí)候,需要看一些關(guān)鍵的信息,如甲方、乙方,以及這些東西是否合規(guī),總金額是否正確。在法律行業(yè),法官判案時(shí)也要看整個(gè)案由,包括被告和原告的相關(guān)信息,案件的時(shí)間、地點(diǎn)等等。這些都是信息抽取,在很多應(yīng)用場(chǎng)景下都需要信息抽取。無論我們做了什么決策,判斷是否投資,是否通過合同,如何進(jìn)行法律判決,都需要先從文字中提取信息。

其實(shí)在一些比較固定的,相對(duì)簡(jiǎn)單,不需要特別復(fù)雜的邏輯推理的場(chǎng)景中,機(jī)器學(xué)習(xí)算法已經(jīng)可以完成信息抽取任務(wù)。我們正努力讓計(jì)算機(jī)在這些場(chǎng)景落地,這不僅僅是算法的問題,也是應(yīng)用的問題。這也是我們一直在思考的問題。


  • 抽取算法概述


現(xiàn)在我們具體講講信息抽取的幾種最主流的算法。

什么是信息抽取?其實(shí)就是從文本中找到指定類型的實(shí)體。大家應(yīng)該聽過命名實(shí)體識(shí)別(NER),其實(shí)命名實(shí)體識(shí)別只是抽取中的一種。廣義上的信息抽取,除了命名實(shí)體識(shí)別之外,還包括關(guān)系抽取、事件抽取等。其實(shí)在我看來,關(guān)系抽取和事件抽取比命名實(shí)體識(shí)別的應(yīng)用層次更高級(jí)一點(diǎn)。因?yàn)檫@兩個(gè)抽取同需要做NER,只是在做NER的基礎(chǔ)之上,還要做一些其他的工作,來滿足場(chǎng)景需求。

我們先從最簡(jiǎn)單的NER開始。命名實(shí)體一般是指人物、地點(diǎn)、機(jī)構(gòu)、時(shí)間等內(nèi)容。現(xiàn)在我們以公司抽取為例詳細(xì)說明一下。



如果從歷史的角度來說,識(shí)別公司的任務(wù)就是所謂的“符號(hào)主義”任務(wù),簡(jiǎn)單來說就是窮舉所有公司的名稱做詞典匹配。這樣就是一個(gè)命名實(shí)體。但是,這么做場(chǎng)景其實(shí)有限。為什么?因?yàn)樯鲜泄镜募鲜怯邢薜?#xff0c;所以直接拿公司字典可能比訓(xùn)練模型更快。

但是你會(huì)發(fā)現(xiàn)這種場(chǎng)景并不常見。比如,如果抽取所有公司(不僅限于上市公司)就不能用這種辦法,因?yàn)楣緦?shí)在太多了。十年前如果你看到“餓了么”,如果沒有上下文,你不會(huì)覺得這是一個(gè)公司,但因?yàn)楝F(xiàn)在大家經(jīng)常點(diǎn)“餓了么”,都知道這是一個(gè)公司的名字。而且,每天都有大量新公司產(chǎn)生,所以整體的公司是一個(gè)沒法窮盡的集合。在這種情況下,我們沒辦法用字典很好地完成絕大多數(shù)任務(wù)。



之前我們提到了上下文。那我們現(xiàn)在加入上下文信息,是不是可以知道某個(gè)實(shí)體是一個(gè)公司呢?最直接的方法是通過語法規(guī)則來做,例如“A是一家公司”、“B作為一家公司”等等。你會(huì)看到這樣的一些模板,然后再去分析。如果說得學(xué)術(shù)/技術(shù)一點(diǎn),相當(dāng)于把這個(gè)任務(wù)提煉成一個(gè)比較復(fù)雜的句法依賴和語法規(guī)則。但從代碼角度可能會(huì)比較簡(jiǎn)單,比如把模板中間的東西摳掉,然后去做匹配,做完匹配再去做填空,填空的內(nèi)容就是你要的這些公司。

但這樣做也有很大的問題,因?yàn)槲覀冋Z言表述的方法太多了。例如,“我是A公司的”,“我來自B公司”以及很多種其他不同的表述都是一個(gè)意思,我們無法窮盡所有的表述方法。甚至周星弛的電影也能增加這種做法的難度。我們以前說“我先走了”,現(xiàn)在會(huì)說“我走了先”、“我吃了先”,這其實(shí)跟我們傳統(tǒng)的語法都不太一樣,但現(xiàn)實(shí)生活中就有這么多表述。不過,和上面的字典類似,在特定的場(chǎng)合,比如一些特定領(lǐng)域的公文等文書文章,還是有套路或者標(biāo)準(zhǔn)寫法,也許可以用這種方法。總的來說這種方法比較簡(jiǎn)單。



更高級(jí)的是基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)的方法,從算法上來說是用序列標(biāo)注的方式來做。這種方法要求我們標(biāo)注數(shù)據(jù),例如上圖中我們標(biāo)注了一句話:“達(dá)觀數(shù)據(jù)是人工智能公司”。現(xiàn)在它會(huì)預(yù)測(cè)“上海的虛擬數(shù)據(jù)”中的“虛擬數(shù)據(jù)”也是一家公司。它是怎么做到的?后文會(huì)詳細(xì)介紹。這種做法就跟模板匹配完全不一樣了。在圖中,可能第一個(gè)預(yù)測(cè)“虛擬數(shù)據(jù)是人工智能公司”還有模板的性質(zhì),但后面兩個(gè)表述和前面完全不同,所以這種基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)的方式有了一定的預(yù)測(cè)能力。

但問題是什么?它需要兩個(gè)條件。首先是數(shù)據(jù)。大部分的機(jī)器學(xué)習(xí)都是監(jiān)督學(xué)習(xí),要做數(shù)據(jù)標(biāo)注。而且我們傳統(tǒng)機(jī)器學(xué)習(xí)經(jīng)常要做特征工程。甚至在很多任務(wù)中,一個(gè)特征工程可能要占到我們項(xiàng)目時(shí)間和精力的90%。我們之前參加CIKM評(píng)測(cè)并拿到冠軍的任務(wù)中,就耗費(fèi)了大量時(shí)間構(gòu)建特征。舉個(gè)例子,我們實(shí)際工作中完成文本分類任務(wù)的時(shí)候,僅僅把文字的長(zhǎng)度這個(gè)特征加進(jìn)去,效果一下子提升了很多。這種特征我們很難想到。特征的選擇可能有時(shí)候還有一定的邏輯推理,但有的時(shí)候就是拍腦袋。所以特征工程做好是很難的,需要很多的經(jīng)驗(yàn),還需要有擴(kuò)散性的思維。

此外訓(xùn)練和預(yù)測(cè)需要很多計(jì)算資源。某些機(jī)器學(xué)習(xí)(尤其是傳統(tǒng)的機(jī)器學(xué)習(xí))的訓(xùn)練過程中,特征有時(shí)候會(huì)特別耗費(fèi)內(nèi)存,可能不一定訓(xùn)練得完,所以對(duì)機(jī)器有一定的限制。當(dāng)然,現(xiàn)在做深度學(xué)習(xí),限制可能是GPU。深度學(xué)習(xí)相對(duì)于傳統(tǒng)機(jī)器學(xué)習(xí),對(duì)數(shù)據(jù)量地要求更高。因?yàn)閭鹘y(tǒng)的機(jī)器學(xué)習(xí)模型的各種參數(shù)沒有深度學(xué)習(xí)這么多。



雖然深度學(xué)習(xí)的可解釋性經(jīng)常被人詬病,但也有些模型實(shí)際上可以給我們一些解釋。尤其是一些基于Attention機(jī)制的模型。這里就是一個(gè)Attention分類器。圖中可以看到它能從句子級(jí)別和詞級(jí)別告訴你,對(duì)一個(gè)分類模型來說,哪句話最重要,哪個(gè)詞最重要。這些詞和句子都是有權(quán)重的。因?yàn)橛蠥ttention這樣的權(quán)重,我們就能把它拿出來做可視化。



所以整體來說還是要通過序列標(biāo)注來做。上圖有一個(gè)序列標(biāo)注的例子:分詞。要分詞的句子是“它來自達(dá)觀數(shù)據(jù)”。我們有一個(gè)叫Label Set,也就是標(biāo)簽集。圖中我們用的是BMES這個(gè)很經(jīng)典的標(biāo)簽集,這個(gè)標(biāo)簽集其實(shí)對(duì)應(yīng)的英文Begin、Middle、End、Single,大家一看就知道是什么意思。對(duì)于分詞來說,每個(gè)字可能組成一個(gè)詞(單字成詞),也可能是一個(gè)詞的開始、的中間或結(jié)尾。

上圖還可以看到,在分詞之外,命名實(shí)體我們用另外一個(gè)標(biāo)簽集。我們做詞性分析可能用不同的標(biāo)簽集。可以看到,不同的標(biāo)簽集可以用來做不同的事情。所以無論是傳統(tǒng)的機(jī)器學(xué)習(xí),還是深度學(xué)習(xí),我們都是在解決一個(gè)叫做“序列標(biāo)注”的問題。所以標(biāo)簽集和標(biāo)注方式都是基礎(chǔ)的、幾乎是一樣的。有什么樣不同?后文會(huì)具體討論。


  • 傳統(tǒng)抽取算法介紹


其實(shí)傳統(tǒng)抽取算法有很多,這里會(huì)介紹一些大家比較常用,也比較好理解的模型。第一個(gè)模型叫生成式模型。生成式模型的一個(gè)代表就是隱馬爾科夫模型(HMM)。另外一個(gè)是判別式模型,代表是條件隨機(jī)場(chǎng)(CRF)。這兩個(gè)模型都結(jié)合了概率論還有圖論的一些內(nèi)容,也都基于統(tǒng)計(jì)機(jī)器學(xué)習(xí)的算法。它們都能根據(jù)訓(xùn)練集訓(xùn)練出不同的結(jié)果。下面我們?cè)敿?xì)介紹一下這兩個(gè)模型。

我人生第一次做序列標(biāo)注任務(wù)的時(shí)候,用的就是HMM模型。馬爾可夫這個(gè)名字一聽就像是個(gè)數(shù)學(xué)很厲害的俄國(guó)人,但其實(shí)HMM模型并不難。大家只要記住兩部分內(nèi)容:兩個(gè)序列、三個(gè)矩陣。如下圖所示。我們要做的就就是把這五個(gè)部分定義好,整個(gè)模型和要解決的問題就定義清楚了。



首先是觀察序列。上圖中“他來自達(dá)觀數(shù)據(jù)”,就是我們?nèi)丝吹玫降挠^察序列,但它背后隱藏了分詞。“他”是一個(gè)詞,“來自”是一個(gè)詞,“達(dá)觀數(shù)據(jù)”是一個(gè)詞,這個(gè)是我們說“隱藏序列”,沒有寫到明面上,但需要我們模型預(yù)測(cè)。怎么預(yù)測(cè)?下圖畫了預(yù)測(cè)模型的示意圖。圖中,X_1、X_2、X_3就是我們說的隱藏內(nèi)容,人能看到的是y_1、y_2、y_3、y_4,也就是觀察序列。但其實(shí)不同狀態(tài)是可以不停地轉(zhuǎn)換的。比如X_1到X_2之間有一條連線說明X_1和X_2之間可以通過概率a_12做轉(zhuǎn)換;X_2到X_3之間通過概率a_23做轉(zhuǎn)換。所以這個(gè)模型其實(shí)比鏈?zhǔn)降腍MM還要更復(fù)雜一點(diǎn),因?yàn)樗蠿_2到X_1這樣的轉(zhuǎn)換。所有的X都可以轉(zhuǎn)換到y(tǒng)_1、y_2、y_3、y_4這樣的觀察序列,每對(duì)轉(zhuǎn)換關(guān)系都有對(duì)應(yīng)的概率。



這樣我們就把模型定義好了。我們只需要求模型的哪幾個(gè)部分呢?主要是這三個(gè)矩陣:初始狀態(tài)矩陣,發(fā)射狀態(tài)矩陣,以及狀態(tài)轉(zhuǎn)移矩陣。

第一個(gè)是初始狀態(tài)矩陣。我們現(xiàn)在舉的例子都是有序列標(biāo)注,例如多輪分詞。下圖是一個(gè)真實(shí)的多輪分詞模型里面的圖,這是我們自己訓(xùn)練的一個(gè)模型。可以看到,初始狀態(tài)只可能是S(ingle)或B(egin),因?yàn)椴豢赡軓拇碓~結(jié)尾的標(biāo)記開始一個(gè)句子。所以我們要從所有的語料中統(tǒng)計(jì),單字詞S和多字詞B開始的概率是多少。僅僅統(tǒng)計(jì)這兩個(gè)矩陣就可以,因?yàn)槠渌麅蓚€(gè)標(biāo)記M(iddle)和E(en)是不可能出現(xiàn)在句首的。圖中的概率有負(fù)數(shù),是因?yàn)榻?jīng)過log和相關(guān)處理,從而可以方便后續(xù)的計(jì)算,但本質(zhì)的含義還是概率。



第二個(gè)矩陣是發(fā)射狀態(tài)矩陣。什么是發(fā)射狀態(tài)矩陣?簡(jiǎn)單來說就是我們?cè)诜衷~里每個(gè)字變成任何一個(gè)標(biāo)簽的概率(如下圖所示)。例如“他”這個(gè)字如果來自“他來自達(dá)觀數(shù)據(jù)”這句話,就是一個(gè)單字詞S(ingle);但如果在“他”出現(xiàn)在“他們”等多字詞里,標(biāo)簽就是B(egin);在“關(guān)心你我他”里,“他”的標(biāo)簽可能就是E(end)。所以你會(huì)在訓(xùn)練語料看到“他”有不同的標(biāo)簽。發(fā)射狀態(tài)矩陣就是把“他”到每一個(gè)標(biāo)簽的概率集合起來。發(fā)射狀態(tài)矩陣非常重要,它說明了每一個(gè)字到不同標(biāo)簽的概率。



第三個(gè)是狀態(tài)轉(zhuǎn)移矩陣。什么是狀態(tài)轉(zhuǎn)移矩陣?其實(shí)狀態(tài)轉(zhuǎn)移矩陣也是統(tǒng)計(jì)出來的,也就是剛才說的X_1和X_2之間的概率。我們訓(xùn)練語料里面已經(jīng)有了SB、BMME這樣的標(biāo)簽。其實(shí)我們可以觀察到一些現(xiàn)象,例如S(ingle)后面不可能跟E(nd)和M(iddle)。這些就是狀態(tài)轉(zhuǎn)移矩陣描述的內(nèi)容,如下圖所示。它說明E后面跟著S的概率是多少,E后面跟著B的概率又是多少等等。這些值其實(shí)都是從語料庫(kù)中訓(xùn)練出來的。



下面討論兩類學(xué)習(xí)算法:一種是“監(jiān)督學(xué)習(xí)”,通過極大似然估計(jì)就可以得到這些值,非常好算,簡(jiǎn)單地說就是統(tǒng)計(jì)次數(shù):統(tǒng)計(jì)這個(gè)標(biāo)簽一共有多少,相關(guān)概率又是多少,就可以得出結(jié)果了。還有是一個(gè)非監(jiān)督學(xué)習(xí)Baum-Welch,這個(gè)算法我們用得比較少,因?yàn)楦鶕?jù)我們自己的經(jīng)驗(yàn),它的整體效果會(huì)比做統(tǒng)計(jì)差很多。而且監(jiān)督學(xué)習(xí)有個(gè)好處是因?yàn)橛辛擞?xùn)練集和相關(guān)的數(shù)據(jù),所以很容易去查錯(cuò)。

解碼算法基本是用Viterbi來做。當(dāng)然你也可以把當(dāng)前最好的狀態(tài)輸出來,找到在當(dāng)前序列下能夠輸出的最大標(biāo)簽,通過自己的一些解碼邏輯(比如B后面一定是M或者E,不可能是S)優(yōu)化一些內(nèi)容。但我們經(jīng)常還是用Viterbi去做整體的解碼,取得最優(yōu)路徑的概率。Viterbi解碼算法大家一定要掌握,因?yàn)楹竺嬗杏胁簧偎惴ㄅc它類似。只要把Viterbi學(xué)會(huì)了,后面的很多東西就很好理解了。

HMM是我個(gè)人學(xué)的第一個(gè)模型,但是我現(xiàn)在基本上不用這個(gè)模型。為什么不用?因?yàn)樗男Ч€是相對(duì)差一點(diǎn)。但它也有優(yōu)點(diǎn)。因?yàn)樽鰳O大似然估計(jì)就是簡(jiǎn)單的統(tǒng)計(jì),速度非常快。所以這個(gè)模型的更新可以做到秒級(jí)。你做一個(gè)數(shù)據(jù)的修改,跑一遍立刻把數(shù)據(jù)統(tǒng)計(jì)出來,修改矩陣以后很快就對(duì)這個(gè)模型做一個(gè)更新。所以在項(xiàng)目的初始階段,我們可以快速地用這個(gè)方法來做baseline或者動(dòng)態(tài)的修改。尤其在實(shí)際業(yè)務(wù)中,可能客戶做了一些修改后他需要實(shí)時(shí)知道反饋,這時(shí)候可以用HMM,雖然可能不能保證有好的效果。



在實(shí)際應(yīng)用中我們用的最多還是條件隨機(jī)場(chǎng)(CRF)。因?yàn)镃RF往往效果更好。下圖說明了HMM和CRF的關(guān)系是什么,我們可以看到一個(gè)HMM是鏈?zhǔn)絺鬟f,但加上一個(gè)條件就是我們最常見的鏈?zhǔn)綏l件隨機(jī)場(chǎng)。通用CRF就是下圖中右下角的圖,但是我們做序列標(biāo)注的話可能是最下面一行中間的這個(gè)圖,也就是鏈?zhǔn)降腃RF。它跟上面一行的圖的區(qū)別是什么?大家可以看到下面一行圖中有好多小的黑色正方形,這就是我們說的條件。我們是如何得出條件的?下面我們就來介紹一下如何通過真實(shí)訓(xùn)練得到條件。



我們先看下面這張圖。圖中nz在詞性里表示是一個(gè)“其他”類型的實(shí)體。這種類型很難歸入時(shí)間、地點(diǎn)、人物等常見的實(shí)體類型,比如“蘋果手機(jī)”可能就可以算是一個(gè)nz。我們把所有不太好分類的實(shí)體都?xì)w入到nz里。在這里,標(biāo)簽集還是BMES,但是加了一個(gè)“O”。標(biāo)簽后面的后綴其實(shí)就是類型。剛才提到的“其他”是nz,還可以有其他類型(如地名、時(shí)間、機(jī)構(gòu)等)可以用其他字符串表示,比如nr、ns、nt。定義好這套標(biāo)簽集后,我們就開始定義特征函數(shù)。



下圖是我們是用CRF++、CRFPP做的特征模板。大家可以看到,圖里有U00到U08,最后還有一個(gè)字母“B”,B說明它會(huì)學(xué)習(xí)標(biāo)簽間的轉(zhuǎn)移。U00到U08都是特征,U00表示第一個(gè)特征,U01是第二個(gè)特征。此外還有一個(gè)x%,它代表了前面特征的內(nèi)容。

首先看第一個(gè)特征:U00: %X[-3,0]。U00表示把我們要研究的字左邊的第三個(gè)字作為特征,向量后一個(gè)數(shù)0表示我們沒有添加人工特征。我們把這些拼接起來就是一個(gè)最終的特征。



下圖中包括了特征函數(shù)的權(quán)重(weight)。我們可以看到“U06:徑”,這表示當(dāng)前的字右邊第三個(gè)字是一個(gè)“徑”字。我們會(huì)給出每個(gè)標(biāo)簽的得分。可選的標(biāo)簽就是BEMOS。這里的數(shù)字代表得分(不是概率),有正有負(fù)。我們最終就是要把訓(xùn)練集所有的數(shù)據(jù)先通過這個(gè)特征模板變成一個(gè)特征。對(duì)于每個(gè)字,都有8個(gè)特征,第一個(gè)特征就是當(dāng)前字左邊的第三個(gè)字,第二個(gè)特征是左邊第二個(gè)字,U03就是當(dāng)前字本身。



所以大家可以看到CRF和HMM最大的不同。我們定義了這樣一個(gè)特征函數(shù)(或者特征模板)。我們還可以人工設(shè)置一些特征影響特征模板。比如在研究當(dāng)前字時(shí),如果用了這樣的模板,我就知道前三個(gè)字和后三個(gè)字會(huì)對(duì)當(dāng)前這個(gè)字的標(biāo)簽的輸出產(chǎn)生影響。除此之外,還可以用前一個(gè)字和當(dāng)前字,或者當(dāng)前字和后一個(gè)字的組合作為特征。有了這些特征,我們就要計(jì)算特征的結(jié)果。這時(shí)可以迭代訓(xùn)練模型,CRF使用了L-BFGS來訓(xùn)練。最終訓(xùn)練出來的模型可以告訴我們每個(gè)特征值對(duì)于不同的標(biāo)簽的值是多少,相當(dāng)于是一個(gè)全局最優(yōu)的值。

下面這張圖代表了標(biāo)簽之間的轉(zhuǎn)移,這跟HMM非常像,也可以算出來。所以CRF最終在一個(gè)全局最優(yōu)的情況下達(dá)到了一個(gè)最優(yōu)點(diǎn)。我們可以存儲(chǔ)這個(gè)最優(yōu)點(diǎn)情況下每一個(gè)特征的值,用來解碼。



CRF的解碼較為簡(jiǎn)單,我們根據(jù)當(dāng)前序列的位置,根據(jù)特征的模板生成很多特征函數(shù),直接去查我們的模型,找到其對(duì)應(yīng)的特征函數(shù)權(quán)重,之后每一個(gè)特征函數(shù)權(quán)重加起來。查到這個(gè)特征函數(shù)就把相應(yīng)的權(quán)重取出來,加起來,沒有查到就是0,就不用去做了,最終有一個(gè)得分,這樣每一個(gè)標(biāo)簽都會(huì)有相關(guān)的得分。這個(gè)字生成的Score會(huì)有BEMOS相對(duì)應(yīng)的,最終得到一個(gè)圖,我們就用Viterbi解碼,跟前面一樣就能解出來了。


為什么CRF效果好?因?yàn)槲覀兛梢远x特征模板,包括了很多上下文比較遠(yuǎn)的特征。CRF的特征是人工選擇的,可以選擇前兩個(gè)、前三個(gè),甚至更多,所以可以讓模型學(xué)到更多上下文,而且是遠(yuǎn)距離的上下文,輔助我們判斷,提升整體效果。但條件隨機(jī)場(chǎng)需要迭代優(yōu)化,根據(jù)梯度下降的方向去找最優(yōu)點(diǎn),所以整體速度相對(duì)較慢,算出來的模型也不會(huì)小。很多時(shí)候必須要篩選或裁剪標(biāo)簽。

以上內(nèi)容就是HMM和CRF這兩個(gè)傳統(tǒng)的算法。


  • 基于深度學(xué)習(xí)的抽取算法


經(jīng)典機(jī)器學(xué)習(xí)的很多算法需要比較強(qiáng)的數(shù)學(xué)功底,通過數(shù)學(xué)公式做出優(yōu)美完整的論證。但現(xiàn)在經(jīng)典機(jī)器學(xué)習(xí)算法的收益已經(jīng)沒有以前大了。原因如下圖所示,圖中列出了文本挖掘領(lǐng)域中,經(jīng)典的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的對(duì)比。



最大的區(qū)別就是紫色的框:特征工程。其實(shí)算法并不多,但特征工程五花八門,包括我們做文本處理時(shí)經(jīng)常遇到的TF-IDF、互信息、信息增益、期望交叉熵等等。其實(shí)這些提取特征的方式都有一些科學(xué)依據(jù),但很多場(chǎng)景下我們需要靠直覺。特征工程往往占到項(xiàng)目時(shí)間的90%。

而深度學(xué)習(xí)不在乎特征。模型定好之后只管輸入,有了輸入就能輸出一個(gè)最好的結(jié)果。基本不用改代碼的,只需要調(diào)參。如果數(shù)據(jù)小,還需要修改一下過擬合方面的東西就可以了。但是用經(jīng)典機(jī)器學(xué)習(xí)做特征工程可能要改很多代碼才能做出一個(gè)非常好的特征,這就是傳統(tǒng)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)最大的區(qū)別。

用深度學(xué)習(xí)做文本處理基本繞不開LSTM。雖然現(xiàn)在有很多模型,但也采用LSTM做baseline。下面是一篇著名的介紹LSTM的文章的截圖,建議大家看一下原文。文章中最精華的就是下面四張圖,展示了LSTM的工作原理。

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


第一步:單元狀態(tài)丟棄

第二步新信息的選擇。當(dāng)前輸入包括上一時(shí)刻隱層的輸出和當(dāng)前的輸入。這一步驟判斷應(yīng)該留下來多少內(nèi)容。它還是計(jì)算兩個(gè)系數(shù),一個(gè)i_t,這也是一個(gè)0-1之間的值。第二個(gè)是C_t,表示當(dāng)前cell的狀態(tài)。計(jì)算完畢后需要把這兩個(gè)系數(shù)的值保存下來。


第二步:新信息選擇

第三步是更新狀態(tài)。上面一步已經(jīng)決定可以留下的新內(nèi)容和老內(nèi)容。這一步要決定如何組合新老內(nèi)容。老內(nèi)容可以乘以第一步計(jì)算出的f_t,新內(nèi)容可以乘以第二步算出來的i_t,然后把新老內(nèi)容相加,就是最新的狀態(tài)了。


第三步:單元狀態(tài)更新

第四步是得出最后的輸出值。Cell不會(huì)一股腦輸出,而是計(jì)算出了系數(shù)o_t和狀態(tài)相關(guān)的函數(shù)結(jié)果相乘后得出輸出。


第四步:確定輸出

以上四步定義了LSTM基本的原理。LSTM其實(shí)提出來已經(jīng)很多年了,在很多場(chǎng)景下都經(jīng)受了考驗(yàn)。所以希望大家一定要把上面介紹的基礎(chǔ)原理了解好。

下圖顯示了基于深度學(xué)習(xí)的信息抽取技術(shù)Bi-LSTM+CRF的原理。這個(gè)方法代表了深度學(xué)習(xí)和傳統(tǒng)的機(jī)器學(xué)習(xí)一個(gè)很好的結(jié)合。傳統(tǒng)CRF最大的問題是特征很稀疏,想做一個(gè)很好的特征要花費(fèi)很多時(shí)間。我們可能會(huì)有幾套比較經(jīng)典的特征,但不一定保證效果最好,特別是訓(xùn)練數(shù)據(jù)發(fā)生變化以后。而詞向量和Bi-LSTM可以做很多的特征提取工作。



為什么要用Bi-LSTM而不是簡(jiǎn)單的LSTM?舉個(gè)例子,“華為發(fā)布了新一代的麒麟處理X”這句話中,“X”一看就是處理器的“器”。因?yàn)槲覀兌贾狼拔摹镑梓胩幚怼焙竺婵隙ǜ捌鳌薄n愃频?#xff0c;根據(jù)“X鮮和美國(guó)簽訂了新一輪的諒解備忘錄”很容易猜出X是“朝鮮”的“鮮”,這是根據(jù)后文做出的判斷。天然的語言中存在前后文的信號(hào),都會(huì)影響當(dāng)前字的選擇。Bi-LSTM可以兼顧前后文的影響,所以是從理論上來說是個(gè)很符合人類直覺的工具。

如果不用CRF,可能整體效果還不錯(cuò),但會(huì)出現(xiàn)很多badcase。比如B后面出現(xiàn)S,S后面出現(xiàn)O。因?yàn)樗惴ㄖ豢紤]當(dāng)前的最優(yōu)輸出,沒有考慮整個(gè)序列的最優(yōu)結(jié)果。而CRF是一個(gè)考慮全局的算法,也考慮到標(biāo)簽間的轉(zhuǎn)移概率。所以用CRF會(huì)得到一個(gè)比較可控的結(jié)果。

總得來說,上圖介紹的Bi-LSTM+CRF方法,結(jié)合了CRF和Bi-LSTM,把“小明去達(dá)觀數(shù)據(jù)開會(huì)”這幾個(gè)字變成向量,通過中間的Bi-LSTM隱層,提取出來高維的特征,輸入CRF層,CRF最后就會(huì)給出標(biāo)簽和結(jié)果。

下面我們會(huì)介紹這篇文章最重要的部分:預(yù)訓(xùn)練模型。深度學(xué)習(xí)除了不用做大量的特征工程,還可以對(duì)文本做非常好的表示。這里的例子是用Word2Vec做出詞向量,然后用TensorBoard可視化,如下圖所示。



在圖中“威海”、“濰坊”、“棗莊”這三個(gè)山東的城市的詞匯,被轉(zhuǎn)化成了三個(gè)低維向量,向量中的數(shù)都是浮點(diǎn)數(shù),有正數(shù)也有負(fù)數(shù)。如果從空間的角度來看這三個(gè)向量,可以發(fā)現(xiàn)它們距離很近,說明從語義角度來看它們的含義很接近。而且我們還可以直接對(duì)這些詞向量進(jìn)行計(jì)算,例如山東-威海=廣東-佛山,皇帝-皇后+女人=男人,所以詞向量是很優(yōu)秀的自然語言的表征方式。

上圖用的是Word2Vec模型。下圖還有一些其他的模型,比如Glove。這兩個(gè)模型都是靜態(tài)表示。靜態(tài)表示有天然的缺陷,例如它們很難區(qū)分“蘋果好吃”和“蘋果手機(jī)”中的兩個(gè)“蘋果”。就好像我們學(xué)技術(shù)的時(shí)候什么都想學(xué),但因?yàn)闀r(shí)間是有限,所以每種技術(shù)學(xué)得都不夠深入。



所以從2018年開始,出現(xiàn)了很多新的預(yù)訓(xùn)練模型,不少模型都用《芝麻街》里怪物的名字命名,比如ELMO、BERT和ERNIE。除此之外還有微軟的MASS,Google最新的XLNet等等。這些模型本質(zhì)上都用深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)做表示,雖然有的用Attention,有的用Transform,但本質(zhì)差別不大。

這些模型和Word2Vec/Glove最大的區(qū)別在于它們是動(dòng)態(tài)模型。下圖是一個(gè)真實(shí)的例子。輸入“蘋果好吃”和“蘋果手機(jī)”后,用BERT對(duì)每個(gè)字建模,發(fā)現(xiàn)前兩個(gè)字的向量很不一樣。這說明BERT可以根據(jù)不同的上下文語境編碼每個(gè)字,或者說可以根據(jù)上下文語境對(duì)同一個(gè)字做出不同的表示。


BERT可以根據(jù)上下文,對(duì)同一個(gè)字做出不同的表示

如何選擇預(yù)訓(xùn)練模型呢?我建議大家可以都嘗試一下。大部分同學(xué)都可以訓(xùn)練ELMO,它的結(jié)構(gòu)和LSTM很像,我們可以自己訓(xùn)練一個(gè)語言模型。BERT訓(xùn)練的成本就要高很多,但現(xiàn)在已經(jīng)有一些其他的框架或語言做處理。我們自己用中文維基百科訓(xùn)練BERT只用了幾天,也沒有用很多顯卡,當(dāng)然我們也做了不少優(yōu)化工作。可以先試著用Word2Vec看看效果,有可能效果已經(jīng)很不錯(cuò)。關(guān)鍵在于要找到在能力范圍內(nèi)按時(shí)訓(xùn)練完的模型。


  • 抽取算法在達(dá)觀的具體實(shí)踐


下面我們分享一下在達(dá)觀的實(shí)踐中完成抽取任務(wù)的一些經(jīng)驗(yàn)和教訓(xùn)。

首先我們要注重場(chǎng)景。應(yīng)用場(chǎng)景一般就是客戶提供的文檔,包括財(cái)務(wù)報(bào)表、基金合同等等。文檔處理的核心是自然語言處理,特別是抽取技術(shù)。我們也需要考慮實(shí)際應(yīng)用,結(jié)合一些其他的工程技術(shù),比如外部系統(tǒng)、分布式技術(shù)、數(shù)據(jù)庫(kù)技術(shù)等等。



第二是要解決數(shù)據(jù)不足的問題。尤其是序列標(biāo)注比文本分類需要更多的標(biāo)注成本,所以很可能數(shù)據(jù)量不夠。雖然目前有一些通用的數(shù)據(jù)(比如《人民日?qǐng)?bào)》的數(shù)據(jù)),但針對(duì)具體的業(yè)務(wù)場(chǎng)景可能沒有足夠多的語料和標(biāo)注數(shù)據(jù)。這時(shí)候我們就要做數(shù)據(jù)增強(qiáng)。數(shù)據(jù)增強(qiáng)是一種通用的方法,可以應(yīng)用于傳統(tǒng)的機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中。



在上圖中,我們可以看到標(biāo)注數(shù)據(jù)只有三句話,黃色表示要做機(jī)構(gòu)識(shí)別。怎么增加標(biāo)注數(shù)據(jù)的量?我們可以直接暴力地把它們兩兩隨機(jī)組合。初聽起來可能會(huì)覺得有點(diǎn)不可理喻,但確實(shí)有效果。上圖中右邊的三段話中,前兩段是兩兩隨機(jī)組合,最后一段是把三句話全部混合到一起。把這些新生成的數(shù)據(jù)加入原數(shù)據(jù)起去做模型,就會(huì)發(fā)現(xiàn)效果的確好了很多。數(shù)據(jù)增強(qiáng)為什么有效?從模型的角度簡(jiǎn)單地說,這樣可以看到更多上下文,特別是可以跨句子看到上下文,所以會(huì)有幫助。基本上寫5-10行代碼就能產(chǎn)生一些收益。

還有一種方法是非監(jiān)督的Embeddin的學(xué)習(xí)。下圖是我們的一個(gè)真實(shí)的例子。當(dāng)時(shí)登貝萊剛轉(zhuǎn)會(huì)到巴塞羅那俱樂部。我們用標(biāo)準(zhǔn)語料去訓(xùn)練,發(fā)現(xiàn)“登貝萊”這個(gè)名字一定會(huì)被切開,無論怎么訓(xùn)練分詞都不行。潛在的解決方法之一是增加很多登貝萊相關(guān)的標(biāo)注數(shù)據(jù),但是這么做收益不足。所以我們就找了很多外部的語料做嵌入。?



如上圖所示,我們?cè)诰W(wǎng)上找了一些登貝萊的新聞補(bǔ)充到《人民日?qǐng)?bào)》等語料里一起訓(xùn)練。在完全沒有修改,只是重新訓(xùn)練了預(yù)訓(xùn)練模型的情況下,“登貝萊”就成了一個(gè)詞。這說明深度學(xué)習(xí)的預(yù)訓(xùn)練模型,可以非常好地捕捉到上下文,而且我們知道大部分的神經(jīng)網(wǎng)絡(luò)的語言模型訓(xùn)練是非監(jiān)督學(xué)習(xí),所以不需要很多標(biāo)注數(shù)據(jù)。可以有很大數(shù)據(jù)量。總體來說數(shù)據(jù)越多,模型會(huì)學(xué)得越準(zhǔn),效果越好。BERT訓(xùn)練了一兩千萬的中文后,可以達(dá)到非常好的效果,我覺得這是個(gè)大力出奇跡的模型。

除了NER,還可以抽取別的內(nèi)容。例如知識(shí)圖譜就要做關(guān)系抽取。輸入一句話,“美國(guó)總統(tǒng)特朗普將考察蘋果公司,該公司由喬布斯創(chuàng)立”,怎么抽取關(guān)系?有兩種方法。一種方式是把實(shí)體抽出來,然后兩兩實(shí)體做一些分類,分到一些關(guān)系里面。另一種依靠序列標(biāo)注,也就是基于聯(lián)合標(biāo)注的方法。這么做的好處是不用修改標(biāo)注框架。



我們總結(jié)一下本文內(nèi)容。在實(shí)際工作中,到底怎么來用深度學(xué)習(xí)挖掘文本?最重要的一點(diǎn)是要用預(yù)訓(xùn)練模型,通過非監(jiān)督數(shù)據(jù)訓(xùn)練向量,提升泛化能力。雖然中間步驟難以分解,但因?yàn)樯疃葘W(xué)習(xí)有端到端的能力,所以對(duì)中間步驟要求較低。而且,深度學(xué)習(xí)能克服一些傳統(tǒng)模型的缺點(diǎn),例如LSTM的上下文依賴就比CRF強(qiáng)。



但是深度學(xué)習(xí)也有一些缺點(diǎn),它在小數(shù)據(jù)集上的效果難以保證,很可能會(huì)過擬合或者難以收斂。例如大家看到TensorBoard經(jīng)常在抖,就是有這樣的問題。而且大家現(xiàn)在把深度學(xué)習(xí)調(diào)參的工作叫煉丹室,你也不知道好壞就在反復(fù)調(diào)。有時(shí)候調(diào)參的工作量不亞于特征工程,特征工程至少知道在做什么,而想分析調(diào)參結(jié)果更加困難。另外深度學(xué)習(xí)對(duì)計(jì)算資源的要求更高。

所以我們最終的思考是:第一要盡可能地收集數(shù)據(jù)、理解數(shù)據(jù),這是所有做機(jī)器學(xué)習(xí)的同學(xué)第一步就應(yīng)該做的事情。我們應(yīng)該去分析數(shù)據(jù)、看數(shù)據(jù),而不是一開始就上模型。如果不做數(shù)據(jù)清洗,好數(shù)據(jù)、亂數(shù)據(jù)、臟數(shù)據(jù)都在里面,模型是做不好的。就像教孩子一樣,如果好的壞的都教,他就不知道什么是好壞了。而且我們要分析問題的本質(zhì),選擇合適的模型。例如,對(duì)于已有數(shù)據(jù)的數(shù)據(jù)量,選先進(jìn)模型有用嗎?如果沒有用,就要趕緊去收集數(shù)據(jù)。

而且在任務(wù)一開始的階段,我比較推薦大家做傳統(tǒng)的機(jī)器學(xué)習(xí),因?yàn)檫@些模型比較現(xiàn)成,也比較通用。在做了一個(gè)非常好的baseline之后,你就知道底線在哪,然后再引用深度學(xué)習(xí)。去年的達(dá)觀杯我們就發(fā)現(xiàn)很多參賽者一上來就在用深度學(xué)習(xí),結(jié)果做了各種調(diào)參,效果還不如我們自己20行代碼的傳統(tǒng)的機(jī)器學(xué)習(xí)。所以剛開始的時(shí)候一定要讓傳統(tǒng)機(jī)器學(xué)習(xí)幫助你,這樣你更有信心做后面的事情。另外,這句話一定要送給大家:“數(shù)據(jù)決定效果上限,模型逼近此上限”,所以大家一定要重視數(shù)據(jù)清理,數(shù)據(jù)的分析真的比調(diào)參調(diào)模型收益更大。

如果遇到疑難雜癥,端到端技術(shù)經(jīng)常會(huì)有驚喜,但不能保證每次都有驚喜。大家在學(xué)習(xí)的過程中一定要關(guān)心最前沿的技術(shù)。

做機(jī)器學(xué)習(xí)肯定會(huì)遇到失敗和挫折,重要的是從挫折中總結(jié)規(guī)律才是最重要的,不要被同一個(gè)坑絆。這樣的經(jīng)驗(yàn)很難依靠別人教會(huì),因?yàn)樗幍沫h(huán)境、場(chǎng)景、場(chǎng)合、數(shù)據(jù)不可能完全一致,所以需要有自己的思考。

最后,看完了這篇文章能做什么呢?可以參加我們的“達(dá)觀杯”文本智能信息抽取挑戰(zhàn)賽。這是我們第三次組織“達(dá)觀杯”比賽。比賽的一等獎(jiǎng)有30000元獎(jiǎng)金,二等獎(jiǎng)2支隊(duì)伍有10000元的獎(jiǎng)金,三等獎(jiǎng)有5000元的獎(jiǎng)金,優(yōu)勝獎(jiǎng)還有3000元。除此之外,TOP30同學(xué)直接直通面試。



大家學(xué)習(xí)完以上基礎(chǔ)可以用我們介紹的內(nèi)容做一些實(shí)踐。比賽的數(shù)據(jù)很有意思,文字經(jīng)過了加密,每個(gè)字都做了一個(gè)隨機(jī)的映射。這么做的好處是可以更多地關(guān)注算法的本身,而不用去想如何補(bǔ)充數(shù)據(jù)。雖然補(bǔ)充數(shù)據(jù)在實(shí)際工作中很重要,但我們的比賽主要還是考察算法。

比賽數(shù)據(jù)有兩部分,一部分是有標(biāo)注的數(shù)據(jù),另外一部分是一個(gè)規(guī)模達(dá)到上百萬的非標(biāo)注的數(shù)據(jù)。比賽的關(guān)鍵就是如何利用這些非標(biāo)注的數(shù)據(jù)來提升整個(gè)模型的效果。而這就是我們最終在實(shí)際生活和工作中遇到的問題:只有少量標(biāo)注數(shù)據(jù),但是有大量的未標(biāo)注數(shù)據(jù)。歡迎大家在比賽中實(shí)際運(yùn)用一些算法和理論。因?yàn)橛袝r(shí)候光看別人的分享難以獲得深刻的理解,但是經(jīng)過“達(dá)觀杯”這樣的比賽就能把知識(shí)掌握地更好。



截至目前,“達(dá)觀杯”文本信息智能抽取挑戰(zhàn)賽已吸引來自中、美、英、法、德等26個(gè)國(guó)家和地區(qū)的2400余名選手參賽,并將在8月15日進(jìn)行第三場(chǎng)技術(shù)分享直播。


比賽頁(yè)面:

Introductionbiendata.com


訪問上方鏈接進(jìn)入比賽頁(yè)面,也可掃描二維碼進(jìn)入賽事QQ群(807070500),獲取更多大賽詳情和技術(shù)直播安排



第二部分:“達(dá)觀杯”baseline代碼分享


  • 達(dá)觀數(shù)據(jù)工程師:


現(xiàn)在我們著重講一下basline代碼。baseline代碼可以在比賽網(wǎng)站的“數(shù)據(jù)”頁(yè)面(https://biendata.com/competition/datagrand/data/?)下載。


在前一章中,高翔老師給大家提到過做命名實(shí)體識(shí)別的幾種方式:


  • 基于規(guī)則

  • 基于機(jī)器學(xué)習(xí)

  • 基于深度學(xué)習(xí)


因?yàn)檫@次達(dá)觀杯比賽的數(shù)據(jù)經(jīng)過了特殊處理,所以沒法用基于規(guī)則的方法做。在這里我們介紹一下后兩種方法。


對(duì)于傳統(tǒng)的機(jī)器學(xué)習(xí)算法來說,特征工程是特別重要的一項(xiàng),常常會(huì)占用我們特別多的時(shí)間。而且baseline提供的算法來說,設(shè)計(jì)特征模板也是一個(gè)重要的步驟,它會(huì)影響最后出來模型的整體效果。


而如果要用深度學(xué)習(xí)的方法做信息抽取,就需要比較多的機(jī)器資源,可能還需要更多的標(biāo)注數(shù)據(jù),才能在深度學(xué)習(xí)的算法上獲得較好的效果。


下面我們看一下baseline代碼。首先需要引入相關(guān)的庫(kù):

import codecs import?os


整個(gè)代碼分成以下5個(gè)部分:

# 0 install crf++ https://taku910.github.io/crfpp/ #?1?train?data?in #?2?test?data?in #?3?crf?train #?4?crf?test #?5?submit?test


首先我們需要CRF++工具,大家可以到 https://taku910.github.io/crfpp/?下載工具。然后我們可以分析一下代碼:


第一步:處理訓(xùn)練數(shù)據(jù):

#?step?1?train?data?in with codecs.open('train.txt','r', encoding='utf-8')as f: lines?=?f.readlines() results?=[] for?line?in?lines: features?=[] tags =[] samples = line.strip().split(' ') for?sample?in?samples: sample_list = sample[:-2].split('_') tag = sample[-1] features.extend(sample_list) tags.extend(['O']* len(sample_list))if tag =='o'else tags.extend(['B-'+tag]+['I-'+ tag]*(len(sample_list)-1)) results.append(dict({'features':?features,'tags':?tags})) train_write_list?=[] with?codecs.open('dg_train.txt','w',?encoding='utf-8')as?f_out: for?result?in?results: for?i?in?range(len(result['tags'])): train_write_list.append(result['features'][i]+'\t'+?result['tags'][i]+'\n') train_write_list.append('\n') f_out.writelines(train_write_list)


我們知道做命名識(shí)別相當(dāng)于一個(gè)序列標(biāo)注的問題,所以在這里我們需要把這個(gè)數(shù)據(jù)轉(zhuǎn)化成不同標(biāo)簽集序列標(biāo)注的樣式,這里有不同的幾種標(biāo)簽集,這里我是用BIO去做的,大家也可以去嘗試其他方式。


在比賽中,我們的訓(xùn)練集格式是幾列特征加上一列標(biāo)簽的。我這里用了最基本的特征,就是字符本身的特征。不過比賽使用的不是字符本身,而是我們經(jīng)過特殊處理之后每一個(gè)字的index,以及這個(gè)index對(duì)應(yīng)的標(biāo)簽。在比賽中,我們定義了a,b,c三種標(biāo)簽,再通過中劃線連接,就是代碼中的['B-' + tag]和['I-' +tag]。

在這里大家也可以添加一些其他的特征。對(duì)于NLP來說,常見的特征包括詞性、詞頻、詞邊界、實(shí)體的邊界等。多加入幾個(gè)這樣的特征,可能會(huì)對(duì)效果有一些影響。


第二步:處理測(cè)試集


代碼如下:

???????#?step?2?test?data?in with?codecs.open('test.txt','r',?encoding='utf-8')as?f: lines?=?f.readlines() results?=[] for?line?in?lines: features?=[] sample_list?=?line.split('_') features.extend(sample_list) results.append(dict({'features':?features})) test_write_list?=[] with?codecs.open('dg_test.txt','w',?encoding='utf-8')as?f_out: for?result?in?results: for?i?in?range(len(result['features'])): test_write_list.append(result['features'][i]+'\n') test_write_list.append('\n') f_out.writelines(test_write_list)


預(yù)測(cè)集的處理方式和訓(xùn)練集是一樣的,只有一點(diǎn)區(qū)別,測(cè)試集沒有最后一列標(biāo)簽。這些都處理好了之后,我們就可以用我們安裝的CRF++工具去調(diào)用這個(gè)命令訓(xùn)練。代碼如下:


第三步:CRF++訓(xùn)練


???????#?3?crf?train crf_train?="crf_learn?-f?3?template.txt?dg_train.txt?dg_model" os.system(crf_train)


這里需要重點(diǎn)強(qiáng)調(diào)一下對(duì)模型影響比較大的特征模板(存儲(chǔ)在template.txt)。template.txt文件可以在本文最上方的鏈接[c4]?下載,文件內(nèi)容如下:


???????#?Unigram U00:%x[-3,0] U01:%x[-2,0] U02:%x[-1,0] U03:%x[0,0] U04:%x[1,0] U05:%x[2,0] U06:%x[3,0] U07:%x[-2,0]/%x[-1,0]/%x[0,0] U08:%x[-1,0]/%x[0,0]/%x[1,0] U09:%x[0,0]/%x[1,0]/%x[2,0] U10:%x[-3,0]/%x[-2,0] U11:%x[-2,0]/%x[-1,0] U12:%x[-1,0]/%x[0,0] U13:%x[0,0]/%x[1,0] U14:%x[1,0]/%x[2,0] U15:%x[2,0]/%x[3,0]????? #?Bigram B


這里我們用了一個(gè)比較簡(jiǎn)單的特征模板,取了離當(dāng)前字最遠(yuǎn)的前3個(gè)字和后3個(gè)字,以及它們之間的組合特征(如U07到U09這幾行)。我們可以看到這個(gè)模板其實(shí)特別簡(jiǎn)單,一共只有16個(gè)特征。這種選擇和我們標(biāo)注好的訓(xùn)練集性質(zhì)有關(guān)。如果研究過比賽的訓(xùn)練集,就會(huì)發(fā)現(xiàn)數(shù)據(jù)中的實(shí)體是比較簡(jiǎn)單的,不會(huì)涉及特別長(zhǎng)的文本抽取,所以這里正負(fù)3已經(jīng)可以取到一個(gè)比較好的特征了。我也試過用再?gòu)?fù)雜一點(diǎn)的模板去做,但是效果不如這個(gè)簡(jiǎn)單的模板好。


不過,如果像之前提到的,在第一步訓(xùn)練集處理的過程中加了一些其他的NLP的特征工程(比如詞性、詞頻或者詞邊界、是否是句子的結(jié)尾、是否是實(shí)體的結(jié)尾等),那么我們就需要在template文件里加入更復(fù)雜的特征。


具體來說,因?yàn)槲覀儸F(xiàn)在可以看U00到U06對(duì)應(yīng)的都只是一個(gè)坐標(biāo),代表了當(dāng)前字向前和向后的字,但是我們并沒有橫向地去取特征。如果大家加了其他的特征工程,那么在每行(如U00:%x[-3,0])后面加上這個(gè)字的其他特征,比如這個(gè)字本身及前后幾個(gè)字是否是一個(gè)停用詞,或者這一個(gè)字的前一個(gè)字是不是停用詞的特征。


除了Unigram,還可以選擇Bigram。Bigram和Unigram非常相似。但是它引入了狀態(tài)轉(zhuǎn)移函數(shù)。狀態(tài)轉(zhuǎn)移函數(shù)考慮了當(dāng)前輸出標(biāo)簽的前一個(gè)標(biāo)簽是什么。所以它會(huì)有全局的概念。


在CRF訓(xùn)練代碼crf_train = "crf_learn -f 3 template.txt dg_train.txtdg_model"中,除了template.txt外,還有其他一些參數(shù)。例如-f 3,代表Template里設(shè)定的特征函數(shù)的頻率值。如果它低于這個(gè)值的話,我是會(huì)把它刪除。這里大家可以看到我們?cè)趖emplate.txt中只嘗試取到3個(gè)字的組合(例如文件中的U07:%x[-2,0]/%x[-1,0]/%x[0,0]),再多的都沒有了。如果大家取到4個(gè)字或者5個(gè)字的組合,這些特征是非常稀疏,對(duì)整個(gè)模型沒有很大貢獻(xiàn)了。所以這里我們?cè)O(shè)一個(gè)最低的值,可以把那些稀疏的特征去掉。


除了這個(gè)以外,還會(huì)有一個(gè)懲罰系數(shù),也一定程度提高這個(gè)模型的泛化能力。


第四步:CRF++生成預(yù)測(cè)結(jié)果

??????#?4?crf?test crf_test?="crf_test?-m?dg_model?dg_test.txt?-o?dg_result.txt" os.system(crf_test)

在我們訓(xùn)練好這個(gè)模型之后,就可以調(diào)用crf_test這個(gè)命令生成預(yù)測(cè)結(jié)果。

?

第五步:生成可提交的文件


最后一步是生成可以提交的文件,代碼如下:

???????#?5?submit?data f_write?=codecs.open('dg_submit.txt','w',?encoding='utf-8') with?codecs.open('dg_result.txt','r',?encoding='utf-8')as?f: lines?=?f.read().split('\n\n') for?line?in?lines: if?line?=='': continue tokens?=?line.split('\n') features?=[] tags?=[] for?token?in?tokens: feature_tag?=?token.split() features.append(feature_tag[0]) tags.append(feature_tag[-1]) samples?=[] i?=0 while?i?<?len(features): sample?=[] if?tags[i]=='O': sample.append(features[i]) j?=?i?+1 while?j?<?len(features)and?tags[j]=='O': sample.append(features[j]) j?+=1 samples.append('_'.join(sample)+'/o') else: if?tags[i][0]!='B': print(tags[i][0]+'error?start') j?=?i?+1 else: sample.append(features[i]) j?=?i?+1 while?j?<?len(features)and?tags[j][0]=='I'and?tags[j][-1]==?tags[i][-1]: sample.append(features[j]) j?+=1 samples.append('_'.join(sample)+'/'+tags[i][-1]) i?=?j f_write.write('??'.join(samples)+'\n')


這一步也是選手反映出現(xiàn)問題最多的一個(gè)步驟,因?yàn)榭赡艽蠹业牟僮飨到y(tǒng)不同。如果用的Windows系統(tǒng),split('\n\n')應(yīng)該要換成split('\r\n'),然后再進(jìn)行后續(xù)處理,不然是會(huì)報(bào)錯(cuò)的。


除此之外,還有一些選手會(huì)反映系統(tǒng)總是會(huì)報(bào)各種各樣的分類錯(cuò)誤和異常。我建議大家檢查換行符,保證提交的文件是3000條,不能多一行、少一行,也不能在最后一行加換行符。還有一點(diǎn),雖然我們只評(píng)測(cè)a,b,c這三個(gè)類型的字段,所以/o不參與評(píng)分,但我們提交時(shí)還是要包含/o,否則也會(huì)報(bào)錯(cuò)。

?

第三部分:問答環(huán)節(jié)

?

  • 關(guān)于比賽:數(shù)據(jù),baseline

?

問:比賽的訓(xùn)練數(shù)據(jù)都是詞向量嗎?

?

達(dá)觀數(shù)據(jù)工程師:不是的,由于我們數(shù)據(jù)的特殊性,我們的數(shù)據(jù)都是字符級(jí)別的。因?yàn)槲覀兊臄?shù)據(jù)已經(jīng)做了脫敏處理,分詞的特征已經(jīng)沒有了。

?

問:Baseline模型可以到多少分?

?

達(dá)觀數(shù)據(jù)工程師:Baseline非常簡(jiǎn)單,如果裝了CRF++工具,能夠馬上跑出來,大概能有0.85的F1。大家如果選到更好的特征模板,就能把CRF調(diào)到一個(gè)更高的分?jǐn)?shù)。因?yàn)镃RF本身也是很有門道的,可能需要花一些時(shí)間,不過研究一下會(huì)很有收獲。

?

問:比賽中提供的未標(biāo)注數(shù)據(jù)有什么用?


達(dá)觀數(shù)據(jù)工程師:我的看法是用來訓(xùn)練語言模型,如果你有一些別的特別酷炫的想法也可以嘗試。因?yàn)樘峁┪礃?biāo)注數(shù)據(jù)的初衷,是我們看到NLP最近一年的發(fā)展,自從ELMo、BERT出現(xiàn),后面還有XLNet,這些模型都是在告訴我們NLP其實(shí)也可以借鑒一下CV超大數(shù)據(jù)量預(yù)訓(xùn)練模型的思路。因?yàn)樵贜LP領(lǐng)域標(biāo)注的數(shù)據(jù)非常難獲取,其實(shí)NLP的數(shù)據(jù)比CV的數(shù)據(jù)更難標(biāo),但是我們有大量無監(jiān)督數(shù)據(jù),比如神奇的被翻來覆去調(diào)教了N次的維基百科,這種未監(jiān)督數(shù)據(jù)量足夠大,你總能發(fā)現(xiàn)里面的語言學(xué)規(guī)律,這里面的規(guī)律可以用來做特征,來增強(qiáng)模型的泛化。特別是現(xiàn)在做文本相似度以及做NER等基礎(chǔ)任務(wù),用了BERT以后泛化能力會(huì)提高很多,BERT現(xiàn)在經(jīng)常被作為基礎(chǔ)的特征提取模型。

?

問:為什么我的模型分?jǐn)?shù)只有 0.72??


高翔:其實(shí)就如前文所說,應(yīng)該先研究一下數(shù)據(jù),并用傳統(tǒng)的方法提出一些baseline模型。否則就不知道這個(gè)任務(wù)的底線,也可能會(huì)出現(xiàn)過擬合。我們自己內(nèi)部用Python串起來十幾行代碼,就能跑到0.8+。我覺得不到0.8可能是出現(xiàn)了過擬合,沒有使用預(yù)訓(xùn)練數(shù)據(jù),只是使用了標(biāo)注數(shù)據(jù)。所以建議先用標(biāo)準(zhǔn)模型試試,得到一個(gè)baseline,獲得一些信息,再去做一些比較復(fù)雜的模型。

?

  • 比賽相關(guān)技術(shù):調(diào)參,BERT,ELMo,LSTM和CRF

?

問:如何調(diào)參?

?

高翔:這個(gè)問題特別深?yuàn)W。很多情況下我們把一些同學(xué)叫“調(diào)包俠”,他們沒有很好地理解算法本質(zhì),只是在瞎調(diào)。比如我曾經(jīng)遇到一個(gè)同學(xué)在LSTM里把ReLu當(dāng)成激活函數(shù)。但LSTM要求輸出為0-1,而ReLu的輸出范圍是0到無窮大,所以梯度直接就爆炸了。我覺得調(diào)參有兩個(gè)重要的方面,首先是經(jīng)驗(yàn)的積累,這點(diǎn)只能靠自己;其次需要對(duì)模型和數(shù)學(xué)有一定的了解,這些不會(huì)直接告訴你如何調(diào)參,但是能給你一些靈感和方向。我也建議大家搜索一些網(wǎng)上的經(jīng)典套路。

?

問:BiLSTM+CRF能用于比賽嗎?


達(dá)觀數(shù)據(jù)工程師:如果用深度模型也可以,但是我們這次比賽的數(shù)據(jù)量有點(diǎn)少,用深度學(xué)習(xí)模型的話很容易過擬合。目前已經(jīng)有不少參賽選手反饋,用BiLSTM+CRF模型調(diào)參,不管怎樣調(diào),結(jié)果甚至還不如CRF隨便跑一下好。這是因?yàn)槲覀兘o的訓(xùn)練集只有17000條,而且并不是每一條都有標(biāo)注的,所以訓(xùn)練集比較少。所以大家如果要做的話,就需要嘗試用訓(xùn)練語言模型的方式去做深度學(xué)習(xí)模型了。


問:BERT+BiLSTM+CRF呢?


達(dá)觀數(shù)據(jù)工程師:如果是用于我們這個(gè)比賽,我懷疑你在BERT的訓(xùn)練過程中會(huì)過擬合。

?

問:BERT能不能把比賽數(shù)據(jù)解密?

?

達(dá)觀數(shù)據(jù)工程師:我覺得逆向解密可能跟BERT關(guān)系不大,跟你的統(tǒng)計(jì)能力以及偵探小說看得多不多有關(guān)系。

?

問:如何使用ELMo能訓(xùn)練出更好的詞向量?

?

高翔:這個(gè)要看與什么比較。我們的實(shí)踐經(jīng)驗(yàn)不一定跟你相符。我們發(fā)現(xiàn),ELMo訓(xùn)練出來的東西的確會(huì)比Word2Vec會(huì)好,而且要好不少,但跟BERT相比還是會(huì)差一些。如果你要訓(xùn)練一個(gè)不停地迭代的模型,可能花很多時(shí)間調(diào)參,但是可能沒有換掉整個(gè)模型框架的收益大。因?yàn)锽ERT效果的確要好很多,無論從機(jī)制還是attention思路來說,都會(huì)比簡(jiǎn)單的LSTM這種方式做得更好。


達(dá)觀數(shù)據(jù)工程師:雖然BERT很難用于本次比賽,但我覺得ELMo也可以用在比賽里。ELMo有兩種方式,一種是自己分詞,然后再進(jìn)LSTM。還有一種是直接用字向量。你其實(shí)可以跳過自己分詞,直接把每個(gè)字當(dāng)成ELMo中的詞向量來訓(xùn)練。


比賽給出的未監(jiān)督數(shù)據(jù)不可能到維基中文數(shù)據(jù)的量級(jí)。所以我個(gè)人建議是從ELMo這樣的Baseline開始,看ELMo會(huì)不會(huì)在比賽數(shù)據(jù)量規(guī)模上過擬合,如果會(huì)的話,可以把ELMo的模型復(fù)雜度自己裁剪,或者你用一些更復(fù)雜更炫酷的詞向量去拼接ELMo。

?

問:能否再講解一下BiLSTM+CRF?


達(dá)觀數(shù)據(jù)工程師:CRF可以做的東西,BiLSTM+CRF應(yīng)該都可以做。但是這次比賽沒有給分詞的信息,所以可以用字向量來做。但是用字向量來做,一是容易過擬合(就像前文提到的數(shù)據(jù)量不是很多)。如果你們要玩這種深度學(xué)習(xí)模型,首先要面對(duì)的首要問題是過擬合,不過我們已經(jīng)幫你們排除掉了最容易過擬合的事情,就是詞向量。


所以,現(xiàn)在只需要做字向量,而字向量的空間比詞向量少了很多。詞向量一般來說是幾萬級(jí)的,再乘以常用的200維,這樣就容易出現(xiàn)嚴(yán)重的過擬合。


字向量一般是千級(jí)別(比如五六千),再乘以一個(gè)100維,不過可能還是有可能會(huì)過擬合,因?yàn)槲覀兊臄?shù)據(jù)量比較少。


這次比賽做的命名實(shí)體識(shí)別,基本上給的是比較短的文本。你可以做一件很簡(jiǎn)單的事情,就是做數(shù)據(jù)增強(qiáng):隨機(jī)把2句、3句,甚至4句、5句話拼在一起。拼完以后你的實(shí)體還是在原來的位置,這樣數(shù)據(jù)量可以直接變成2倍到3倍。而現(xiàn)在比賽這個(gè)量級(jí)的數(shù)據(jù)做BiLSTM+CRF是一定會(huì)過擬合的。


當(dāng)然,你可以有一些更神奇的操作。比如如果你懷疑過擬合主要出現(xiàn)在字向量層或者LSTM層的話,你可以去把字向量層的學(xué)習(xí)率調(diào)低,或者把LSTM層的學(xué)習(xí)率調(diào)低,或者加L2正則化。


另外值得一提的是,我們?cè)诒荣愔薪o了一部分未監(jiān)督語料。未監(jiān)督語料量級(jí)其實(shí)也不是特別大,我前兩天在比賽群里看到有人在企圖訓(xùn)練BERT,我認(rèn)為這么做不是特別科學(xué)。這么小的語料訓(xùn)練BERT一定是訓(xùn)練不出來的。我們也有過BERT的訓(xùn)練,基本上用了整個(gè)維基百科的數(shù)據(jù)。如果數(shù)據(jù)量少或者質(zhì)量差的話,都會(huì)影響到BERT的訓(xùn)練效果,特別是這個(gè)比賽用的數(shù)據(jù)量級(jí)會(huì)比維基百科少了太多。


語言模型從ELMo到BERT,都是數(shù)據(jù)量多大,模型能力就有多大。深度學(xué)習(xí)一定要記住這樣一件事情:數(shù)據(jù)量多大決定你要用多復(fù)雜的模型才不會(huì)過擬合。


這個(gè)問題回答有點(diǎn)長(zhǎng),但是這是一個(gè)相當(dāng)廣泛的,也是一個(gè)比較實(shí)用的問題。


問:NER除了BiLSTM+CRF,還有其它方法嗎?


達(dá)觀數(shù)據(jù)工程師:BiLSTM+CRF已經(jīng)是一個(gè)2015年提出來的很老的Baseline了。還有很多很酷炫的方法(比如IDCNN+CRF)也出現(xiàn)了挺久了。它的主要特點(diǎn)是性能高,在上下文關(guān)聯(lián)不是很長(zhǎng),而且對(duì)訓(xùn)練速度要求高的情況下可以試一下。


我個(gè)人觀點(diǎn),在機(jī)器學(xué)習(xí)這塊更好的思路不是唯模型論,而是一個(gè)概率編程的思路。也就是說,當(dāng)你的規(guī)則很難去維護(hù)時(shí),就說明你的數(shù)據(jù)量已經(jīng)足夠去做模型了。你可以做一個(gè)很小的模型,解決一個(gè)很小的問題,然后把這些東西拼起來。

?

問:數(shù)據(jù)量規(guī)模和神經(jīng)網(wǎng)絡(luò)的層數(shù)有什么關(guān)系,10萬樣本需要幾層網(wǎng)絡(luò)?


達(dá)觀數(shù)據(jù)工程師:這種玄學(xué)問題很難簡(jiǎn)單地概括清楚。我覺得樣本質(zhì)量比數(shù)量重要太多,有時(shí)你洗洗數(shù)據(jù)比你調(diào)一兩層模型有意義多了。


即使不考慮數(shù)據(jù)質(zhì)量,相比樣本數(shù)量來說,你可以做的數(shù)據(jù)增強(qiáng)以及你樣本當(dāng)中實(shí)際的模式也是很重要的一件事情。如果是標(biāo)準(zhǔn)的NER問題(比如抽取人名、地名、機(jī)構(gòu)名這種實(shí)體),而且數(shù)據(jù)量有10萬樣本,我覺得LSTM層數(shù)差不多1-2層,最多3層就可以了。


但這是一個(gè)經(jīng)驗(yàn)值,如果你有足夠的時(shí)間,可以用先用BERT去微調(diào)(finetune)做一個(gè)Baseline,供其他模型參考。然后更重要的是,你怎樣去發(fā)現(xiàn)是否在這個(gè)數(shù)據(jù)上出現(xiàn)了過擬合。如果你在過擬合這個(gè)數(shù)據(jù),很多時(shí)候并不是LSTM層數(shù)的關(guān)系。


關(guān)于隱層維度的上限,假如你說的是BiLSTM+CRF的話,它的前級(jí)特征,比如如何得到字向量和詞向量,是否有鎖定詞向量,以及數(shù)據(jù)是否有增強(qiáng),比LSTM的層數(shù)重要多了。維度一般都在數(shù)百維左右。

?

問:能否再詳細(xì)介紹一下數(shù)據(jù)增強(qiáng)?


達(dá)觀數(shù)據(jù)工程師:NER的語料基本是識(shí)別一句話,比如“小姐姐某某某來到達(dá)觀數(shù)據(jù)” 和“孫楊去參加了游泳比賽”。那么現(xiàn)在我們有了兩條語料,你可以這兩條語料拼在一起,模型理論上還是應(yīng)該給出正確結(jié)果,但是你喂給模型的語料就變成了三條。


其實(shí)模型有可能并不是在過擬合你所理解的那種模式,它其實(shí)是在記住數(shù)據(jù)中相同的東西。

?

問:長(zhǎng)度過長(zhǎng)的句子需要截?cái)鄦?#xff1f;


達(dá)觀數(shù)據(jù)工程師:這就看你怎么定義“過長(zhǎng)”了。比如你統(tǒng)計(jì)下來,99%的句子都在200個(gè)字以下,你完全可以選擇在200個(gè)字截?cái)?#xff0c;或者你做了各種花式拼接以后再統(tǒng)計(jì)一下。如果有些特別長(zhǎng)尾的東西,就可以在那個(gè)長(zhǎng)度截?cái)唷?/span>

?

問:深度學(xué)習(xí)和傳統(tǒng)的機(jī)器學(xué)習(xí)方法,哪個(gè)好?


達(dá)觀數(shù)據(jù)工程師:這個(gè)問題比較泛,深度學(xué)習(xí)和傳統(tǒng)機(jī)器學(xué)習(xí)方法哪個(gè)好一些?機(jī)器學(xué)習(xí)本質(zhì)上是個(gè)實(shí)驗(yàn)科學(xué)。我認(rèn)為實(shí)驗(yàn)科學(xué)的意思就是試一試哪個(gè)方法效果好,哪個(gè)方法就好。從理論上有時(shí)很難推斷出來,因?yàn)槭褂玫臄?shù)據(jù)經(jīng)常千奇百怪,存在各種異常。

?

關(guān)于達(dá)觀數(shù)據(jù)與招聘

?

問:比賽排名第31能面試嗎?如何發(fā)簡(jiǎn)歷?


高翔:如果你的成績(jī)是第31名,和第30名差了0.01,我們不在乎這種差異,可以直接來。簡(jiǎn)歷可以發(fā)到“達(dá)觀杯”專用投遞郵箱maxinyi@datagrand.com,注明參加了“達(dá)觀杯”比賽。

?

問:達(dá)觀工作的氛圍如何?


達(dá)觀數(shù)據(jù)工程師:氛圍很輕松,boss是技術(shù)出身(從以往的工作經(jīng)驗(yàn)來看,這點(diǎn)很重要),但工作上又有很多挑戰(zhàn),其次有很多交流學(xué)習(xí)的機(jī)會(huì),例如每周一次的分享會(huì),也隨時(shí)都可以和各種老司機(jī)討論問題。你可以和技術(shù)大牛們面對(duì)面切磋技藝,有更多的機(jī)會(huì)踐行人工智能領(lǐng)域的前沿技術(shù)。達(dá)觀技術(shù)團(tuán)隊(duì)在工程和科研兩方面均實(shí)力還是比較強(qiáng)的。另外,公司比較務(wù)實(shí),無級(jí)別高低之分,唯能力互相切磋;無拖沓冗長(zhǎng)會(huì)議,皆高效工作之實(shí)。


其他的福利,水果、零食、聚餐、團(tuán)建,大多互聯(lián)網(wǎng)公司有的也都有。另外還有年度海外游、部門團(tuán)建基金、不定期各種聚餐、桌游和戶外活動(dòng)。


對(duì)于NLPer來說,是一個(gè)非常好的選擇。公司正處于快速發(fā)展期,歡迎有興趣的小伙伴們加入,可以積極投遞簡(jiǎn)歷。


問:只有CV的背景能投NLP嗎?


達(dá)觀數(shù)據(jù)工程師:我覺得可以呀,只要你是真的感興趣。

?

【關(guān)于“達(dá)觀杯”】

?

“達(dá)觀杯”大賽由國(guó)內(nèi)領(lǐng)先的文本智能處理科技公司達(dá)觀數(shù)據(jù)主辦,面向全球范圍的學(xué)生、學(xué)者和企業(yè)研發(fā)人員,旨在通過提供業(yè)務(wù)場(chǎng)景、真實(shí)數(shù)據(jù)、專家指導(dǎo),借助社會(huì)和學(xué)界的技術(shù)力量,進(jìn)一步提升中文自然語言處理技術(shù)的研究水平,為業(yè)界選拔和培養(yǎng)有志于自然語言處理領(lǐng)域的算法研究和應(yīng)用探索的青年才俊,探索更多可能、開啟無限未來。

?

本次“達(dá)觀杯”文本信息智能抽取挑戰(zhàn)賽是達(dá)觀數(shù)據(jù)舉辦的第三屆“達(dá)觀杯”算法大賽。2017年和2018年,達(dá)觀分別以“個(gè)性化推薦”和“文本分類”為主題,主辦過兩次大賽,在全國(guó)范圍內(nèi)引起了很大的反響,兩次比賽吸引了海內(nèi)外近萬支隊(duì)伍參賽。

?

本次比賽的任務(wù)是信息抽取,給定一定數(shù)量的標(biāo)注語料以及海量的未標(biāo)注語料,在3個(gè)字段上做信息抽取任務(wù)。截至目前,“達(dá)觀杯”文本信息智能抽取挑戰(zhàn)賽已吸引來自海內(nèi)外2400余名選手參賽,并將在下周進(jìn)行第三場(chǎng)賽事答疑直播和贈(zèng)書活動(dòng)。


比賽頁(yè)面:

https://biendata.com/competition/datagrand/?source=shujupai


訪問以上鏈接進(jìn)入比賽頁(yè)面,可掃描下方二維碼進(jìn)入賽事QQ群,獲取更多大賽詳情和技術(shù)直播安排。


?

【關(guān)于達(dá)觀數(shù)據(jù)】


達(dá)觀數(shù)據(jù)成立于2015年,專注于利用先進(jìn)的自然語言處理、光學(xué)字符識(shí)別(OCR)、知識(shí)圖譜等技術(shù),為大型企業(yè)和政府機(jī)構(gòu)提供機(jī)器人流程自動(dòng)化(RPA)、文檔智能審閱、垂直搜索、智能推薦、客戶意見洞察等智能產(chǎn)品,讓計(jì)算機(jī)代替人工完成業(yè)務(wù)流程自動(dòng)化,大幅度提高企業(yè)效率。先后斬獲中國(guó)人工智能領(lǐng)域最高獎(jiǎng)“吳文俊人工智能獎(jiǎng)”、全球三十大最佳創(chuàng)業(yè)公司、中國(guó)人工智能創(chuàng)新企業(yè)50強(qiáng)等榮譽(yù)。2018年完成1.6億元B輪融資,成為語義分析人工智能細(xì)分領(lǐng)域獲得融資金額最多的企業(yè)。


點(diǎn)擊“閱讀原文”報(bào)名吧~

總結(jié)

以上是生活随笔為你收集整理的​万字长文详解文本抽取:从算法理论到实践(附“达观杯”官方baseline实现解析及答疑)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。