Py学习  »  Python

【顶刊复现】:5种BERT模型,谁能更准确地识别讽刺评论!(附Python代码)

AI academic space • 2 周前 • 74 次点击  

 

 

01 | 引言:从场景到任务

"这网速‘快’得都能看完一部电影了!”——如何让AI理解,这句讽刺的根源是“网速慢”?

识别讽刺背后的真实原因,是提升舆情分析、用户体验洞察的关键。今天,我们分享对信息管理顶刊 INFORMS 论文《A Fusion Pretrained Approach for Identifying the Cause of Sarcasm Remarks》的代码复现工作,聚焦其中的5种BERT基线模型,助您快速入门这一前沿领域。

02 | 核心思路:5种BERT模型对比

论文对比了不同BERT架构在“讽刺原因识别”任务上的表现。我们成功复现了以下五种经典范式,其核心区别在于如何编码和交互上下文与讽刺句:

      • BERT-Base-Pipeline:分别编码,拼接特征。
  • • BERT-Base-Joint:联合编码,使用[CLS]标签分类。
  • • BERT-Pooling:在联合编码基础上,引入池化与特征交互(如u-v, u*v)
  • • BERT-ESIM:模拟ESIM模型的交互注意力机制。
  • • BERT-Base-Pipeline (Domain):在方法1基础上加入领域信息。

03 | 代码精讲:以联合编码模型为例

以下以效果稳定且思路清晰的 BERT-Base-Joint(联合编码)模型为例,展示核心代码:

import torch.nn as nn
from
 transformers import BertModel

class
 BERTBaseJoint(nn.Module):
    """联合编码上下文与讽刺句,使用[CLS]向量进行分类"""

    def
 __init__(self, bert_model_name, num_labels=2):
        super
().__init__()
        # 核心1:加载预训练BERT主干

        self
.bert = BertModel.from_pretrained(bert_model_name)
        # 核心2:定义新的任务特定分类层

        self
.classifier = nn.Linear(768, num_labels)

    def
 forward(self, input_ids, attention_mask):
        # 将输入喂给BERT,得到编码结果

        outputs = self.bert(input_ids=input_ids, attention_mask=attention_mask)
        # 取出代表整体语义的[CLS]标记对应的特征向量

        cls_output = outputs.last_hidden_state[:, 0, :]
        # 将特征送入分类器,得到最终预测逻辑值

        logits = self.classifier(cls_output)
        return
 logits

代码解读:

  • • self.bert:固定套路,加载Hugging Face上的预训练模型(如 bert-base-uncased)。
  • • self.classifier:随机初始化的线性层,负责将BERT输出的768维特征映射到标签空间(本例为2分类)。
  • • cls_output:取[CLS]标签对应的向量作为整个输入序列的语义表示,是BERT用于分类任务的经典做法。

【04 国内HF-Mirror高速下载方案】

依赖Hugging Face模型?
下载慢、易中断?HF-Mirror 是国内开发者推荐的镜像解决方案。您无需修改代码逻辑,仅需设置一个环境变量即可实现全速下载。

推荐方法:在代码中设置(最便捷)
在您的Python脚本最开头添加两行代码即可:




    
import os
# 关键设置:指定使用HF镜像源

os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'

# 后续所有 from_pretrained() 调用都将通过镜像站进行,速度飞起

from
 transformers import BertTokenizer, BertModel
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')

备用方案:使用命令行工具
如果希望提前将模型下载到本地,也可使用huggingface-cli工具(需先安装huggingface_hub库):

# 在终端中执行
export
 HF_ENDPOINT=https://hf-mirror.com  # Linux/macOS
# $env:HF_ENDPOINT = "https://hf-mirror.com"  # Windows PowerShell


# 下载模型到当前目录下的 'bert-base-uncased' 文件夹

huggingface-cli download --resume-download bert-base-uncased --local-dir ./bert-base-uncased

05 | 复现结果

实验配置说明

为快速验证模型框架的有效性,本次复现采用了轻量化实验配置,旨在评估不同模型架构的相对性能表现,而非追求绝对性能上限。


实验结果呈现

 

表1. 轻量化配置下的模型性能对比(均值±标准差,2折交叉验证)

模型
Precision
Recall
F1-Score
BERT-Pooling
0.7879 ± 0.0217
0.6748 ± 0.0661
0.6610 ± 0.0861
BERT-Base-Joint
0.8063 ± 0.0158
0.6005 ± 0.0981
0.5343 ± 0.1620
BERT-ESIM
0.8004 ± 0.0098
0.5575 ± 0.0551
0.4738 ± 0.1015
BERT-Base-Pipeline
0.4217 ± 0.1317
0.5048 ± 0.0048
0.3912 ± 0.0241

 


 

 

核心结论:

 

  •   • 架构优势:BERT-Pooling凭借池化交互机制(u-v,u*v)表现最佳,相比基 线模型性能提升69.0%
  •    • 趋势验证:联合/交互编码模型普遍优于简单分别编码,与原文结论一致
  •    • 可行性证实:轻量化配置下模型性能排序稳定,代码实现可靠

 

即插即用:
此代码框架是优秀的BERT微调模板,可轻松适配其他文本分类任务(如舆情根因分析、内容审核等),助您快速启动研究。

06 | 结语

本次复现提供了将顶级学术论文转化为可运行代码的完整范例。希望这份资源能成为您开展计算社科、舆情分析等领域研究的实用起点。

欢迎在评论区留言交流!

如果您在使用中遇到任何问题,或有其他有趣的NLP任务想法,欢迎一起讨论!

版权说明:本文复现代码由【学术代码侠】整理分享,仅供学术研究使用。原始论文方法版权归原作者所有。

欢迎关注 『学术代码侠』。
我们专注于用 Python/Matlab/Stata/R等代码,复现社科顶刊模型、分享前沿算法。在这里,您能获得开箱即用的学术代码模板、提升研究效率的编程技巧。


 

代码领取方式

 

 


C0001



转发本推文到朋友圈

添加客服

发送代码编号

发送保留2小时并集齐10个点赞的截图

即可免费领取代码


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/194056