最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Pytorch微調(diào)BERT實(shí)現(xiàn)命名實(shí)體識(shí)別

 更新時(shí)間:2025年03月20日 11:52:09   作者:夢(mèng)想畫(huà)家  
命名實(shí)體識(shí)別(NER)是自然語(yǔ)言處理(NLP)中的一項(xiàng)關(guān)鍵任務(wù),它涉及識(shí)別和分類(lèi)文本中的關(guān)鍵實(shí)體,BERT是一種強(qiáng)大的語(yǔ)言表示模型,在各種 NLP 任務(wù)中顯著提高了性能,包括 NER,在本文中,我們將展示如何使用 PyTorch 對(duì)預(yù)訓(xùn)練的 BERT 模型進(jìn)行微調(diào),以用于 NER 任務(wù)

環(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表示我們希望分類(lèi)的實(shí)體類(lèi)型的數(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í)體類(lèi)型

數(shù)據(jù)集中定義了以下 4 種實(shí)體類(lèi)型:

  • 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í)體類(lèi)型。
  • 數(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_idsattention_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使用Websocket推送數(shù)據(jù)實(shí)例

    Python使用Websocket推送數(shù)據(jù)實(shí)例

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,上述HTML和Python文件可能用于建立WebSocket服務(wù)器,實(shí)現(xiàn)客戶端與服務(wù)器之間的實(shí)時(shí)通信
    2023-05-05
  • python實(shí)現(xiàn)兩字符串映射

    python實(shí)現(xiàn)兩字符串映射

    這篇文章主要介紹了python實(shí)現(xiàn)兩字符串映射方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python 多線程將大文件分開(kāi)下載后在合并的實(shí)例

    python 多線程將大文件分開(kāi)下載后在合并的實(shí)例

    今天小編就為大家分享一篇python 多線程將大文件分開(kāi)下載后在合并的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • Python單元測(cè)試unittest的具體使用示例

    Python單元測(cè)試unittest的具體使用示例

    本篇文章主要介紹了Python單元測(cè)試unittest,詳細(xì)的介紹了unittest的概念和簡(jiǎn)單的使用示例,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • Python入門(mén)及進(jìn)階筆記 Python 內(nèi)置函數(shù)小結(jié)

    Python入門(mén)及進(jìn)階筆記 Python 內(nèi)置函數(shù)小結(jié)

    這篇文章主要介紹了Python的內(nèi)置函數(shù)小結(jié),需要的朋友可以參考下
    2014-08-08
  • 解決python 輸出是省略號(hào)的問(wèn)題

    解決python 輸出是省略號(hào)的問(wèn)題

    下面小編就為大家分享一篇解決python 輸出是省略號(hào)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • Python使用PEfile模塊實(shí)現(xiàn)分析PE文件

    Python使用PEfile模塊實(shí)現(xiàn)分析PE文件

    PeFile模塊是Python中一個(gè)強(qiáng)大的便攜式第三方PE格式分析工具,用于解析和處理Windows可執(zhí)行文件,本文主要就來(lái)講講如何使用PEfile模塊實(shí)現(xiàn)分析PE文件,需要的可以參考下
    2023-08-08
  • 使用Python手寫(xiě)一個(gè)智能PDF文檔助手

    使用Python手寫(xiě)一個(gè)智能PDF文檔助手

    你是否想親手打造一個(gè)屬于自己的AI工具?是否想過(guò)用不到100行代碼就能實(shí)現(xiàn)一個(gè)智能聊天機(jī)器人,本文將帶你從零開(kāi)始,手寫(xiě)一個(gè)實(shí)用的AI小工具——智能PDF文檔助手,需要的朋友可以參考下
    2026-03-03
  • Python Scrapy多頁(yè)數(shù)據(jù)爬取實(shí)現(xiàn)過(guò)程解析

    Python Scrapy多頁(yè)數(shù)據(jù)爬取實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了Python Scrapy多頁(yè)數(shù)據(jù)爬取實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Python ellipsis 的用法詳解

    Python ellipsis 的用法詳解

    這篇文章主要介紹了Python ellipsis 的用法詳解,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論

恭城| 大名县| 阿城市| 松江区| 中超| 宜丰县| 彭水| 依安县| 广元市| 思南县| 达拉特旗| 凌源市| 临泉县| 自治县| 米脂县| 牡丹江市| 丹江口市| 顺义区| 车致| 临西县| 龙陵县| 高邑县| 社会| 乐东| 陆丰市| 乐平市| 通道| 科技| 安仁县| 伊金霍洛旗| 乌鲁木齐市| 湖北省| 长兴县| 孝义市| 合水县| 松潘县| 天门市| 平潭县| 白山市| 衡阳市| 赫章县|