科大讯飞 - 基于论文摘要的文本分类与关键词抽取挑战赛(DataWhale-Camp)

news2024/11/24 18:26:32

文章目录

      • 1、赛题信息
      • 2、解决方案
        • 2.1 飞桨Baseline(提供代码)
        • 2.2 Bert和调参
        • 2.3 chatGLM+lora大模型
      • 3、关于DataWhale-NLP

1、赛题信息

提交地址:https://challenge.xfyun.cn/topic/info?type=abstract-of-the-paper&ch=ymfk4uU

项目题目:

  • 基于论文摘要的文本分类与关键词抽取挑战赛算法挑战大赛
  • 关键词提取:根据摘要生成关键词
  • 文本分类:判断是否为医学
    在这里插入图片描述在这里插入图片描述

2、解决方案

提供模型:

  • 数学和词频统计:tfidf+逻辑回归
  • 机器学习训练:bert版
  • 大模型微调: chatglm+lora

运行环境

  • Python 3.10.12
  • 根目录的requirements.txt或docx/.yaml的conda导出

最后成绩

  • RK17,1200队报名,121队提交,17/121 = 14%左右。
  • 分数:0.435
    task1用微调的GLM大模型+bert补充。
    task2用纯bert跑3轮。
    在这里插入图片描述

2.1 飞桨Baseline(提供代码)

  • 快速跑通全流程,我们基于百度AI Studio,将本教程Baseline部署在线上平台,可一键fork运行代码,提交结果,看到成绩。
  • 没啥好说的,一键运行就成,AIStudio就可以跑。
  • 本地m1pro大概10秒内可以跑出来。
  • 其实实际分数只有0.2左右,因为主办方A榜的数据给多了,关键词的结果直接给出来了,所以一模一样放上去自然大家都是0.9x,感觉没啥参考价值。
  • 提交后获得假成绩。
    在这里插入图片描述
