Pytorch微調(diào)BERT實(shí)現(xiàn)命名實(shí)體識(shí)別
環(huán)境準(zhǔn)備
在繼續(xù)之前,確保你已經(jīng)安裝了PyTorch, Transformers by hugs Face和其他必要的Python庫(kù):
pip install torch transformers datasets
加載預(yù)訓(xùn)練BERT模型
首先導(dǎo)入所需的模塊并加載預(yù)訓(xùn)練的BERT模型。我們使用“bert-base-case”模型作為起點(diǎn):
from transformers import BertTokenizer, BertForTokenClassification import torch # Load pre-trained model tokenizer (vocabulary) tokenizer = BertTokenizer.from_pretrained('bert-base-cased') # Load pre-trained model for token classification model = BertForTokenClassification.from_pretrained('bert-base-cased', num_labels=9)
這里,num_labels表示我們希望分類的實(shí)體類型的數(shù)量。對(duì)于簡(jiǎn)單的NER任務(wù),這可能包括PERSON、ORGANIZATION、LOCATION等標(biāo)簽。
準(zhǔn)備數(shù)據(jù)集
我們將使用hug Face數(shù)據(jù)集庫(kù)來(lái)加載數(shù)據(jù)集。我們將用‘conll2003’數(shù)據(jù)集來(lái)演示這一點(diǎn):
from datasets import load_dataset dataset = load_dataset("conll2003")
CoNLL-2003 數(shù)據(jù)集包含單詞、詞性標(biāo)記、句法塊標(biāo)記和命名實(shí)體標(biāo)記。對(duì)于NER任務(wù),我們感興趣的是“NER”標(biāo)簽。它是經(jīng)典的 英文命名實(shí)體識(shí)別(Named Entity Recognition, NER) 數(shù)據(jù)集。以下是詳細(xì)介紹:
1. 數(shù)據(jù)集背景
- 全稱: Conference on Neural Information Processing Systems (CoNLL) 2003 Task
- 領(lǐng)域: 自然語(yǔ)言處理(NLP)
- 任務(wù): 命名實(shí)體識(shí)別(NER)
- 語(yǔ)言: 英文(English)
- 主辦方: CoNLL 會(huì)議(Hugging Face 的
load_dataset
已將其整合到平臺(tái))
2. 核心內(nèi)容
標(biāo)注實(shí)體類型
數(shù)據(jù)集中定義了以下 4 種實(shí)體類型:
PER
(人名,如 “John Smith”)ORG
(組織機(jī)構(gòu),如 “Google”)LOC
(地理位置,如 “New York”)DATE
(日期,如 “2023-10-05”)
數(shù)據(jù)格式
結(jié)構(gòu): 每條數(shù)據(jù)是一個(gè)句子,按空格分割的單詞列表,每個(gè)單詞附帶對(duì)應(yīng)的標(biāo)簽。
示例:
[ {"word": "John", "label": "PER"}, {"word": "works", "label": "O"}, {"word": "at", "label": "O"}, {"word": "Google", "label": "ORG"}, ... ]
列名:
text
(句子原文)、words
(分詞后的單詞列表)、labels
(實(shí)體標(biāo)簽)。
數(shù)據(jù)集劃分
- 訓(xùn)練集: ~14,000 句子
- 驗(yàn)證集: ~3,000 句子
- 測(cè)試集: ~3,000 句子
3. 應(yīng)用場(chǎng)景
- 訓(xùn)練 NER 模型: 如 RNN、LSTM、Transformer(BERT 等)。
- 評(píng)估模型性能: 官方提供了基準(zhǔn)結(jié)果(如 F1 分?jǐn)?shù)),可用于對(duì)比模型效果。
- 研究 NLP 任務(wù): 分析實(shí)體識(shí)別的難點(diǎn)(如歧義、復(fù)合實(shí)體)。
注意事項(xiàng)
- 標(biāo)注標(biāo)準(zhǔn): 標(biāo)簽為
O
表示非實(shí)體,其他為具體實(shí)體類型。 - 數(shù)據(jù)規(guī)模: 相比現(xiàn)代數(shù)據(jù)集(如 OntoNotes),句子和單詞數(shù)量較小,適合快速驗(yàn)證模型。
- 擴(kuò)展性: 可與其他 NER 數(shù)據(jù)集(如
conll2000
、nerdb
)結(jié)合使用以提升模型泛化能力。
標(biāo)記與對(duì)齊
在通過(guò) BERT 處理數(shù)據(jù)之前,正確地對(duì)其進(jìn)行標(biāo)記并管理詞塊標(biāo)記化至關(guān)重要,這包括正確對(duì)齊實(shí)體標(biāo)簽。以下是我們?cè)跀?shù)據(jù)集上進(jìn)行標(biāo)記化和對(duì)齊的方式:
def tokenize_and_align_labels(examples): tokenized_inputs = tokenizer(examples["tokens"], truncation=True, padding="max_length", is_split_into_words=True) labels = [] for i, label in enumerate(examples["ner"]): word_ids = tokenized_inputs.word_ids(batch_index=i) previous_word_idx = None label_ids = [] for word_idx in word_ids: if word_idx is None: label_ids.append(-100) elif word_idx != previous_word_idx: label_ids.append(label[word_idx]) else: label_ids.append(-100) previous_word_idx = word_idx labels.append(label_ids) tokenized_inputs["labels"] = labels return tokenized_inputs # Apply tokenizer encoded_dataset = dataset.map(tokenize_and_align_labels, batched=True)
這段代碼的作用是對(duì) 命名實(shí)體識(shí)別(NER)數(shù)據(jù)進(jìn)行分詞(Tokenization)和標(biāo)簽對(duì)齊(Label Alignment),使其適配預(yù)訓(xùn)練模型(如 BERT、RoBERTa 等)的輸入格式。以下是逐行解釋和核心邏輯分析:
- 輸入 examples 包含兩個(gè)關(guān)鍵字段:
"tokens"
: 原始句子的單詞列表(如[["John", "works", "at"], ...]
)。"ner"
: 對(duì)應(yīng)的實(shí)體標(biāo)簽列表(如[["PER", "O", "O"], ...]
)。
- 輸出:
tokenized_inputs
: 分詞后的模型輸入(包含input_ids
,attention_mask
等)。labels
: 與模型輸出對(duì)齊的標(biāo)簽(將原始標(biāo)簽映射到分詞后的子詞位置)。
-100 標(biāo)簽用于在訓(xùn)練期間屏蔽標(biāo)簽,并且對(duì)應(yīng)于在損失計(jì)算過(guò)程中必須跳過(guò)的標(biāo)記。
微調(diào) BERT
讓我們使用 PyTorch 框架設(shè)置數(shù)據(jù)加載器,并定義訓(xùn)練和評(píng)估函數(shù)。此過(guò)程涉及配置優(yōu)化器、設(shè)置學(xué)習(xí)率以及建立微調(diào)循環(huán):
from torch.utils.data import DataLoader from transformers import AdamW train_dataset = encoded_dataset["train"] train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=16) optimizer = AdamW(model.parameters(), lr=5e-5) model.train() for epoch in range(3): # loop over the dataset multiple times for batch in train_dataloader: inputs = {k: v.to(device) for k, v in batch.items() if k != "labels"} labels = batch["labels"].to(device) outputs = model(**inputs, labels=labels) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad()
訓(xùn)練通常需要對(duì) GPU 利用率給予特別關(guān)注。如果具備使用 GPU 的條件,請(qǐng)確保您的模型、輸入數(shù)據(jù)以及優(yōu)化器都已遷移到 GPU 上。
最后總結(jié)
在 PyTorch 中對(duì) BERT 進(jìn)行微調(diào)以用于命名實(shí)體識(shí)別涉及一系列步驟,從加載預(yù)訓(xùn)練的 BERT 分詞器和模型開(kāi)始,到準(zhǔn)備數(shù)據(jù)集、訓(xùn)練,最后使用訓(xùn)練好的模型來(lái)識(shí)別命名實(shí)體。有了合適的數(shù)據(jù)集和適當(dāng)?shù)哪P驼{(diào)整,這種技術(shù)使你能夠利用最先進(jìn)的 NLP 架構(gòu)應(yīng)用于各種實(shí)際場(chǎng)景。
以上就是Pytorch微調(diào)BERT實(shí)現(xiàn)命名實(shí)體識(shí)別的詳細(xì)內(nèi)容,更多關(guān)于Pytorch BERT命名實(shí)體識(shí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python自動(dòng)化之如何利用allure生成測(cè)試報(bào)告
這篇文章主要給大家介紹了關(guān)于python自動(dòng)化之如何利用allure生成測(cè)試報(bào)告的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05PyQt4實(shí)現(xiàn)下拉菜單可供選擇并打印出來(lái)
這篇文章主要為大家詳細(xì)介紹了PyQt4實(shí)現(xiàn)下拉菜單可供選擇并打印出來(lái),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Python編寫Windows Service服務(wù)程序
這篇文章主要為大家詳細(xì)介紹了Python編寫Windows Service服務(wù)程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN
學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)已經(jīng)有一段時(shí)間,從普通的BP神經(jīng)網(wǎng)絡(luò)到LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)都有一定的了解,但是從未系統(tǒng)的把整個(gè)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)記錄下來(lái),我相信這些小記錄可以幫助我更加深刻的理解神經(jīng)網(wǎng)絡(luò)2022-05-05Python機(jī)器學(xué)習(xí)入門(三)之Python數(shù)據(jù)準(zhǔn)備
這篇文章主要介紹了Python機(jī)器學(xué)習(xí)入門知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08python讀取pdf格式文檔的實(shí)現(xiàn)代碼
這篇文章主要給大家介紹了關(guān)于python讀取pdf格式文檔的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04python的數(shù)學(xué)算法函數(shù)及公式用法
在本篇內(nèi)容里小編給大家分享了一篇關(guān)于python的數(shù)學(xué)算法函數(shù)及公式用法,有興趣的朋友們可以參考下。2020-11-11