You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NLP初学者使用HuggingFace训练仇恨言论检测模型相关问题咨询

仇恨言论检测流程后续实现建议

先修复原有代码的报错问题

原有代码拆分测试集时使用了未定义的df变量,修改对应行即可:

# 原错误行:test = original_data.loc[~df.index.isin(train.index)]
# 修改为:
test = original_data.loc[~original_data.index.isin(train.index)]

1. 补充分词与数据集格式化操作

你已经初始化了分词器,接下来需要将清洗后的文本转换为模型可接收的输入格式,同时提取标注标签:

# 提取文本和标签(t-davidson数据集class字段:0=仇恨言论,1=冒犯性言论,2=正常言论)
# 此处以二分类仇恨检测为例,仅将标注为0的样本判定为仇恨言论,你也可以直接用3分类
def get_label(class_num):
    return 1 if class_num == 0 else 0

train_texts = train["clean_tweet"].tolist()
train_labels = train["class"].apply(get_label).tolist()
test_texts = test["clean_tweet"].tolist()
test_labels = test["class"].apply(get_label).tolist()

# 分词处理
train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=128)
test_encodings = tokenizer(test_texts, truncation=True, padding=True, max_length=128)

# 封装为HuggingFace Dataset格式,适配Trainer API
import torch
from torch.utils.data import Dataset

class HateSpeechDataset(Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}
        item["labels"] = torch.tensor(self.labels[idx])
        return item

    def __len__(self):
        return len(self.labels)

train_dataset = HateSpeechDataset(train_encodings, train_labels)
test_dataset = HateSpeechDataset(test_encodings, test_labels)

2. 模型训练实现

优先使用HuggingFace的Trainer API,无需手写训练循环,能最快跑通流程:

from transformers import AutoModelForSequenceClassification, TrainingArguments, Trainer

# 加载序列分类模型,二分类任务num_labels设为2,3分类则设为3
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2)

# 配置训练参数,参数设置无需复杂,满足跑通需求即可
training_args = TrainingArguments(
    output_dir="./hate_speech_model",
    per_device_train_batch_size=8,
    per_device_eval_batch_size=8,
    num_train_epochs=2,
    evaluation_strategy="epoch",
    logging_dir="./logs",
    logging_steps=10,
)

# 初始化Trainer
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
)

# 启动训练
trainer.train()

# 训练完成后在测试集评估
eval_result = trainer.evaluate()
print(eval_result)

3. 仇恨推文占比统计实现

可以分别统计真实标注的占比和模型预测结果的占比两类数据:

# 1. 统计训练集、测试集真实仇恨言论占比
train_hate_ratio = train["class"].value_counts(normalize=True).get(0, 0) * 100
test_hate_ratio = test["class"].value_counts(normalize=True).get(0, 0) * 100
print(f"训练集仇恨言论占比:{train_hate_ratio:.2f}%")
print(f"测试集仇恨言论占比:{test_hate_ratio:.2f}%")

# 2. 统计测试集模型预测的仇恨言论占比
predictions = trainer.predict(test_dataset)
pred_labels = predictions.predictions.argmax(axis=1)
pred_hate_count = sum(pred_labels == 1) # 对应之前二分类的仇恨标签
pred_hate_ratio = pred_hate_count / len(pred_labels) * 100
print(f"测试集预测仇恨言论占比:{pred_hate_ratio:.2f}%")

额外跑通优化建议

  • 如果设备性能不足,可以把per_device_train_batch_size调低到4或2,num_train_epochs调低到1
  • 如果不需要追求性能,也可以替换更小的预训练模型,比如distilbert-base-cased,训练速度更快
  • 若要验证流程正确性,可以先取小部分样本(比如前100条)测试整个流程,再跑全量数据

内容的提问来源于stack exchange,提问作者Mughees Asif

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:06:03