NLP学习 [基于论文摘要的文本分类与关键词抽取挑战赛]

任务一:

机器通过对论文摘要等信息的理解,判断该论文是否属于医学领域的文献。

本次竞赛的评价标准采用F1_score,分数越高,效果越好。

总体而言,这是一个二分类的问题,初期可以采用机器学习的方法来初步的完成baseline的选择,并且可以在初步进行相关的数据处理,便于后期的上分。

文献领域分类

针对文本分类任务,可以提供两种实践思路,一种是使用传统的特征提取方法(如TF-IDF/BOW)结合机器学习模型,另一种是使用预训练的BERT模型进行建模。

当然啦,咱们Datawhale 的大神们在最后也给出了最优的方案,topline方案!!充满期待……

使用特征提取 + 机器学习的思路步骤如下:

  1. 数据预处理:首先,对文本数据进行预处理,包括文本清洗(如去除特殊字符、标点符号)、分词等操作。可以使用常见的NLP工具包(如NLTK或spaCy)来辅助进行预处理。

  2. 特征提取:使用TF-IDF(词频-逆文档频率)或BOW(词袋模型)方法将文本转换为向量表示。TF-IDF可以计算文本中词语的重要性,而BOW则简单地统计每个词语在文本中的出现次数。可以使用scikit-learn库的TfidfVectorizer或CountVectorizer来实现特征提取。

  3. 构建训练集和测试集:将预处理后的文本数据分割为训练集和测试集,确保数据集的样本分布均匀。

  4. 选择机器学习模型:根据实际情况选择适合的机器学习模型,如朴素贝叶斯、支持向量机(SVM)、随机森林等。这些模型在文本分类任务中表现良好。可以使用scikit-learn库中相应的分类器进行模型训练和评估。

  5. 模型训练和评估:使用训练集对选定的机器学习模型进行训练,然后使用测试集进行评估。评估指标可以选择准确率、精确率、召回率、F1值等。

  6. 调参优化:如果模型效果不理想,可以尝试调整特征提取的参数(如词频阈值、词袋大小等)或机器学习模型的参数,以获得更好的性能。

我们的Baseline选择使用机器学习方法,在解决机器学习问题时,一般会遵循以下流程:

  1. 导入模块

首先进行baseline的学习

#import 相关库
# 导入pandas用于读取表格数据
import pandas as pd

# 导入BOW(词袋模型),可以选择将CountVectorizer替换为TfidfVectorizer(TF-IDF(词频-逆文档频率)),注意上下文要同时修改,亲测后者效果更佳
from sklearn.feature_extraction.text import CountVectorizer

# 导入LogisticRegression回归模型
from sklearn.linear_model import LogisticRegression

# 过滤警告消息
from warnings import simplefilter
from sklearn.exceptions import ConvergenceWarning
simplefilter("ignore", category=ConvergenceWarning)

 在飞桨平台上运行出来的结果如下:

 

 然后将生成的submit_task1.csv文件提交到讯飞平台!提交的分数和大伙一样都是0.67116,希望能够在最后学习到咱们的topline的上分技巧!!!

Topline学习

        通过大神的分享,目前有两种topline都能够产生到1分的成绩,我使用的是深度学习torch框架产生的topline,在阿里云的服务器上打开了相关的算力资源后,对数据进行压缩处理,之后再训练,最后推理得到结果。

        代码学习:

 tokenized = tokenizer(sample, truncation='longest_first')  # 分词处理,使用最长优先方式截断
        input_ids, attention_mask = tokenized['input_ids'], tokenized['attention_mask']  # 获取输入ID和注意力掩码
        input_ids, attention_mask = torch.tensor(input_ids), torch.tensor(attention_mask)  # 转换为PyTorch张量

        这段代码对一个样本进行了分词处理,提取了input_ids和attention_mask,并将它们转换为PyTorch张量,以便在PyTorch模型中进一步使用。

        分词处理将连续的文本序列划分为离散的标记或单词的过程。分词处理在NLP中起着关键的作用,它是将连续文本转化为离散表示的重要步骤,为文本理解、特征提取和各种NLP任务提供了基础。

        

