01 研究背景与任务目标
专利文本自动分类是知识产权领域的重要研究课题。本文分享完整的Python代码,实现基于BERT模型对专利摘要进行多标签分类,自动识别专利涉及的"直接节约"和"自动化替代"两个技术维度。
技术栈:
- • 核心框架:Hugging Face Transformers
- • 预训练模型:ERNIE 3.0 Base中文版
- • 任务类型:多标签分类(Multi-label Classification)
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条
数据统计结果:
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 训练结果
最终模型性能:
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 | | |
| | | |
| learning_rate + warmup_proportion | | |
| | | |
07 总结
本项目实现了:1.数据层面:多标签分层采样,保证数据分布一致性2.模型层面:使用ERNIE 3.0中文预训练模型,适配专利文本特点3.任务层面:采用Sigmoid激活函数,正确处理多标签分类4.评估层面:提供微观F1等多标签专用评估指标
创新点:
欢迎在评论区交流自然语言处理技术在知识产权领域的应用!
代码领取方式
转发本推文到朋友圈
添加客服
发送代码编号
发送保留2小时并集齐10个点赞的截图
即可免费领取代码