1. 了解 GujiRoBERTa_jian_fan 模型
GujiRoBERTa_jian_fan 是基于 RoBERTa 架构的古籍预训练模型,适用于繁体和简体中文,特别针对古汉语文本进行了训练。该模型能够捕捉古汉语的语言特点,为在古籍上进行下游任务(如文本分类、序列标注等)提供良好的基础。
2. 准备数据集
2.1 数据收集
- 语料来源:收集包含您提到的12类命名实体的古汉语文本,如古籍、医典、史书等。
2.2 数据标注
- 标注工具:使用标注工具(如标注助手、Doccano 等)对收集的文本进行人工标注。
- 标注格式:采用 BIO 或 BIOES 等序列标注格式。
示例(BIO格式):
东岳大帝 来到 泰山 ,观赏 五岳 的 风景 。
B-人名 O B-地名 O O B-地名 O B-地名 O O
标签定义:为每个实体类别定义相应的标签,如:
人名:B-PER、I-PER
地名:B-LOC、I-LOC
书名:B-BOOK、I-BOOK
官职:B-TITLE、I-TITLE
国名:B-COUNTRY、I-COUNTRY
时间:B-TIME、I-TIME
中医疾病:B-TCM-DIS、I-TCM-DIS
证候:B-SYNDROME、I-SYNDROME
方剂:B-PRESCRIPTION、I-PRESCRIPTION
饮片:B-HERB、I-HERB
症状:B-SYMPTOM、I-SYMPTOM
腧穴:B-ACUPOINT、I-ACUPOINT
3. 数据预处理
3.1 分词和标记化
-
使用与模型匹配的分词器进行分词。
-
from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("hsc748NLP/GujiRoBERTa_jian_fan")
3.2 标签编码
-
将实体标签映射为数字 ID,方便模型训练。
label_list = ["O", "B-PER", "I-PER", "B-LOC", "I-LOC", "B-BOOK", "I-BOOK", "B-TITLE", "I-TITLE", "B-COUNTRY", "I-COUNTRY", "B-TIME", "I-TIME", "B-TCM-DIS", "I-TCM-DIS", "B-SYNDROME", "I-SYNDROME", "B-PRESCRIPTION", "I-PRESCRIPTION", "B-HERB", "I-HERB", "B-SYMPTOM", "I-SYMPTOM", "B-ACUPOINT", "I-ACUPOINT"] label_map = {label: idx for idx, label in enumerate(label_list)}
3.3 数据格式转换
- 将标注数据转换为模型输入格式,包括输入 IDs、注意力掩码、标签等。
-
4. 模型微调
4.1 加载预训练模型
使用 Hugging Face Transformers 库加载预训练模型,并指定标签数量。
from transformers import AutoModelForTokenClassification
model = AutoModelForTokenClassification.from_pretrained(
"hsc748NLP/GujiRoBERTa_jian_fan",
num_labels=len(label_list)
)
4.2 设置训练参数
-
定义训练参数,如学习率、批次大小、训练轮次等。
from transformers import TrainingArguments training_args = TrainingArguments( output_dir='./results', num_train_epochs=10, per_device_train_batch_size=16, per_device_eval_batch_size=16, learning_rate=5e-5, evaluation_strategy="steps", logging_steps=100, save_steps=500, weight_decay=0.01, logging_dir='./logs', do_train=True, do_eval=True, )
4.3 构建数据集
-
使用
datasets
库或自定义脚本,将数据加载为模型可训练的数据集。
from torch.utils.data import Dataset
class NERDataset(Dataset):
def __init__(self, texts, labels, tokenizer, label_map):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.label_map = label_map
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
labels = self.labels[idx]
# Tokenize text
encoding = self.tokenizer(
text,
is_split_into_words=True,
return_offsets_mapping=True,
padding='max_length',
truncation=True,
max_length=128,
return_tensors='pt'
)
# Align labels
# ...(对齐标签的代码)
return encoding
4.4 定义评估指标
-
使用
seqeval
库计算实体级别的准确率、召回率和 F1 分数。from seqeval.metrics import accuracy_score, f1_score, precision_score, recall_score def compute_metrics(p): predictions, labels = p predictions = np.argmax(predictions, axis=2) true_labels = [[label_list[label] for label in label_seq] for label_seq in labels] true_predictions = [[label_list[pred] for pred in pred_seq] for pred_seq in predictions] precision = precision_score(true_labels, true_predictions) recall = recall_score(true_labels, true_predictions) f1 = f1_score(true_labels, true_predictions) return { 'precision': precision, 'recall': recall, 'f1': f1, }
4.5 开始训练
-
使用
Trainer
类进行训练和评估。from transformers import Trainer trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, tokenizer=tokenizer, compute_metrics=compute_metrics ) trainer.train()
5. 模型推理与应用
5.1 编写预测函数
-
编写函数对新文本进行实体识别。
def predict(text): tokens = tokenizer.tokenize(text) inputs = tokenizer.encode(text, return_tensors="pt") outputs = model(inputs).logits predictions = torch.argmax(outputs, dim=2) predicted_labels = [label_list[prediction] for prediction in predictions[0].numpy()] return list(zip(tokens, predicted_labels))
5.2 测试模型
-
输入示例文本,查看识别结果。
sentence = "李时珍 著有 《本草纲目》 ,详细记载了多种 中药材 。" result = predict(sentence) for token, label in result: print(f"{token}\t{label}")
输出:
李 B-PER 时 I-PER 珍 I-PER 著 O 有 O 《 O 本 B-BOOK 草 I-BOOK 纲 I-BOOK 目 I-BOOK 》 O , O 详 O 细 O 记 O 载 O 了 O 多 O 种 O 中 B-HERB 药 I-HERB 材 I-HERB 。 O
6. 注意事项
6.1 数据质量
- 标注一致性:确保标注人员对标签定义有统一的理解,避免错误和不一致。
-
6.2 类别不均衡
-
如果某些实体类别的数据较少,可以考虑以下方法:
- 数据增强:使用同义词替换、随机插入等方法增加数据量。
- 损失函数加权:对罕见类别赋予更大的权重。
-
6.3 参数调整
- 根据模型在验证集上的表现,调整学习率、批次大小、训练轮次等超参数。
-
6.4 模型保存与加载
训练完成后,保存模型以便后续加载和使用。
model.save_pretrained('./ner_model')
tokenizer.save_pretrained('./ner_model')
# 加载模型
from transformers import AutoModelForTokenClassification, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('./ner_model')
model = AutoModelForTokenClassification.from_pretrained('./ner_model')
7. 扩展与提升
7.1 使用外部资源
- 词典与知识库:利用古代人物、地名、中医术语词典,辅助识别。
7.2 集成学习
- 结合多个模型的输出,提升识别效果。
7.3 模型优化
- 剪枝与量化:优化模型,提高推理速度。
7.4 部署
- 将模型部署为 API 或集成到应用系统中,方便实际使用。
8. 总结
通过上述步骤,您可以:
- 利用预训练模型:充分发挥 GujiRoBERTa_jian_fan 在古汉语文本处理上的优势。
- 解决特定命名实体识别任务:针对12类实体,进行精细的标注和模型训练。
- 应用于实际场景:将模型部署在相关领域,如古籍数字化、医药文献分析等。