在自然語言處理和知識圖譜中,實(shí)體抽取、NER是一個(gè)基本任務(wù),也是產(chǎn)業(yè)化應(yīng)用NLP 和知識圖譜的關(guān)鍵技術(shù)之一。BERT是一個(gè)大規(guī)模預(yù)訓(xùn)練模型,它通過精心設(shè)計(jì)的掩碼語言模型(Masked Language Model,MLM)來模擬人類對語言的認(rèn)知,并對數(shù)十億個(gè)詞所組成的語料進(jìn)行預(yù)訓(xùn)練而形成強(qiáng)大的基礎(chǔ)語義,形成了效果卓絕的模型。通過 BERT來進(jìn)行實(shí)體抽取、NER的方法是當(dāng)前在NLP和知識圖譜的產(chǎn)業(yè)化應(yīng)用中最常用的方法,是效果與成本權(quán)衡下的最佳選擇。本文詳細(xì)講解使用BERT來進(jìn)行實(shí)體抽取,看完本文就會(huì)用當(dāng)前工業(yè)界最佳的模型了。
什么是實(shí)體抽???
實(shí)體是一個(gè)常見的名詞,《知識圖譜:認(rèn)知智能理論與實(shí)戰(zhàn)》一書將其定義為:
實(shí)體(Entity):是指一種獨(dú)立的、擁有清晰特征的、能夠區(qū)別于其他事物的事物。在信息抽取、自然語言處理和知識圖譜等領(lǐng)域,用來描述這些事物的信息即實(shí)體。實(shí)體可以是抽象的或者具體的。
在實(shí)體抽取中,實(shí)體也成為命名實(shí)體(Named Entity),是指在實(shí)體之上會(huì)將其分門別類,用實(shí)體類型來框定不同的實(shí)體。圖1是一些常見的“實(shí)體”的例子,比如“城市”類型的實(shí)體“上?!保?公司”類型的實(shí)體“達(dá)觀數(shù)據(jù)”等。
圖1?實(shí)體示例
實(shí)體抽?。‥ntity Extraction,EE)的目標(biāo)就是識別一段文本中所包含的實(shí)體,在其他語境中,也被稱之為“實(shí)體識別(Entity Recognition,ER)”、“命名實(shí)體識別(Named Entity Recognition,NER)”,這些不同的名詞在大多數(shù)情況下所指代的意思是一樣的。
舉例來說,有一段文本:
達(dá)觀數(shù)據(jù)與同濟(jì)大學(xué)聯(lián)合共建的“知識圖譜與語義計(jì)算聯(lián)合實(shí)驗(yàn)室”正式揭牌成立
識別出其中的藍(lán)色部分,并標(biāo)記為“機(jī)構(gòu)”類型的實(shí)體,就是實(shí)體抽取。實(shí)體抽取的過程通??梢苑譃槭莾蓚€(gè)階段:
- 識別出所有表示實(shí)體的詞匯
- 將這些詞匯分類到不同實(shí)體類型中
在傳統(tǒng)的命名實(shí)體識別任務(wù)中,通常有人物、機(jī)構(gòu)、地點(diǎn)等。而在知識圖譜中,實(shí)體類型可以有數(shù)十種,甚至數(shù)百種。對于知識圖譜來說,將各種文本中的實(shí)體抽取出來是最基本的任務(wù),有許多方法都致力于解決這個(gè)問題。
圖2 實(shí)體抽取案例
眾所周知,實(shí)體抽取的復(fù)雜程度十分之高,這不僅僅有上圖中的這樣復(fù)雜的文檔的原因,語言本身的理解也存在重重困難,有些場景下即使是人類也會(huì)出現(xiàn)不解之處。比如語言中隱含著專業(yè)的背景知識,隱形或顯性的上下文語境,同樣的文本表達(dá)著完全不同的概念,而相同的概念又有多變的語言表達(dá)方法等等。這些綜合的原因使得理解語言成為了人工智能皇冠上的明珠,而從文本中抽取實(shí)體則不可避免地要理解語言,實(shí)體抽取的效果則依賴于對語言理解的程度。
圖3?語言理解困難重重
歷史上,用來進(jìn)行實(shí)體抽取的方法包括基于規(guī)則的方法、機(jī)器學(xué)習(xí)方法、深度學(xué)習(xí)方法和弱監(jiān)督學(xué)習(xí)方法等幾大類,每類方法中都有很多種不同的算法,具體的算法內(nèi)容可以參考《知識圖譜:認(rèn)知智能理論與實(shí)戰(zhàn)》第三章《實(shí)體抽取》(P78~136)。
BERT介紹?
BERT 是英文“Bidirectional Encoder Representations from Transformers”的縮寫,是Google開發(fā)的一種基于Transformer的深度學(xué)習(xí)技術(shù),用于人工智能領(lǐng)域的文本預(yù)訓(xùn)練。BERT 由Jacob Devlin和他在 Google 的同事于 2018 年創(chuàng)建,并在論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》中發(fā)布。在2019 年,谷歌宣布已開始在其搜索引擎中使用 BERT,到 2020 年底,它幾乎在搜索查詢中都使用了 BERT。在2020 年的一篇論文《”A Primer in BERTology: What We Know About How BERT Works”》中提到“In a little over a year, BERT has become a ubiquitous baseline in NLP experiments and inspired numerous studies analyzing the model and proposing various improvements. The stream of papers seems to be accelerating rather than slowing down, and we hope that this survey helps the community to focus on the biggest unresolved questions.”自從 BERT 出來以后,也引導(dǎo)了至今炙手可熱的“大模型”浪潮。其本質(zhì)就是“預(yù)訓(xùn)練”+“微調(diào)”:
圖4?BERT模型,來自參考文獻(xiàn)[2]
對于普羅大眾來說,人工智能的標(biāo)志性事件當(dāng)屬AlphaGo,號稱人類最難的智力游戲敗于機(jī)器,可是街頭巷尾的談資。
在自然語言處理領(lǐng)域,BERT在當(dāng)時(shí)的自然語言處理領(lǐng)域可謂掀起軒然大波,總結(jié)起來有:
- 在機(jī)器閱讀理解頂級水平測試SQuAD1.1中表現(xiàn)出驚人成績,首次兩個(gè)衡量指標(biāo)上全面超越人類,并且還在11種不同NLP測試中創(chuàng)出最佳成績。
關(guān)于 SQuAD數(shù)據(jù)集和評測參考https://rajpurkar.github.io/SQuAD-explorer/,當(dāng)前是2.0版本。 - 谷歌團(tuán)隊(duì)成員Thang Luong表示,BERT模型開啟了NLP的新時(shí)代
- 證明了通過大規(guī)模語料集預(yù)訓(xùn)練的技術(shù),能夠大幅度提升各類文本閱讀理解的效果,也因此,“大模型”自此興起
- Masked LM(見下圖)通過學(xué)習(xí)masked的詞,不僅讓模型學(xué)會(huì)了上下文信息,還學(xué)會(huì)了語法syntax、語義semantics、語用pragmatics等,并能夠很好地學(xué)會(huì)部分領(lǐng)域知識
- 預(yù)訓(xùn)練模型越大,效果越好;對應(yīng)的,成本也會(huì)越高。相比于單任務(wù)模型來說,無監(jiān)督的預(yù)訓(xùn)練模型成本要大1000倍以上
- 學(xué)術(shù)界傳統(tǒng)上認(rèn)為,在一些很難處理的文字閱讀理解任務(wù)上,計(jì)算機(jī)有望能夠全面超越人類
圖5 掩碼語言模型
掩碼語言模型的提出則來自于Google 的更早些的一篇論文《Attention Is All You Need》(下載地址:https://arxiv.org/pdf/1706.03762.pdf) 所提到的 Transformers 模型(見下圖)。但 BERT 與 Transformers 略有區(qū)別,使用的是其編碼器部分,這點(diǎn)從BERT 的論文標(biāo)題也可以看出來。事實(shí)上,當(dāng)前炙手可熱的大模型中(如 GPT-3等),幾乎都依賴于 Transformers 的模型結(jié)構(gòu),特別是其中的自注意力機(jī)制?!吨R圖譜:認(rèn)知智能理論與實(shí)戰(zhàn)》一書 P123~130的“BERT 模型詳解”一節(jié)則對結(jié)合代碼實(shí)現(xiàn)該BERT 的模型結(jié)構(gòu)進(jìn)行詳細(xì)的解析,通俗易懂,非常適合閱讀來深入理解BERT 模型。上述兩篇論文則提供了更多的實(shí)驗(yàn)對比素材,深入閱讀有助于了解BERT 為何會(huì)在當(dāng)時(shí)引起轟動(dòng),以至于在NLP領(lǐng)域引領(lǐng)風(fēng)騷數(shù)年。
圖6?Transformer模型結(jié)構(gòu)
此外值得一提的是,Google最初 發(fā)布的 BERT 模型有兩種配置:
- BERT BASE:12 個(gè)編碼器,帶有 12 個(gè)雙向自注意力頭;
- BERT LARGE:24 個(gè)編碼器,帶有 16 個(gè)雙向自注意力頭。
這兩種配置結(jié)構(gòu)類似,Large版本要比Base版本“更大”,效果自然更好,同時(shí)使用時(shí)資源要求也更高。本文以Base版本示例,以使得在一張顯卡上即可完成。換成 Large 版本不用改變?nèi)魏未a,但因?yàn)榫W(wǎng)絡(luò)更大,可能需要更高級的顯卡或多卡來支持模型的訓(xùn)練。
語料準(zhǔn)備?
本文采用“MSRA實(shí)體抽取數(shù)據(jù)集”,并使用BIO標(biāo)記方法來標(biāo)記,數(shù)據(jù)集在GitHub 上有很多,也可以GitHub官網(wǎng)下載。
(https://github.com/wgwang/kgbook/tree/main/datasets/NER-MSRA)
MSRA數(shù)據(jù)集中,實(shí)體類型有三種:
- LOC:地點(diǎn)類型
- ORG:機(jī)構(gòu)類型
- PER:人物類型
一個(gè)例子為:
1 O
、 O
中 B-ORG
國 I-ORG
作 I-ORG
協(xié) I-ORG
和 O
現(xiàn) B-LOC
代 I-LOC
文 I-LOC
學(xué) I-LOC
館 I-LOC
負(fù) O
責(zé) O
人 O
在 O
巴 B-PER
金 I-PER
家 O
中 O
介 O
紹 O
文 B-LOC
學(xué) I-LOC
館 I-LOC
新 O
館 O
設(shè) O
計(jì) O
模 O
型 O
。O
從上述例子可以看出:1.“中國作協(xié)”是組織機(jī)構(gòu)(ORG)類型:
- B-ORG標(biāo)簽:因?yàn)樗且粋€(gè)機(jī)構(gòu)實(shí)體的開始
- I-ORG標(biāo)簽:因?yàn)樗且粋€(gè)機(jī)構(gòu)實(shí)體的延續(xù)
2. “現(xiàn)代文學(xué)館”和“文學(xué)館”是地點(diǎn)(LOC) 類型:
- B-LOC標(biāo)簽:因?yàn)樗?strong>地點(diǎn)實(shí)體的開始
- I-LOC標(biāo)簽:因?yàn)樗?strong>地點(diǎn)實(shí)體的延續(xù)
3.“巴金”是任務(wù)(PER) 類型:
- B-PER標(biāo)簽:因?yàn)樗?strong>人物實(shí)體的開始
- I-PER?標(biāo)簽:因?yàn)樗?strong>人物實(shí)體的延續(xù)
4.其他詞被分配O標(biāo)簽:因?yàn)樗鼈?strong>不是任何實(shí)體
使用 BERT 來進(jìn)行實(shí)體抽取的話,需要將語料進(jìn)行處理,轉(zhuǎn)化成列表的形式(train_data和test_data,對應(yīng)于原始的train.txt 和test.txt),列表的每一個(gè)元素是一個(gè)鍵值對元組,鍵為文本列表,值為標(biāo)簽列表。如下圖所示:
圖7 數(shù)據(jù)樣例
用BERT進(jìn)行實(shí)體抽取
這里使用最流行的 PyTorch 框架來實(shí)現(xiàn)。首先是引入相關(guān)的庫。
這里選擇的是Google發(fā)布的模型bert-base-chinese(https://huggingface.co/models 提供了大量的模型供使用,包括各種專業(yè)的預(yù)訓(xùn)練模型,比如面向金融領(lǐng)域 FinBERT,面向醫(yī)藥領(lǐng)域的 MedBERT等等):
BERT_NAME = ‘bert-base-chinese’
轉(zhuǎn)化為torch能夠使用的數(shù)據(jù)集
再用如下代碼將torch 的 dataset轉(zhuǎn)化為按微批提取的 dataloader:
到此,數(shù)據(jù)準(zhǔn)備完成,后面就可以使用數(shù)據(jù)集來訓(xùn)練模型和測試模型效果了。
構(gòu)建模型
在本文中,我們將使用來自HuggingFace的預(yù)訓(xùn)練 BERT 基礎(chǔ)模型。既然我們要在token級別對文本進(jìn)行分類,那么我們需要使用BertForTokenClassificationclass。
BertForTokenClassificationclass是一個(gè)包裝 BERT 模型并在 BERT 模型之上添加線性層的模型,將充當(dāng)token級分類器?;贐ertForTokenClassificationclass來創(chuàng)建基于 BERT 的實(shí)體抽取模型非常簡單,見下面代碼:
通過如下代碼即可實(shí)例化一個(gè)用BERT進(jìn)行實(shí)體抽取的模型:
model = BertModel(len(label2id)+1)
訓(xùn)練
我們的BERT模型的訓(xùn)練循環(huán)是標(biāo)準(zhǔn)的PyTorch訓(xùn)練循環(huán)。在訓(xùn)練模型中,需要使用?GPU,否則會(huì)非常耗時(shí)。GPU建議使用nvidia的顯卡提供,1080ti及其更高版本皆可。
model = model.cuda()由于BERT已經(jīng)使用了大規(guī)模語料訓(xùn)練并得到了通用的語義表示,通常使用的話,僅需要重新微調(diào)最上面一層即可。為此,需要凍結(jié)其他不需要訓(xùn)練的層的參數(shù)。下面代碼實(shí)現(xiàn)了這個(gè)邏輯:
接下來就是常見的深度學(xué)習(xí)訓(xùn)練方法了,這里使用AdamW優(yōu)化器,其他優(yōu)化器也可以根據(jù)需要進(jìn)行選擇,具體的參考PyTorch的官方文檔。
lr = 0.00005
optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=lr)
下面是具體的訓(xùn)練代碼:
在測試數(shù)據(jù)上評估模型

