当前位置:首页>java>【F0001】顶刊复现代码:基于BERT的专利文本多标签分类实战:从数据准备到模型训练全流程

【F0001】顶刊复现代码:基于BERT的专利文本多标签分类实战:从数据准备到模型训练全流程

  • 2026-10-14 11:15:21
【F0001】顶刊复现代码:基于BERT的专利文本多标签分类实战:从数据准备到模型训练全流程

01 研究背景与任务目标

专利文本自动分类是知识产权领域的重要研究课题。本文分享完整的Python代码,实现基于BERT模型对专利摘要进行多标签分类,自动识别专利涉及的"直接节约"和"自动化替代"两个技术维度。

技术栈:

  • • 核心框架:Hugging Face Transformers
  • • 预训练模型:ERNIE 3.0 Base中文版
  • • 任务类型:多标签分类(Multi-label Classification)
  • • 开发环境:Python + PyTorch

02 数据准备与预处理

数据加载与清洗

import pandas as pdfrom pathlib import Pathdefread_data(file_path):"""根据文件扩展名读取数据为DataFrame"""    path = Path(file_path)    file_ext = path.suffix.lower()match file_ext[1:]:case"xlsx"|"xls":return pd.read_excel(file_path)case"csv":return pd.read_csv(file_path) case"dta":return pd.read_stata(file_path)case _:raise ValueError(f"不支持的文件格式:{file_ext}")# 加载数据df = read_data("./data/patent_data_set.csv")df.dropna(inplace=True)  # 删除空值print(f"数据形状: {df.shape}")  # 输出: (1500, 3)

多标签分层分割

from iterstrat.ml_stratifiers import MultilabelStratifiedShuffleSplit# 准备特征和标签X = df['摘要'].valuesy = df[['label1','label2']].values# 第一次分割:80%训练集,20%临时集msss = MultilabelStratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)for train_index, temp_index in msss.split(X, y):    train_df = df.iloc[train_index]  # 1200条    temp_df = df.iloc[temp_index]    # 300条# 第二次分割:临时集平分为验证集和测试集X_temp = temp_df['摘要'].valuesy_temp = temp_df[['label1','label2']].valuesmsss_val = MultilabelStratifiedShuffleSplit(n_splits=1, test_size=0.5, random_state=42)for val_index, test_index in msss_val.split(X_temp, y_temp):    dev_df = temp_df.iloc[val_index]   # 150条    test_df = temp_df.iloc[test_index] # 150条

数据统计结果:

  • • 训练集大小:1200条
  • • 验证集大小:150条
  • • 测试集大小:150条
  • • 标签分布一致

03 模型构建与训练

模型加载与配置

import osfrom transformers import AutoModelForSequenceClassification, AutoTokenizer# 设置国内镜像源os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"# 加载ERNIE 3.0 Base中文模型REPO_ID = "nghuyong/ernie-3.0-xbase-zh"LOCAL_MODEL_DIR = "./models/ernie-3.0-base-zh"tokenizer = AutoTokenizer.from_pretrained(LOCAL_MODEL_DIR)model = AutoModelForSequenceClassification.from_pretrained(    LOCAL_MODEL_DIR,     num_labels=2,  # 两个标签    problem_type="multi_label_classification"# 多标签分类)

数据预处理函数

defpreprocess_function(examples):"""多标签分类数据预处理"""    tokenized = tokenizer(examples["摘要"], truncation=True, max_length=512)# 构建多标签向量:将两个标签转换为float类型    labels_matrix = []for d1, d2 inzip(examples["label1"], examples["label2"]):        labels_matrix.append([float(d1), float(d2)])  # 关键步骤    tokenized["labels"] = labels_matrixreturn tokenized# 应用预处理tokenized_train = train_ds.map(preprocess_function, batched=True)tokenized_dev = dev_ds.map(preprocess_function, batched=True)

训练参数配置

training_args = TrainingArguments(    output_dir="./checkpoints",    learning_rate=4e-5,          # 学习率    per_device_train_batch_size=10,  # 批处理大小    num_train_epochs=5,          # 训练轮数    weight_decay=0.01,          # 权重衰减    eval_strategy="epoch",       # 每轮评估    save_strategy="epoch",       # 每轮保存    load_best_model_at_end=True, # 加载最佳模型    metric_for_best_model="accuracy")

04 训练结果

最终模型性能:

指标/维度
精确率
召回率
F1值
样本量
定义1:直接节约
0.880
0.957
0.917
46
定义2:自动化替代
0.929
0.956
0.942
68
整体/宏平均
0.904
0.956
0.929
114

05 模型推理与应用

单条文本预测函数:

defpredict_multi_label(text: str, threshold: float = 0.5):"""多标签预测函数"""    inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=512)    inputs = {k: v.to(model.device) for k, v in inputs.items()}with torch.no_grad():        outputs = model(**inputs)        probabilities = torch.sigmoid(outputs.logits)[0]  # 使用Sigmoid    results = {}    labels = ["定义1(直接节约)", "定义2(自动化替代)"]for i, label inenumerate(labels):        prob = probabilities[i].item()        results[label] = {"probability": f"{prob:.2%}","is_detected": prob >= threshold        }return results# 示例预测text = "本实用新型公开了一种熔模脱模装置,包括耐火砖底座、模具..."result = predict_multi_label(text)print(result)# 输出: {'定义1(直接节约)': {'probability': '99.86%', 'is_detected': True}, #        '定义2(自动化替代)': {'probability': '2.50%', 'is_detected': False}}

06 超参数调优指南

针对不同情况的调优策略:

问题现象
调整参数
建议值
原理说明
显存不足
per_device_train_batch_size
10→8→4→2
减小批处理大小降低显存占用
模型不收敛
learning_rate
4e-5→2e-5→8e-6
降低学习率避免震荡
学习缓慢
learning_rate + warmup_proportion
增加学习率,减少预热比例
提高学习效率
过拟合
weight_decay + epochs
0.01→0.05,提前停止
增加正则化,早停策略

07 总结

本项目实现了:1.数据层面:多标签分层采样,保证数据分布一致性2.模型层面:使用ERNIE 3.0中文预训练模型,适配专利文本特点3.任务层面:采用Sigmoid激活函数,正确处理多标签分类4.评估层面:提供微观F1等多标签专用评估指标

创新点:

  • • 针对专利文本的专业领域适配
  • • 完整的多标签分类解决方案
  • • 详细的错误分析和调优指南

代码领取方式

关注公众号,后台回复“F0001”关键词即可免费获取完整资料!

资料包福利

关注【数智实证宝典】,对话框回复下列【关键词】,领取相关资料

回复“0001”,获取大语言模型驱动的社科数据挖掘范式重构资料;

回复“0002”,获取中文顶刊最新发表的“大语言模型”论文汇总表;

回复“0003”,获取英文顶刊最新发表的“大语言模型”论文汇总表;

回复“F0001”,获取顶刊复现代码:基于BERT的专利文本多标签分类实战

回复“F0002”,获取顶刊复现代码:基于FinBERT与DeepSeek的企业数字技术风险暴露程度衡量;

最新文章

随机文章