首页 > 其他分享 >【AI夏令营】NLP赛题解析与Baseline逐行精读

【AI夏令营】NLP赛题解析与Baseline逐行精读

时间:2023-07-27 22:23:10浏览次数:64  
标签:count NLP 精读 关键词 ngrams train test fillna 逐行

【任务】
1.深入研读baseline代码,仔细理解其每个部分,并记录详尽的学习笔记;
2.主动挑战自己,对基线代码进行优化,力求改进代码的实际效果和性能;
3.完成任务二,并查看个人成绩排行榜。
【Baseline精读】
本次主要是针对任务二(关键词提取,也会有部分任务一的内容)
首先是库文件的导入:

# 导入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('/home/aistudio/data/data231041/train.csv')
train['title'] = train['title'].fillna('')
train['abstract'] = train['abstract'].fillna('')

test = pd.read_csv('/home/aistudio/data/data231041/testB.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('')

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)

任务二:关键词提取

论文关键词划分为两类:
在标题和摘要中出现的关键词
没有在标题和摘要中出的关键词
在标题和摘要中出现的关键词:这些关键词是文本的核心内容,通常在文章的标题和摘要中出现,用于概括和提炼文本的主题或要点。对于提取这类关键词,可以采用以下方法:

词频统计:统计标题和摘要中的词频,选择出现频率较高的词语作为关键词。同时设置停用词去掉价值不大、有负作用的词语。
词性过滤:根据文本的词性信息,筛选出名词、动词、形容词等词性的词语作为关键词。
TF-IDF算法:计算词语在文本中的词频和逆文档频率,选择TF-IDF值较高的词语作为关键词。
没有在标题和摘要中出现的关键词:这类关键词可能在文本的正文部分出现,但并没有在标题和摘要中提及。要提取这些关键词,可以考虑以下方法:

1.文本聚类:将文本划分为不同的主题或类别,提取每个主题下的关键词。
2.上下文分析:通过分析关键词周围的上下文信息,判断其重要性和相关性。
3.基于机器学习/深度学习的方法:使用监督学习或无监督学习的方法训练模型,从文本中提取出未出现在标题和摘要中的关键词。

引入分词器和设置停用词(出现较多,但对文章不关键的词语):

# 引入分词器
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_task1.csv', index=None)

【个人成绩】

【参考资料】
【AI夏令营】NLP赛题解析与Baseline逐行精读

标签:count,NLP,精读,关键词,ngrams,train,test,fillna,逐行
From: https://www.cnblogs.com/hhd-triblesix/p/17586256.html

相关文章

  • NLP网络的输入和输出为何长度一样
    NLP网络的输入和输出为何长度一样自然语言处理(NaturalLanguageProcessing,简称NLP)是一门研究人类语言与计算机之间交互的学科。在NLP中,神经网络模型被广泛应用于各种任务,如文本分类、机器翻译、情感分析等。在这些任务中,我们经常遇到一个问题:为什么NLP网络的输入和输出长度一样?......
  • NLP句子相似性方法总结及实现
    目录1、基于Word2Vec的余弦相似度2、TextRank算法中的句子相似性3、莱文斯坦距离(编辑距离)4、莱文斯坦比5、汉明距离6、Jaro距离(JaroDistance)7、Jaro-Winkler距离(Jaro-WinklerDistance)8、基于Doc2Vec的句子相似度计算1、基于Word2Vec的余弦相似度首先对句子分词,使用Gens......
  • 关于深度学习、NLP和CV,我们写了一本1400页的全栈手册
    不知不觉写文章已经四年了。最开始是一个人,后来恰了恰饭,就招揽了很多比小夕厉害的小伙伴一起写。不知不觉已经积累了300多篇了。。三年以来,我跟小伙伴们原创的300+篇深度学习、NLP、CV、知识图谱、跨模态等领域的入门资料、子方向综述、2018~2022学术前沿解读、工业界炼丹经验与算......
  • 安装nlpcda2.5.8 Simbert不能正常使用,除非你安装:bert4keras、tensorflow ,为了
    安装nlpcda2.5.8Simbert不能正常使用问题解决方案在自然语言处理(NLP)领域,模型的选择和安装是非常重要的。为了使用nlpcda2.5.8Simbert,我们需要在安装该库之前先安装bert4keras和tensorflow。本文将介绍如何解决Simbert不能正常使用的问题,并给出相应的代码示例。1.安装bert4kera......
  • 模型部署 — PaddleNLP 基于 Paddle Serving 快速使用(服务化部署 - Docker)— 图像识别
    目录流程版本安装Docker安装PaddleNLP安装环境准备模型准备压缩模型下载模型模型部署环境配置启动服务测试--暂时还没通过重启图像识别+信息抽取(UIE-X),部署接口供别的应用调用最终在自己部署的环境中识别时报错,不知道是不是和GPU有关,还在尝试中流程在百度BMLCodeLab......
  • Prompt Learning: ChatGPT 也在用的 NLP 新范式
    编者按:自GPT-3以来,大语言模型进入了新的训练范式,即“预训练模型+Promplearning”。在这一新的范式下,大语言模型呈现出惊人的zero-shot和few-shot能力,使用较少的训练数据来适应新的任务形式。最近火爆出圈的ChatGPT是利用这一方式。简单理解Promptlearning,其核心就是以特定的模板,......
  • AI识别检验报告 -PaddleNLP UIE-X 在医疗领域的实战
    目录UIE-X在医疗领域的实战1.项目背景2.案例简介3.环境准备数据转换5.模型微调6.模型评估7.Taskflow一键部署UIE-X在医疗领域的实战PaddleNLP全新发布UIE-X......
  • Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks
    目录概符号说明RAGRetriever:DPRGenerator:BARTLewisP.andPerezE.,etal.Retrieval-augmentedgenerationforknowledge-intensivenlptasks.NIPS,2020.概RAG:赋予模型检索的能力.符号说明\(\bm{x}\),输入序列;\(\bm{y}\),输出序列,长度为\(N\);RAG......
  • NLP(四十七):损失函数
    三元组损失tripletloss设计初衷:让x与这个跟他同类的点距离更近,跟非同类的点距离更远。d是距离,m的含义是,当x与x+的距离减去x与x-,如果小于-m时,对损失函数的贡献为0,如果大于-m时,对损失的贡献大于0.含义就是:当负例太简单时,不产生损失,这个损失的目标是,挑选困难样本进行分类。......
  • NLP(四十六):GLOVE
    转载自https://zhuanlan.zhihu.com/p/58916233在上节,我们学习了词向量的两种训练方式:Skip-Gram和CBOW,都是通过句子中的某个单词去预测另一个单词。而本节,我们将学习第三种词向量的训练模型:GLOVE[1]。GLOVE模型是由斯坦福教授Manning、Socher等人于2014年提出的一种词向量训练模......