【BERT_Pretrain】Wikipedia_Bookcorpus數據預處理(二)

上一篇介紹了wikipedia和bookcopus數據集,這一篇主要講一下如何預處理數據,使其可以用于BERT的Pretrain任務MLM和NSP。

MLM是類似于完形填空的任務,NSP是判斷兩個句子是否連著。因此數據預處理的方式不同。首先,拿到原始數據集,兩個數據集都是段落,因此要分成單句。然后,有了單句針對不同任務進行預處理。BERT原文的原始做法是。將數據集按照NSP任務預處理,再進行mask,得到MLM任務的數據。

段落變單句

利用nltk包分開句子。(代碼接上一篇)

# pargraph->sentences
import nltk
from nltk.tokenize import sent_tokenizetry:sent_tokenize("Test sentence.")  # 嘗試使用以觸發錯誤
except LookupError:nltk.download('punkt')  # 自動下載所需資源nltk.download('punkt_tab')#'''
#test
#'''
text = "This is the first sentence. This is the second sentence."# 直接使用
sentences = sent_tokenize(text)
print(sentences)
print('success!')

將全部數據段落分成句子。

def preprocess_text(text):sentences = sent_tokenize(text)sentences = [s.strip() for s in sentences if len(s.strip()) > 10] #只有去除空白后長度超過 10 的句子才會被保留return sentencesdef preprocess_examples(examples):processed_texts = []for text in examples["text"]:processed_texts.extend(preprocess_text(text))return {"sentences": processed_texts}processed_dataset = dataset.map(preprocess_examples,batched=True,	#批量處理remove_columns=dataset.column_names,	#相當于keynum_proc=4  #CPU并行處理
)

打印出一些處理后數據的信息。

print(type(processed_dataset))
print(processed_dataset.num_rows)
print(processed_dataset.column_names)
print(processed_dataset.shape)

NSP+MLM數據預處理

from transformers import BertTokenizer
import random# 加載分詞器
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')def create_nsp_mlm_examples(examples):input_ids = []token_type_ids = []attention_mask = []next_sentence_label = []masked_lm_labels = []sentences = examples["sentences"]#NSPfor i in range(len(sentences) - 1):if random.random() > 0.5:text_a = sentences[i]text_b = sentences[i + 1]label = 1else:text_a = sentences[i]text_b = random.choice(sentences)while text_b == sentences[i + 1]:  # 防止隨機到了真實下一句text_b = random.choice(sentences)label = 0# 用分詞器將兩個句子拼接encoded = tokenizer(text_a,text_b,max_length=512,truncation=True,padding=False, # ‘max_length’	# 這里選的不帶padding,可以減少一部分內存占用return_tensors='pt')#MLMinput_id_list = encoded['input_ids'][0].tolist()mlm_labels = [0] * len(input_id_list)# 由于要添加mask,先指定沒有添加mask的時候是0(huggingface這里設置的是-100)special_token_ids = {tokenizer.cls_token_id, tokenizer.sep_token_id, tokenizer.pad_token_id}candidate_indices = [i for i, t_id in enumerate(input_id_list) if t_id not in special_token_ids]num_to_mask = max(1, int(len(candidate_indices) * 0.15))#句子中15%的隨機mask_indices = random.sample(candidate_indices, min(512, num_to_mask))for idx in mask_indices:original_token = input_id_list[idx]mlm_labels[idx] = original_tokenprob = random.random()if prob < 0.8:#80%為maskinput_id_list[idx] = tokenizer.mask_token_idelif 0.8 <= prob < 0.9:#10%為隨機input_id_list[idx] = random.randint(0, tokenizer.vocab_size - 1)# 10%保留原 token,不變input_ids.append(input_id_list)token_type_ids.append(encoded['token_type_ids'][0].tolist())attention_mask.append(encoded['attention_mask'][0].tolist())next_sentence_label.append(label)masked_lm_labels.append(mlm_labels)return {"input_ids": input_ids,"token_type_ids": token_type_ids,"attention_mask": attention_mask,"next_sentence_labels": next_sentence_label,"masked_lm_labels": masked_lm_labels}
# 將整個數據集處理一遍(耗時很長)
final_dataset = processed_dataset.map(create_nsp_mlm_examples,batched=True,remove_columns=processed_dataset.column_names,num_proc=4
)
#保存
final_dataset.save_to_disk("data_processed_nsp_mlm4gb", max_shard_size="4GB")