另外,上述的效果評估是比較簡單的,實(shí)際應(yīng)用中還可以使用更為精細(xì)的評估方法,比如按所抽取的實(shí)體來評估的方法。更多的用于評估實(shí)體抽取的方法可參考《實(shí)體抽取:如何評估算法的效果?》 一文。
(https://mp.weixin.qq.com/s/STS8N1PBML_2BvkO5NfiXg)
結(jié)論
本文介紹了全面介紹了如何使用BERT進(jìn)行實(shí)體抽取,并給出了代碼實(shí)例。通過本文,讀者可以很方便地“依瓢畫葫蘆”實(shí)現(xiàn)一個(gè)基于BERT模型的實(shí)體抽取程序,從而學(xué)會(huì)工業(yè)界中最好用的實(shí)體抽取模型,并將其應(yīng)用到學(xué)習(xí)或工作當(dāng)中。
具體來說,本文內(nèi)容包括:
- 介紹了什么是實(shí)體抽取
- 介紹了什么是 BERT
- 用代碼實(shí)例介紹了如何使用 BERT 進(jìn)行實(shí)體抽取的完整過程,這包括四個(gè)內(nèi)容:
- 準(zhǔn)備數(shù)據(jù)
- 構(gòu)建模型
- 訓(xùn)練模型
- 測試模型效果
參考文獻(xiàn)
- Ashish Vaswani etc., Attention Is All You Need, arxiv: 1706.03762, 2017
- Jacob Devlin etc., BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding, arxiv:1810.04805, 2018
- Anna Rogers etc., A Primer in BERTology: What We Know About How BERT Works, arxiv:2002.12327 2020
- 王文廣, ?知識圖譜:認(rèn)知智能理論與實(shí)戰(zhàn), 電子工業(yè)出版社, 2022
??