# 超参数类 - 可修改的所有超参数都在这里~
class opt:
    seed               = 42 # 随机种子
    batch_size         = 16 # 批处理大小
    set_epoch          = 5  # 训练轮数 
    early_stop         = 5  # 提前停止epoch数
    learning_rate      = 1e-5 # 学习率
    weight_decay       = 2e-6 # 权重衰减,L2正则化
    device             = torch.device("cuda" if torch.cuda.is_available() else "cpu") # 选择设备,GPU或CPU
    gpu_num            = 1 # GPU个数
    use_BCE            = False # 是否使用BCE损失函数
    models             = ['xlm-roberta-base', 'roberta-base', 'bert-base-uncased',  
                          'microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext', 'dmis-lab/biobert-base-cased-v1.2', 'marieke93/MiniLM-evidence-types',  
                          'microsoft/MiniLM-L12-H384-uncased','cambridgeltl/SapBERT-from-PubMedBERT-fulltext', 'microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract',
                          'microsoft/BiomedNLP-PubMedBERT-large-uncased-abstract'] # 模型名称列表
    model_index        = 2 # 根据上面选择使用的模型,这里填对应的模型索引
    model_name         = models[model_index-1] # 使用的模型名称
    continue_train     = False # 是否继续训练
    show_val           = False # 是否显示验证过程

        这是大神的超参数,我进行更改后,增加了相关的epoch使得训练结果更准确,同时尝试调整了一些学习率learning _rate,最后通过调整超参数也是从0.999分数提高到了1分。

后续提高:

①调整超参数

包括学习率、Batch_size、正则化系数等,可以使用网格搜索的方法(Grid search)来寻找模型更好的超参数组合。

②调整最大序列长度

在数据处理阶段中,调整最大序列长度MAX_LEN。

③更改损失函数

一般分类任务中,最常使用的损失函数是交叉熵(CE, Cross-Entropy),但最简单的也可以换成BCE。

④冻结模型部分参数

如feature1在模型训练的前期,相对feature2而言可能并不能带来太好的表征,所以第一个epoch可以先将它的参数进行冻结(又或者将该特征对应全连接层的学习率调小),然后等到第二个epoch后再正常训练。

⑤融合更多特征

融合更多特征,如考虑加入Glove、Word2Vec、Fasttext结合TextCNN、BiLSTM、LSTM+Attention等特征提取器所提取的文本特征。

⑥模型集成

使用一或多个与本文模型能够互补优劣的模型,并进行集成。

⑦对比学习

设计代理任务,加入对比损失函数,在训练阶段中获得更好的嵌入表示,提高模型性能。

⑧提示学习

在预训练模型的基础上使用提示学习范式,通过硬提示/软提示的方法提高模型性能。

        这次通过大佬们的开源,我对于深度学习有了更深层次的了解,也学习到了机器学习和深度学习之间的区别,希望能够再接再厉⑧!

大模型Topline学习

        大模型简介 近些年,研究人员通过在大规模语料库上预训练 Transformer 模型产生了预训练语言模型(PLMs),并在解决各类 NLP 任务上展现出了强大的能力。并且研究人员发现模型缩放可以带来性能提升,因此他们通过将模型规模增大进一步研究缩放的效果。有趣的是,当参数规模超过一定水平时,这个更大的语言模型实现了显著的性能提升,并出现了小模型中不存在的能力,比如上下文学习。为了区别于 PLM,这类模型被称为大型语言模型(LLMs)。

        1. 完成服务器的部署后,在终端输入代码,下载 clone 微调脚本 

        2.下载加载模型chatglm2-6b

        3.运行微调代码:自己注意调整参数!!!

        最终将提交的结果交上去,和许多的同学一样都是只有0.735分左右,我觉得应该对于调参的部分要自己改变一下,希望自己再接再厉!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值