Datawhale AI夏令营 - NLP实践:基于论文摘要的文本分类与关键词抽取挑战赛——基础篇

DAY1 入门讲解

直播ing

 Q:如何选择机器学习算法或深度学习算法?

A:在许多机器学习问题中,特征工程的重要性不容忽视。如果特征工程能够充分捕捉数据的关键特征,那么机器学习算法也能够表现良好。深度学习在某种程度上可以自动学习特征,但对于特定问题,手动设计特征可能会更有效。

总而言之,当样本量足够大且数据集具有一定的特点时,使用机器学习。其中,常用的机器学习包括树模型、SVM模型;深度学习包括神经网络,即卷积层、池化层等。

Q:逻辑回归VS决策树

A:决策树能够处理非线性关系,并且可以自动捕获特征之间的交互作用。它可以生成可解释的规则,有助于理解模型如何做出决策。决策树能够处理不同类型的特征,包括分类和数量值。

(P.S. 此前没有接触过决策树,查询CSDN后发现有一篇文章介绍得很详细:

https://blog.csdn.net/jiaoyangwm/article/details/79525237?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169210207016800213091161%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169210207016800213091161&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-79525237-null-null.142^v92^insert_down28v1&utm_term=%E5%86%B3%E7%AD%96%E6%A0%91&spm=1018.2226.3001.4187

浅谈一下对决策树的理解:具有类似于二叉树的构造,与字典树具有一定的相似性,利用最具有区分度的特征将各个样本依次分类下去或直至无法被真正分类,在一定程度上也可以实现剪枝算法。决策树适合处理带有类别的数据,对特征的大小不敏感,因此优于线性

机器学习模型对输入有要求:数值、向量、矩阵

文本or图片都需要被转换

不支持字符串的输入,将其转换成数值

对原始数据集进行编码

推荐学习使用书目:《西瓜书》!!!

 对BASELINE初认知

简而言之就是,快速获得一个已完成的模型并在此基础上进行修改以及对比。

以下是一份博客的讲解:

机器学习中的baseline_机器学习baseline_努力の小熊的博客-CSDN博客

 DAY2... 编码测试

P.S. 在本次比赛的过程中,很有可能因为结果输出格式不对而导致无法评判结果,从而陷入死循环的状态。如下图:血与泪的教训o(╥﹏╥)o

接下来对已有调试结果的代码进行展示

0.76324分代码:

TASK1

知识简介

基于 TF-IDF 提取

TF-IDF(term frequency–inverse document frequency)是一种用于信息检索与数据挖掘的常用加权技术,其中,TF 指 term frequence,即词频,指某个词在文章中出现次数与文章总次数的比值;IDF 指 inverse document frequence,即逆文档频率,指包含某个词的文档数占语料库总文档数的比例。

例如,假设语料库为 {"今天 天气 很好","今天 心情 很 不好", "明天 天气 不好"},每一个句子为一个文档,则“今天”的 TF 和 IDF 分别为:

每个词最终的 IF-IDF 即为 TF 值乘以 IDF 值。计算出每个词的 TF-IDF 值后,使用 TF-IDF 计算得到的数值向量替代原文本即可实现基于 TF-IDF 的文本特征提取。

基于 BOW

BOW(Bag of Words)是一种常用的文本表示方法,其基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。具体而言,词袋模型表示一个文本,首先会维护一个词库,词库里维护了每一个词到一个数值向量的映射关系。例如,最简单的映射关系是独热编码,假设词库里一共有四个词,今天、天气、很、不好,那么独热编码会将四个词分别编码为:

今天——(1,0,0,0)

天气——(0,1,0,0)

很 ——(0,0,1,0)

不好——(0,0,0,1)

而使用词袋模型,就会将上述这句话编码为:

BOW(Sentence)= Embedding(今天) + Embedding(天气) + Embedding(很) +

                                Embedding(不好)

                             = (1,1,1,1)

代码 

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

# 导入LogisticRegression回归模型
from sklearn.linear_model import LogisticRegression
# 读取数据集
train = pd.read_csv('data/train.csv')
train['title'] = train['title'].fillna('')
train['abstract'] = train['abstract'].fillna('')

test = pd.read_csv('data/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('')+ ' ' + 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['Keywords'] = test['title'].fillna('')
# 生成任务一推测结果
test[['uuid', 'Keywords', 'label']].to_csv('submit_task1.csv', index=None)
test[['uuid', 'Keywords', 'label','title','abstract']].to_csv('tmp.csv', index=None)

其中tmp.csv文件用于保存预估后产生的临时数据,并用于TASK2中的预估。

TASK2

知识简介

停用词

停用词(Stop Words)是自然语言处理领域的一个重要工具,通常被用来提升文本特征的质量,或者降低文本特征的维度。停用词的使用主要是出于由于机器学习输入的局限性,从而导致的对非数字类型的元素的编码可能会出现编码相似的情况,导致出现混乱。因此,停用词即用于禁止某些词汇的使用而混淆对元素含义的判断。

代码: 

# 引入分词器
import pandas as pd
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 = pd.read_csv("tmp.csv")

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)

附:对本次参加学习NLP的体验

从小小参加过数学建模开始,本以为自己对机器学习以及有了初步的了解;以及在之后学习过程中,对神经网络等有了一些认知,可能会在本次的夏令营中有一定的基础,但是大大超出了我的想象。在本次活动当中,我遇见了许多领域大牛,他们对问题的分析、模型的使用十分精准而完善,与此同时我也从他们口中了解到一些知识点,展示如下。

        1.deberta

        2.baseline

        3.善于利用阿里云等服务器进行模型的训练

另外,本次学习我面临时间紧任务重的处境,同时有多个任务在进行,忙完这一阵子后我将回来继续深入地了解这三方面的内容。

并且,通过初步涉猎,我认识到自然语言处理和计算机视觉虽然都是用于模拟人类的行为,但也存在着的极大不同之处:

        1.所主要使用库不同:自然语言处理主要使用sklearn中过滤器、计数器等;计算机视觉主要使用OpenCV

        2.所处理的目的不同:自然语言处理处理语言拆分、识别、提取等问题,主要应用于论文查重、与人进行沟通交互等;计算机视觉主要将图片或视频(也会将其一帧一帧进行处理)来识别人头等,主要用于对人物的识别或统计

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值