bert中文使用总结

目录

一、bert的中文模型:

1.chinese_L-12_H-768_A-12

2.chinese_wwm_ext_pytorch

二、将google谷歌bert预训练模型转换为pytorch版本

1.运行脚本,得到pytorch_model.bin文件

2.写代码使用transformers调用bert模型

三、bert-as-service

1.安装方法

2.启动bert服务

3.在客服端获取词向量

四 使用bert做文本分类

参考链接


一、bert的中文模型:

1.chinese_L-12_H-768_A-12

这个是谷歌google发布的唯一一个中文模型,可以在google官网上下载该模型,如下图。

下载后,包含如下图所示的几个文件:

google开源了bert源码,并且要求是tensorflow的版本是1.11.0,因此可以训练模型进行微调。

2.chinese_wwm_ext_pytorch

这个是哈工大讯飞联合实验室发布的中文预训练bert模型,可以在官网链接下载,我下载的是pytorch版本,如下图红色框。

下载后,包含如下图几个文件:

下载 pytorch 版本的中文bert模型可以使用 transformers 库中的API快速使用bert模型,具体的API可以参考BERT-transformers官网。另外,Transformers is tested on Python 3.6+, and PyTorch 1.1.0+ or TensorFlow 2.0+。详情参考安装链接

注:使用 transformers 运行 bert 模型的时候,要把下载的 pytorch 版的模型的文件名字改一下,即把 bert_config.json 改名为 config.json,Transformers加载Pytorch模型时会自动调用,之后可以通过Transformers正常使用。

如果对transformers不太熟悉,可以看一下

使用BERT中文模型进行新闻文本分类是一个典型的自然语言处理任务。我们将使用Hugging Face的`transformers`库,结合PyTorch或TensorFlow来实现分类任务。 --- ## ✅ 1. 安装依赖 首先确保安装必要的库: ```bash pip install transformers datasets torch scikit-learn pandas ``` --- ## ✅ 2. 加载中文 BERT 模型和 Tokenizer 我们将使用 Hugging Face 提供的 `bert-base-chinese` 模型作为预训练模型。 ```python from transformers import BertTokenizer, BertForSequenceClassification, AdamW, get_scheduler from torch.utils.data import DataLoader from datasets import Dataset import torch import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder import numpy as np ``` --- ## ✅ 3. 数据准备(以CSV格式为例) 假设你有一个CSV文件 `tengxunxinwen.csv`,其中包含以下列: - `正文`:新闻文本 - `标题`:新闻标题(可选) - `标签`:类别标签(如“数字化转型”、“绿色建筑”等) ```python # 读取数据 df = pd.read_csv("tengxunxinwen.csv") # 编码标签 le = LabelEncoder() df["label"] = le.fit_transform(df["标签"]) # 转换为 HuggingFace Dataset dataset = Dataset.from_pandas(df) ``` --- ## ✅ 4. 数据预处理 使用 BERT 的 Tokenizer 对文本进行编码。 ```python tokenizer = BertTokenizer.from_pretrained("bert-base-chinese") def tokenize_function(examples): return tokenizer(examples["正文"], padding="max_length", truncation=True, max_length=128) tokenized_datasets = dataset.map(tokenize_function, batched=True) ``` --- ## ✅ 5. 拆分训练集和验证集 ```python tokenized_datasets = tokenized_datasets.shuffle(seed=42).train_test_split(test_size=0.2) ``` --- ## ✅ 6. 构建数据加载器 ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") train_dataloader = DataLoader(tokenized_datasets["train"], shuffle=True, batch_size=8) eval_dataloader = DataLoader(tokenized_datasets["test"], batch_size=8) # 模型类别数 num_labels = len(le.classes_) model = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=num_labels).to(device) ``` --- ## ✅ 7. 定义优化器和学习率调度器 ```python optimizer = AdamW(model.parameters(), lr=2e-5) num_epochs = 3 num_training_steps = num_epochs * len(train_dataloader) lr_scheduler = get_scheduler( name="linear", optimizer=optimizer, num_warmup_steps=0, num_training_steps=num_training_steps ) ``` --- ## ✅ 8. 训练循环 ```python from tqdm.auto import tqdm import evaluate metric = evaluate.load("accuracy") model.train() for epoch in range(num_epochs): progress_bar = tqdm(range(len(train_dataloader))) for batch in train_dataloader: batch = {k: v.to(device) for k, v in batch.items()} outputs = model(input_ids=batch["input_ids"], attention_mask=batch["attention_mask"], labels=batch["label"]) loss = outputs.loss loss.backward() optimizer.step() lr_scheduler.step() optimizer.zero_grad() progress_bar.update(1) # 验证阶段 model.eval() for batch in eval_dataloader: batch = {k: v.to(device) for k, v in batch.items()} with torch.no_grad(): outputs = model(input_ids=batch["input_ids"], attention_mask=batch["attention_mask"]) logits = outputs.logits predictions = torch.argmax(logits, dim=-1) metric.add_batch(predictions=predictions, references=batch["label"]) accuracy = metric.compute()["accuracy"] print(f"Epoch {epoch + 1} Accuracy: {accuracy:.4f}") model.train() ``` --- ## ✅ 9. 保存模型和标签编码器 ```python model.save_pretrained("./bert_news_classifier") tokenizer.save_pretrained("./bert_news_classifier") # 保存标签编码器 import joblib joblib.dump(le, "./label_encoder.pkl") ``` --- ## ✅ 10. 使用模型进行预测 ```python from transformers import BertTokenizer, BertForSequenceClassification import torch import joblib # 加载模型和标签编码器 model = BertForSequenceClassification.from_pretrained("./bert_news_classifier").to("cuda" if torch.cuda.is_available() else "cpu") tokenizer = BertTokenizer.from_pretrained("./bert_news_classifier") le = joblib.load("./label_encoder.pkl") def predict(text): inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=128).to(device) with torch.no_grad(): logits = model(**inputs).logits predicted_class_id = torch.argmax(logits, dim=-1).item() return le.inverse_transform([predicted_class_id])[0] # 示例预测 print(predict("中国建筑正在推进数字化转型,提升工程效率")) ``` --- ## ✅ 11. 提升性能的建议 - 使用 `Trainer` API(简化训练流程): ```bash pip install transformers[torch] ``` 然后使用 `Trainer` 类封装训练逻辑。 - 使用 `DataParallel` 或 `DistributedDataParallel` 进行多GPU训练。 - 使用 `transformers` 的 `TextClassificationPipeline` 快速构建预测管道。 --- ## ✅ 12. 模型评估指标 可以使用以下指标评估分类效果: ```python from sklearn.metrics import classification_report # 获取预测和真实标签 all_preds = [] all_labels = [] model.eval() for batch in eval_dataloader: batch = {k: v.to(device) for k, v in batch.items()} with torch.no_grad(): outputs = model(**batch) logits = outputs.logits preds = torch.argmax(logits, dim=-1) all_preds.extend(preds.cpu().numpy()) all_labels.extend(batch["label"].cpu().numpy()) # 输出分类报告 print(classification_report(all_labels, all_preds, target_names=le.classes_)) ``` --- ## ✅ 总结 你现在已经完成了一个完整的中文新闻分类流程: 1. 数据加载与预处理 2. 使用 BERT 进行文本编码 3. 模型训练与评估 4. 模型保存与部署 5. 实时预测接口 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值