中文工单分类模型选择

发布于:2025-06-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

采用 基于预训练模型的微调(Fine-tuning) 方案来做中文工单分类,这是非常明智的选择,因为预训练模型已经在大量中文语料上学习了丰富的语言知识,能大幅提升分类效果。

在 Hugging Face 上,针对中文文本分类,我为你推荐以下最合适的模型:


最推荐的模型:BERT-base-chinese

  • 模型名称 (Hugging Face ID): google-bert/bert-base-chinese
为什么推荐它?
  1. 官方中文BERTbert-base-chinese 是 Google 官方发布的针对中文的 BERT 模型。它是在大规模中文语料上进行预训练的,因此对中文的语言结构、词汇和语义有非常好的理解。
  2. 基线性能优秀:作为 BERT 系列的基础模型,它在各类中文 NLP 任务(包括文本分类)上都能达到非常高的基线性能。对于你的工单分类任务,它能很好地区分不同类别工单的细微语义差异。
  3. 广泛应用与社区支持:这个模型被广泛应用于中文 NLP 领域,有大量的教程、案例和社区支持。这意味着你在学习和实践过程中,遇到问题更容易找到解决方案。
  4. 计算资源适中:相比于更大的模型(如 bert-large-chinese 或一些更复杂的 XLNet/RoBERTa/ERNIE 模型),bert-base-chinese 的参数量适中,对计算资源(GPU 内存)的要求相对较低,训练时间也更容易接受,非常适合初学者和一般规模的项目。
如何使用它进行微调?

Hugging Face 的 transformers 库为微调提供了极其便捷的接口。以下是大致的步骤:

  1. 安装库:
    pip install transformers datasets accelerate evaluate torch
    
  2. 加载模型和分词器:
    你需要加载 bert-base-chinese 对应的分词器 (Tokenizer) 和带有分类头的模型 (Sequence Classification Model)。
    from transformers import AutoTokenizer, AutoModelForSequenceClassification
    import torch
    
    # 加载分词器
    tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-chinese")
    
    # 加载模型,这里num_labels就是你的类别数量(3个类别:普通工单、货车司机工单、滴滴司机工单)
    # 如果你的类别数量不确定,可以先用一个默认值,之后会根据数据集自动调整
    model = AutoModelForSequenceClassification.from_pretrained("google-bert/bert-base-chinese", num_labels=3)
    
  3. 数据预处理:
    将你的工单文本数据转换为模型可以接受的输入格式。这包括分词、转换为 token ID、添加特殊 token (如 [CLS][SEP])、以及截断或填充到固定长度。
    from datasets import Dataset
    
    # 假设你的数据是这样的列表
    # complaints = ["这是一个普通工单,关于网络故障。", "司机说他找不到地方,他是货车司机。", "滴滴司机遇到了乘客问题,需要处理。", ...]
    # labels = [0, 1, 2, ...] # 0: 普通, 1: 货车, 2: 滴滴
    
    # 构建Hugging Face Dataset对象
    # 示例数据(请替换为你的真实数据)
    data = {
        "text": [
            "这是一个关于网络故障的普通工单。",
            "货车司机报告车辆出现问题。",
            "滴滴司机需要处理乘客投诉。",
            "新设备安装请求。",
            "运输过程中货物损坏,货车司机寻求帮助。",
            "滴滴打车软件出现bug。",
        ],
        "label": [0, 1, 2, 0, 1, 2], # 0:普通,1:货车司机,2:滴滴司机
    }
    raw_dataset = Dataset.from_dict(data)
    
    def tokenize_function(examples):
        return tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128) # max_length可以根据你的文本长度调整
    
    tokenized_dataset = raw_dataset.map(tokenize_function, batched=True)
    
    # 划分训练集和测试集
    train_test_split = tokenized_dataset.train_test_split(test_size=0.2)
    train_dataset = train_test_split["train"]
    eval_dataset = train_test_split["test"]
    
  4. 配置训练参数:
    使用 TrainingArguments 类来配置训练过程,包括学习率、批次大小、训练轮次等。
    from transformers import TrainingArguments, Trainer
    import numpy as np
    import evaluate
    
    # 定义评估指标
    metric = evaluate.load("accuracy") # 或 "f1", "precision", "recall"
    
    def compute_metrics(eval_pred):
        logits, labels = eval_pred
        predictions = np.argmax(logits, axis=-1)
        return metric.compute(predictions=predictions, references=labels)
    
    training_args = TrainingArguments(
        output_dir="./results",          # 输出目录
        num_train_epochs=3,              # 训练轮次
        per_device_train_batch_size=8,   # 训练批次大小
        per_device_eval_batch_size=8,    # 评估批次大小
        warmup_steps=500,                # 学习率预热步数
        weight_decay=0.01,               # 权重衰减
        logging_dir="./logs",            # 日志目录
        logging_steps=100,
        evaluation_strategy="epoch",     # 每个epoch结束后评估
        save_strategy="epoch",           # 每个epoch结束后保存模型
        load_best_model_at_end=True,     # 训练结束后加载最佳模型
        metric_for_best_model="accuracy", # 依据准确率选择最佳模型
    )
    
  5. 开始训练:
    使用 Trainer 类来启动模型的训练。
    trainer = Trainer(
        model=model,
        args=training_args,
        train_dataset=train_dataset,
        eval_dataset=eval_dataset,
        compute_metrics=compute_metrics,
    )
    
    trainer.train()
    
  6. 进行预测:
    训练完成后,你可以用训练好的模型对新的工单文本进行分类。
    # 示例预测
    text_to_classify = "货车司机反映导航不准确,导致送货延误。"
    inputs = tokenizer(text_to_classify, return_tensors="pt", truncation=True, padding="max_length", max_length=128)
    
    # 将输入移到与模型相同的设备(CPU 或 GPU)
    if torch.cuda.is_available():
        inputs = {k: v.to("cuda") for k, v in inputs.items()}
        model.to("cuda")
    
    with torch.no_grad():
        outputs = model(**inputs)
    
    # 获取预测结果
    logits = outputs.logits
    predicted_class_id = torch.argmax(logits, dim=-1).item()
    
    # 将类别ID映射回类别名称
    class_labels = {0: "普通工单", 1: "货车司机工单", 2: "滴滴司机工单"}
    predicted_label = class_labels[predicted_class_id]
    
    print(f"工单文本: '{text_to_classify}'")
    print(f"预测类别: {predicted_label}")
    

其他值得考虑的模型(进阶)
  • hfl/chinese-roberta-wwm-ext: 这是哈工大讯飞联合实验室 (HFL) 发布的 RoBERTa 变体,使用了全词覆盖 (Whole Word Masking) 策略进行预训练,在中文任务上通常比原版 BERT 表现更好。如果你在 bert-base-chinese 上遇到了瓶颈,或者对性能有更高要求,可以尝试这个模型。
  • nghuyong/ernie-3.0-base-zh: 这是百度文心ERNIE 3.0 的基础模型版本,ERNIE 在预训练时融入了知识增强技术,在中文理解任务上表现优异。

选择建议:对于你的入门和特定三分类任务,google-bert/bert-base-chinese 是最稳妥、最易于上手的选择。它的性能足以应对大多数文本分类需求,且学习资源丰富。

你可以先从 google-bert/bert-base-chinese 开始,熟练掌握微调的流程后,再尝试其他性能更强的模型来进一步提升效果。


网站公告

今日签到

点亮在社区的每一天
去签到