我這里的邏輯是,先預處理數據,再保存預處理數據直接用于訓練,但是也可以一邊訓練一邊預處理數據(尤其是你的磁盤大小不夠保存額外數據集的情況)。

注意,上文padding由于選擇了False,因此在用Dataloader包裹這個數據會遇到問題,因為torch.stack不能連接形狀不一樣的tensor,因此Dataloader里面的collate_fn還需要重寫。(下一章介紹)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87363.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87363.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87363.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能-基礎篇-14-知識庫和知識圖譜介紹(知識庫是基石、知識圖譜是增強語義理解的知識庫、結構化數據和非結構化數據區分)

在人工智能&#xff08;AI&#xff09;領域&#xff0c;知識圖譜&#xff08;Knowledge Graph&#xff09;和知識庫&#xff08;Knowledge Base&#xff09;是兩種重要的知識表示和管理技術&#xff0c;它們的核心目標是通過結構化的方式組織信息&#xff0c;從而支持智能系統的…

7月1日作業

思維導圖 一、將當前的時間寫入到time.txt的文件中&#xff0c;如果ctrlc退出之后&#xff0c;在再次執行支持斷點續寫 1.2022-04-26 19:10:20 2.2022-04-26 19:10:21 3.2022-04-26 19:10:22 //按下ctrlc停止&#xff0c;再次執行程序 4.2022-04-26 20:00:00 5.2022-04-26 20:0…

DHCP中繼及動態分配

DHCP中繼 在多 VLAN 網絡中為什么不能直接用 DHCP&#xff1f; 比如你現在的網絡是&#xff1a;PC 在 VLAN10、VLAN20 中DHCP服務器&#xff08;Router0&#xff09;在另一個網段&#xff08;比如 192.168.100.0/24&#xff09;PC 的 DHCP Discover 是廣播&#xff0c;無法跨越…

ROS 概述與環境搭建

1. ROS 簡介 1.1 ROS 誕生背景 機器人是一種高度復雜的系統性實現&#xff0c;機器人設計包含了機械加工、機械結構設計、硬件設計、嵌入式軟件設計、上層軟件設計....是各種硬件與軟件集成&#xff0c;甚至可以說機器人系統是當今工業體系的集大成者。 機器人體系是相當龐大的…

mac python3.13 selenium安裝使用

一、安裝 # 進入虛擬環境 workon xxxx pip install selenium二、安裝驅動 查詢自己瀏覽器版本 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --versionGoogle Chrome 138.0.7204.93下載對應的驅動&#xff0c;其他版本 sudo mv ~/Downloads/chromedr…

AI 開發平臺:中小企業的創新破局點在哪里?

在浙江義烏的一個小商品加工廠里&#xff0c;老板王建國最近有點煩。訂單量忽高忽低&#xff0c;原材料價格波動不定&#xff0c;他想通過數據分析提前規劃生產&#xff0c;卻苦于沒有專業的技術團隊&#xff1b;在廣東東莞的一家電子配件公司&#xff0c;業務員李娜每天要處理…

.NET 8.0 Redis 教程

一、環境準備 1. 安裝 Redis 服務器 Windows/macOS/Linux&#xff1a;使用 Docker 快速部署 bash docker run -d --name redis -p 6379:6379 redisLinux&#xff1a;直接安裝 bash sudo apt-get install redis-server sudo systemctl start redis-server2. 創建 .NET 項目 b…

2025年游戲鼠標推薦,游戲鼠標推薦,打CSGO(羅技、雷蛇、卓威、ROG、漫步者、賽睿、達爾優)

可能很多人對于游戲鼠標的了解還是不夠深&#xff0c;會有很多疑問&#xff0c;比如&#xff1a;“游戲鼠標和辦公鼠標的區別”、“游戲鼠標無線好還是有線好”等等一系列的問題&#xff0c;本文將會介紹游戲鼠標領域處于領先地位的幾個廠家&#xff1a;羅技鼠標、雷蛇鼠標、賽…

OpenCV CUDA模塊設備層-----在 GPU上高效地執行兩個uint類型值的最小值比較函數vmin2()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的CUDA模塊&#xff08;cudev&#xff09; 中的一個設備端內聯函數&#xff0c;用于在GPU上高效地執行兩個uint類型值的最小值比較。 該函…

Web3與傳統網絡安全模型對比:關鍵差異解析

隨著互聯網技術的飛速發展&#xff0c;Web3的概念逐漸成為人們關注的焦點。Web3代表著一個更加去中心化、安全和用戶友好的網絡環境。與傳統的網絡安全模型相比&#xff0c;Web3在多個方面展現出了其獨特的優勢和特點。本文將深入探討Web3與傳統網絡安全模型之間的關鍵差異。 …