基于论文摘要的文本分类与关键词抽取挑战赛  
https://challenge.xfyun.cn/topic/info?type=abstract-of-the-paper&ch=ZuoaKcY
#%% md
![](https://ai-studio-static-online.cdn.bcebos.com/bc8c545638eb4200a68836ed741b6fe7d75108e9009d443b8de5b33fb8e0fa55)


## 3. 赛题解析
实践任务
本任务分为两个子任务:
1. 从论文标题、摘要作者等信息,判断该论文是否属于医学领域的文献。
2. 从论文标题、摘要作者等信息,提取出该论文关键词。

第一个任务看作是一个文本二分类任务。机器需要根据对论文摘要等信息的理解,将论文划分为医学领域的文献和非医学领域的文献两个类别之一。第二个任务看作是一个文本关键词识别任务。机器需要从给定的论文中识别和提取出与论文内容相关的关键词。

数据集解析
训练集与测试集数据为CSV格式文件,各字段分别是标题、作者和摘要。Keywords为任务2的标签,label为任务1的标签。训练集和测试集都可以通过pandas读取。

## 4.实践思路&baseline
### 实践思路
本赛题可以分为两个子任务:
1. 从论文标题、摘要作者等信息,判断该论文是否属于医学领域的文献。
2. 从论文标题、摘要作者等信息,提取出该论文关键词。


#### 任务一:文本二分类
第一个任务看作是一个文本二分类任务。机器需要根据对论文摘要等信息的理解,将论文划分为医学领域的文献和非医学领域的文献两个类别之一。

针对文本分类任务,可以提供两种实践思路,一种是使用传统的特征提取方法(如TF-IDF/BOW)结合机器学习模型,另一种是使用预训练的BERT模型进行建模。使用特征提取 + 机器学习的思路步骤如下:
1. 数据预处理:首先,对文本数据进行预处理,包括文本清洗(如去除特殊字符、标点符号)、分词等操作。可以使用常见的NLP工具包(如NLTK或spaCy)来辅助进行预处理。
2. 特征提取:使用TF-IDF(词频-逆文档频率)或BOW(词袋模型)方法将文本转换为向量表示。TF-IDF可以计算文本中词语的重要性,而BOW则简单地统计每个词语在文本中的出现次数。可以使用scikit-learn库的TfidfVectorizer或CountVectorizer来实现特征提取。
3. 构建训练集和测试集:将预处理后的文本数据分割为训练集和测试集,确保数据集的样本分布均匀。
4. 选择机器学习模型:根据实际情况选择适合的机器学习模型,如朴素贝叶斯、支持向量机(SVM)、随机森林等。这些模型在文本分类任务中表现良好。可以使用scikit-learn库中相应的分类器进行模型训练和评估。
5. 模型训练和评估:使用训练集对选定的机器学习模型进行训练,然后使用测试集进行评估。评估指标可以选择准确率、精确率、召回率、F1值等。
6. 调参优化:如果模型效果不理想,可以尝试调整特征提取的参数(如词频阈值、词袋大小等)或机器学习模型的参数,以获得更好的性能。  


Baseline中我们选择使用BOW将文本转换为向量表示,选择逻辑回归模型来完成训练和评估  
代码演示如下:
# 获取前置依赖
!pip install nltk

# 导入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)


# 读取数据集
train = pd.read_csv('data/train.csv')
train['title'] = train['title'].fillna('')
train['abstract'] = train['abstract'].fillna('')

test = pd.read_csv('data/test.csv')
test['title'] = test['title'].fillna('')
test['abstract'] = test['abstract'].fillna('')


# 提取文本特征,生成训练集与测试集
train['text'] = train['title'].fillna('') + ' ' +  train['author'].fillna('') + ' ' + train['abstract'].fillna('')+ ' ' + train['Keywords'].fillna('')
test['text'] = test['title'].fillna('') + ' ' +  test['author'].fillna('') + ' ' + test['abstract'].fillna('')+ ' ' + train['Keywords'].fillna('')

vector = CountVectorizer().fit(train['text'])
train_vector = vector.transform(train['text'])
test_vector = vector.transform(test['text'])


# 引入模型
model = LogisticRegression()

# 开始训练,这里可以考虑修改默认的batch_size与epoch来取得更好的效果
model.fit(train_vector, train['label'])

# 利用模型对测试集label标签进行预测
test['label'] = model.predict(test_vector)

# 生成任务一推测结果
test[['uuid', 'Keywords', 'label']].to_csv('submit_task1.csv', index=None)

#### 任务二:关键词提取
论文关键词划分为两类:
- 在标题和摘要中出现的关键词
- 没有在标题和摘要中出的关键词

在标题和摘要中出现的关键词:这些关键词是文本的核心内容,通常在文章的标题和摘要中出现,用于概括和提炼文本的主题或要点。对于提取这类关键词,可以采用以下方法:
  - 词频统计:统计标题和摘要中的词频,选择出现频率较高的词语作为关键词。同时设置停用词去掉价值不大、有负作用的词语。
  - 词性过滤:根据文本的词性信息,筛选出名词、动词、形容词等词性的词语作为关键词。
  - TF-IDF算法:计算词语在文本中的词频和逆文档频率,选择TF-IDF值较高的词语作为关键词。

没有在标题和摘要中出现的关键词:这类关键词可能在文本的正文部分出现,但并没有在标题和摘要中提及。要提取这些关键词,可以考虑以下方法:
  - 文本聚类:将文本划分为不同的主题或类别,提取每个主题下的关键词。
  - 上下文分析:通过分析关键词周围的上下文信息,判断其重要性和相关性。
  - 基于机器学习/深度学习的方法:使用监督学习或无监督学习的方法训练模型,从文本中提取出未出现在标题和摘要中的关键词。
# 引入分词器
from nltk import word_tokenize, ngrams

# 定义停用词,去掉出现较多,但对文章不关键的词语
stops = [
    'will', 'can', "couldn't", 'same', 'own', "needn't", 'between', "shan't", 'very',
     'so', 'over', 'in', 'have', 'the', 's', 'didn', 'few', 'should', 'of', 'that', 
     'don', 'weren', 'into', "mustn't", 'other', 'from', "she's", 'hasn', "you're",
     'ain', 'ours', 'them', 'he', 'hers', 'up', 'below', 'won', 'out', 'through',
     'than', 'this', 'who', "you've", 'on', 'how', 'more', 'being', 'any', 'no',
     'mightn', 'for', 'again', 'nor', 'there', 'him', 'was', 'y', 'too', 'now',
     'whom', 'an', 've', 'or', 'itself', 'is', 'all', "hasn't", 'been', 'themselves',
     'wouldn', 'its', 'had', "should've", 'it', "you'll", 'are', 'be', 'when', "hadn't",
     "that'll", 'what', 'while', 'above', 'such', 'we', 't', 'my', 'd', 'i', 'me',
     'at', 'after', 'am', 'against', 'further', 'just', 'isn', 'haven', 'down',
     "isn't", "wouldn't", 'some', "didn't", 'ourselves', 'their', 'theirs', 'both',
     're', 'her', 'ma', 'before', "don't", 'having', 'where', 'shouldn', 'under',
     'if', 'as', 'myself', 'needn', 'these', 'you', 'with', 'yourself', 'those',
     'each', 'herself', 'off', 'to', 'not', 'm', "it's", 'does', "weren't", "aren't",
     'were', 'aren', 'by', 'doesn', 'himself', 'wasn', "you'd", 'once', 'because', 'yours',
     'has', "mightn't", 'they', 'll', "haven't", 'but', 'couldn', 'a', 'do', 'hadn',
     "doesn't", 'your', 'she', 'yourselves', 'o', 'our', 'here', 'and', 'his', 'most',
     'about', 'shan', "wasn't", 'then', 'only', 'mustn', 'doing', 'during', 'why',
     "won't", 'until', 'did', "shouldn't", 'which'
]

# 定义方法按照词频筛选关键词

def extract_keywords_by_freq(title, abstract):
    ngrams_count = list(ngrams(word_tokenize(title.lower()), 2)) + list(ngrams(word_tokenize(abstract.lower()), 2))
    ngrams_count = pd.DataFrame(ngrams_count)
    ngrams_count = ngrams_count[~ngrams_count[0].isin(stops)]
    ngrams_count = ngrams_count[~ngrams_count[1].isin(stops)]
    ngrams_count = ngrams_count[ngrams_count[0].apply(len) > 3]
    ngrams_count = ngrams_count[ngrams_count[1].apply(len) > 3]
    ngrams_count['phrase'] = ngrams_count[0] + ' ' + ngrams_count[1]
    ngrams_count = ngrams_count['phrase'].value_counts()
    ngrams_count = ngrams_count[ngrams_count > 1]
    return list(ngrams_count.index)[:6]

## 对测试集提取关键词   

test_words = []
for row in test.iterrows():
    # 读取第每一行数据的标题与摘要并提取关键词
    prediction_keywords = extract_keywords_by_freq(row[1].title, row[1].abstract)
    # 利用文章标题进一步提取关键词
    prediction_keywords = [x.title() for x in prediction_keywords]
    # 如果未能提取到关键词
    if len(prediction_keywords) == 0:
        prediction_keywords = ['A', 'B']
    test_words.append('; '.join(prediction_keywords))
    
test['Keywords'] = test_words
test[['uuid', 'Keywords', 'label']].to_csv('submit_task2.csv', index=None)

完整baseline运行后a榜分数在0.97655左右

2.2 Bert和调参

  • 百度飞桨无法使用torch,阿里云天池和谷歌Kaggle均无法联网从huggingface获得bert模型。
    在这里插入图片描述在这里插入图片描述

  • 最后使用Google Colab,手动安装transfrom后成功运行。不得不提,colab网速是真的快,100-200Mb/s。
    在这里插入图片描述

  • 本地也安装对应环境也可以跑,修改Epoch为1后,成功运行获得结果
    在这里插入图片描述

  • 使用m1pro运行36+18分钟,得到3轮epoch的bert,提交获得分数0.42670。

  • 租了个服务器E5,36核72线程,使用10轮epoch进行运行。
    在这里插入图片描述
    在这里插入图片描述

2.3 chatGLM+lora大模型

  • 搭建GLM环境 微调脚本下载
    在这里插入图片描述

  • 大模型运行
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

3、关于DataWhale-NLP

报名时间:2023/7/13 - 2023/7/20

起因是考研,下学期学校有个实习课,想看看能不能水个实习证明。

  • 但是好像还是挺麻烦的,要一等奖或者2个方向三等奖或宣传大使(感觉打比赛要花时间,拉人头也挺麻烦)
  • 加上学校的可能要学校自己的报告上盖章,可能大概是用不了的。
  • 所以后来就跑路了,没怎么调代码,随便搞了一下,还是考研复习要紧。

简单记录下,报名到摸鱼组队还是花了可能有将近半天的时间的。

在这里插入图片描述

关于宣传大使:

  • 方式一:将我们的活动推文/活动海报,分享到校内公众号/社群/朋友圈等(推荐指数:⭐⭐)
    方式二:自己重新制作活动推文/活动海报,分享到校内公众号/社群/朋友圈等(推荐指数:⭐⭐⭐)
    方式三:将推文或海报分享到个人自媒体(推荐指数:⭐⭐⭐)
  • 10 荣誉证书 20
    荣誉证书+贴纸+装饰挂绳+钥匙扣 30
    荣誉证书+贴纸+鼠标垫 50
    荣誉证书+贴纸+立牌+简历指导 60
    荣誉证书+贴纸+卫衣+简历指导

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/820058.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我的会议(会议通知)

前言: 我们在实现了发布会议功能,我的会议功能的基础上,继续来实现会议通知的功能。 4.1实现的特色功能: 当有会议要参加时,通过查询会议通知可以知道会议的内容,以及当前会议状态(未读) 4.2思路…

在Linux中怎么查找文件

2023年8月1日,周二上午 目录 Linux的四种搜索命令find简要说明举例说明拓展阅读locate 简要说明举例说明whereis简要说明举例说明which简要说明举例说明 Linux的四种搜索命令 findlocate(不一定内置有,可能要下载mlocate包)wher…

【概念理解】HAL库的滴答定时器HAL_Delay()函数的实现原理

来源:bilibili视频 这里写目录标题 概述一、寄存器部分1. 控制和状态寄存器(STK_CTRL)2. 加载值寄存器(STK_LOAD)3.当前值寄存器(STK_VAL) 二、代码部分hal_delay()1. hal_initTick()滴答定时器的初始化2. 将七万二传…

Redis 客户端有哪些?

文章目录 JedisLettuceRedisson最佳实践 - 到底用哪个? Redis 最常见的 Java 客户端有两个,Jedis 和 Lettuce,高级客户端有 Redisson,见下图(图源 Clients | Redis) Jedis Github地址:redis/j…

Windows下安装Hive(包安装成功)

Windows下安装Hive Hive与Hadoop的版本选择很关键,千万不能选错,否则各种报错。一、Hive下载1.1、官网下载Hive1.2、网盘下载Hive 二、解压安装包,配置Hive环境变量2.1、环境变量新增:HIVE_HOME2.2、修改Path环境变量,…

Oracle免费在线编程:Oracle APEX

前提: 注意:你要有个梯子才能更稳定的访问。 不需要安装Oracle,但是需要注册。(还算方便的) 注册&登录过程 进入Oracle APEX官网,我们选择免费的APEX工作区即可,点击“免费注册”。在注册…

基于H5或者微信小程序开发GIS地图实战全套代码

1 下面有一定基础的可以不看 (1)第一篇请看 微信小程序开发天地图 (2)第二篇请看 http://GeoServer+PostgreSQL+PostGIS+Tomcat+QGIS一整套相关 (3)第三篇请看 有国产化需求的 (4)第四篇请看 支持国家EPSG:4490 2 vue+openlayers实例代码

ThreadLocal原理

ThreadLocal原理 ThreadLocal对象new出来存放到堆中,ThreadLocal引用是存放在栈里 Thread 类有个 ThreadLocalMap 成员变量,Map的key是Threadlocal 对象,value是你要存放的线程局部变量。 public void set(T value) {//获取当前线程Thread&…

SpringBoot复习:(11)SpringApplication中的listeners成员变量是怎么初始化的?

initializers成员变量定义如下: 在构造方法中: setListeners代码如下: 给setListeners方法传递的是getSpringFactoriesInstances(ApplicationListener.class). getSpringFactoriesInstances代码如下: 调用的重载的getSpringFa…

redis 高级篇4 分布式锁

一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性;2.高可用;3.防死锁;4.不乱抢;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述: 使用lock锁和synchronized,单机…

【shell】获取ping的时延数据并分析网络情况及常用命令学习

文章目录 获取ping的时延数据并分析网络情况|、||、&、&&辨析teetailkillall 获取ping的时延数据并分析网络情况 网络情况经常让我们头疼,每次都需要手动在终端ping太麻烦了,不如写个脚本ping并将数据带上时间戳存入文件,然后也…

iPhone 6透明屏是什么?原理、特点、优势

iPhone 6透明屏是一种特殊的屏幕技术,它能够使手机屏幕变得透明,让用户能够透过屏幕看到手机背后的物体。 这种技术在科幻电影中经常出现,给人一种未来科技的感觉。下面将介绍iPhone 6透明屏的原理、特点以及可能的应用。 iPhone 6透明屏的原…

【外卖系统】新增菜品

需求分析 在后台中,通过新增功能来添加一个新的菜品,在添加菜品时需要选择当前菜品所属的菜品分类,并且需要上传的菜品图片。 代码开发 需要添加的类和基本接口:实体类DishFlavor、Mapper接口DishFlavorMapper、业务层接口Dish…

顶尖211,央企收割机!面试仅16%!超线30分,稳稳上岸!

一、学校及专业介绍 南京理工大学(Nanjing University of Science and Technology),简称南理,位于南京市,是隶属于工业和信息化部的全国重点大学,是国家“双一流”建设高校,“211工程”。由于学…

百模征战,如何解决数据卡脖子问题?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 继ChatGPT以来,大模型在国内掀起了一股热潮,大有百模征战之意。而其中数据、算法、算力作为大模型训练的三驾马车,预训练数据的数量、质量、多样性成为大模型能力表现的关键性因素&#x…

8.Winform界面打包成DLL提供给其他的项目使用

背景 希望集成一个Winform的框架,提供权限菜单,根据权限出现各个Winform子系统的菜单界面。不希望把所有的界面都放放在同一个解决方案下面。用各个子系统建立不同的解决方案,建立代码仓库,进行管理。 实现方式 将Winform的UI界…

Linux系统使用(超详细,暑假弯道超车!!)

目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列的关系。只不过只…

牛客网Verilog刷题——VL54

牛客网Verilog刷题——VL54 题目答案 题目 实现一个深度为8,位宽为4bit的双端口RAM,数据全部初始化为0000。具有两组端口,分别用于读数据和写数据,读写操作可以同时进行。当读数据指示信号read_en有效时,通过读地址信号…

SpringBoot 集成Swagger2

一、入门 1、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!-- https://mvnrepository.com…

IIC协议原理及IIC通信的具体实现(S3C2440裸机开发)

文章目录 前言一、IIC协议二、IIC的控制2.1 IIC控制相关寄存器2.2 IIC控制中的特征信号2.3 IIC的数据传输格式2.3.1 ACK信号2.3.2 数据读写操作2.3.3 中止通信 三、 IIC编程3.1 IIC编程的相关寄存器3.2 IIC代码实现 总结 前言 本期和大家主要分享的是一种非常常见并且非常常用…