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
相关产品推荐
相关产品推荐

