如何在BERT模型中添加自己的詞匯教程(pytorch版)
來(lái)源:投稿 作者:皮皮雷
編輯:學(xué)姐
參考文章:
NLP | How to add a domain-specific vocabulary (new tokens) to a subword tokenizer already trained like BERT WordPiece | by Pierre Guillou | Medium
https://medium.com/@pierre_guillou/nlp-how-to-add-a-domain-specific-vocabulary-new-tokens-to-a-subword-tokenizer-already-trained-33ab15613a41
中文bert-base
中文bert-base是以字為單位的,基本上已經(jīng)涵蓋了現(xiàn)代漢語(yǔ)所有的常用字。而且漢字是一個(gè)比較穩(wěn)定的封閉集合,生活中不會(huì)隨時(shí)造出新字來(lái)。新詞倒是很常見(jiàn),但是在中文BERT里直接就被tokenizer切成字了,因此一般沒(méi)有多大的擴(kuò)充詞(字)表的需要。
筆者在古漢語(yǔ)語(yǔ)料上調(diào)用古漢語(yǔ)BERT確實(shí)遇到很多生僻字被分詞器當(dāng)成[UNK]的情況,還沒(méi)有嘗試增加新字,不過(guò)理論上是一樣的。
但是英文不一樣,英文預(yù)訓(xùn)練BERT(對(duì),就是它,bert-base-uncased 和 bert-base-cased)以詞為單位。社會(huì)生活中總是會(huì)有新詞產(chǎn)生,而且在專(zhuān)業(yè)領(lǐng)域(如醫(yī)療、金融)有一些不常用的詞語(yǔ)是英文預(yù)訓(xùn)練bert-base沒(méi)有涵蓋到的。這就需要擴(kuò)充詞表。
此外,在英文模型中,添加自定義詞的作用不僅是增加新詞或者專(zhuān)業(yè)領(lǐng)域的詞匯,而且可以防止詞語(yǔ)被自動(dòng)拆成詞根詞綴。
如果不添加自定義詞匯,“COVID”和“hospitalization”雖然不會(huì)被分詞器直接當(dāng)成[UNK],但是會(huì)被bert-base-cased的分詞器拆分成:
方法1
直接在BERT詞表vocab.txt中替換[unused]

找到pytorch版本的bert-base-cased的文件夾中的vocab.txt文件。
最前面的100行都是[unused]([PAD]除外),直接用需要添加的詞替換進(jìn)去。
比如我這里需要添加一個(gè)原來(lái)詞表里沒(méi)有的詞“anewword”(現(xiàn)造的),這時(shí)候就把[unused1]改成我們的新詞“anewword”

在未添加新詞前,在python里面調(diào)用BERT模型的分詞器:
打印結(jié)果:
當(dāng)在vocab中把[unused1]改成anewword后:
打印結(jié)果:
方法2
通過(guò)重構(gòu)詞匯矩陣來(lái)增加新詞
未加入新詞時(shí),打印'COVID'和'hospitalization'的分詞結(jié)果為:
如果想讓這些詞保持完整的形式,可以通過(guò)重構(gòu)BERT初始權(quán)重矩陣的方式將他們加入詞表。
# num_added_toks返回一個(gè)數(shù),表示加入的新詞數(shù)量,在這里是2
#關(guān)鍵步驟,resize_token_embeddings輸入的參數(shù)是tokenizer的新長(zhǎng)度
添加后的詞匯,通過(guò)model.resize_token_embeddings方法,隨機(jī)初始化了一個(gè)權(quán)重。
#還是保存到原來(lái)的bert文件夾下,這時(shí)候文件夾下多了三個(gè)文件

打印結(jié)果為:
使用tokenizer.save_pretrained保存添加后的詞匯。再次加載模型就會(huì)自動(dòng)讀取增加后的詞匯。
新建一個(gè)python文件查看添加詞匯后的結(jié)果:
打印結(jié)果為:
可見(jiàn)我們之前使用的兩種不同的方法都起到了同樣的效果。只是添加的是大寫(xiě)COVID,bert的tokenizer給我們都轉(zhuǎn)成小寫(xiě)了。
#?小tip
在具體使用的時(shí)候,如果有大量領(lǐng)域內(nèi)專(zhuān)業(yè)詞匯,而且已經(jīng)整理成詞表,建議用方法1直接批量替換。但方法1的缺點(diǎn)是有個(gè)數(shù)限制,cased模型只有99個(gè)空位,uncased模型有999個(gè)空位。
關(guān)注公眾號(hào)【學(xué)姐帶你玩AI】轉(zhuǎn)發(fā)公眾號(hào)文章可以拿獎(jiǎng)品哦~