FLAN:微調語言模型是 Zero-Shot 學習者

摘要 本文探討了一種簡單的方法來提升語言模型的零樣本學習能力。我們展示了指令微調——即在通過指令描述的數據集集合上對語言模型進行微調——能夠顯著提升模型在未見任務上的零樣本表現。 我們以一個擁有1370億參數的預訓練語言模型為基礎&#xff0c;在60多個通過自然語…

springboot中的事件發布和監聽

事件定義 創建一個自定義事件類 UserLoginEvent&#xff0c;繼承 ApplicationEvent&#xff0c;用于攜帶用戶登錄信息&#xff1a; import org.springframework.context.ApplicationEvent;public class UserLoginEvent extends ApplicationEvent { //關鍵點1&#xff1a;ext…

“開源雙軌架構+40億參數擴散Transformer——ComfyUI-OmniGen2本地部署教程:重塑多模態生成的效率邊界!

一、簡介 OmniGen2 是由北京智源研究院最新推出的一個強大、高效的開源多模態生成模型。與 OmniGen v1 不同&#xff0c;OmniGen2 具有兩種不同的文本和圖像模態解碼路徑&#xff0c;利用非共享參數和解耦的圖像分詞器。OmniGen2 在四個主要功能方面具有競爭力的性能&#xff…

Java的SpringAI+Deepseek大模型實戰之會話記憶

文章目錄 背景項目環境實現步驟第一步、定義會話存儲方式方式一、定義記憶存儲ChatMemory方式二、注入記憶存儲ChatMemory 第二步、配置會話記憶方式一、老版本實現方式二、新版本實現 第三步、存儲會話信息 異常處理1、InMemoryChatMemory 無法解析 背景 前兩期【環境搭建】和…

RDS MySQL vs. Aurora MySQL:高需求工作負載的終極遷移指南

在 AWS 上&#xff0c;開發團隊最常見且關鍵的決策之一就是選擇合適的關系型數據庫。通常&#xff0c;討論會從 RDS for MySQL 這個可靠且熟悉的“老黃牛”開始。但很快&#xff0c;就會有人提到一個更強大、更云原生的選項&#xff1a;Aurora MySQL。 也許&#xff0c;就像最…

使用倉頡編程語言是一種怎樣的體驗?

2024年6月21日下午&#xff0c;華為終端BG軟件部總裁龔體先生在華為開發者大會主題演講《鴻蒙原生應用&#xff0c;全新出發&#xff01;》中向全球開發者介紹了華為自研倉頡編程語言&#xff0c;并發布了HarmonyOS NEXT倉頡語言開發者預覽版。這是華為首次公開倉頡編程語言。 …

Qt Creator自定義控件開發流程

Qt Creator自定義控件開發流程 在 Qt 5.9 Creator 中開發自定義控件的完整流程如下&#xff0c;分為設計、實現、集成和測試四個階段&#xff1a; 1. 創建自定義控件類 (1) 新建類文件 右鍵項目 → 添加新文件 → C Class基類選擇 QWidget 或現有控件&#xff08;如 QPushBu…

翻譯《The Old New Thing》- 如何創建一個與屏幕大小相同的窗口,而不會被當作全屏窗口處理?

How can I create a window the size of the screen without it being treated as a fullscreen window? - The Old New Thinghttps://devblogs.microsoft.com/oldnewthing/20250522-00/?p111211 問題描述 任務欄允許全屏窗口覆蓋它。這樣&#xff0c;當你在放映幻燈片或進行…

深分頁末日救星:MySQL延遲關聯原理與實戰手冊

MySQL 深分頁&#xff08;如 LIMIT 100000, 10&#xff09;本質是 高代價的偏移量掃描&#xff0c;可通過以下方案優化&#xff0c;附核心原理和實操示例&#xff1a; 一、深分頁為什么慢&#xff1f; SELECT * FROM orders ORDER BY id DESC LIMIT 100000, 10; 執行過程&…

前端技術棧 —— HTML、CSS和JavaScirpt執行環境

以下內容由GLM回答生成&#xff0c;不保證正確性。 前端技術棧 —— HTML、CSS和JavaScirpt執行環境 JavaScript 的執行環境HTML 和 CSS 的執行環境HTML 和 CSS 是否可以在其他環境中執行&#xff1f;總結 JavaScript 是一種 解釋型語言&#xff0c;但它也可以被編譯。JavaScr…