Datawhale零基础入门NLP-Task01-day 1
Datawhale零基础入门NLP-Task01-day 1
一、赛题数据
摘要:本章将会对新闻文本分类进行赛题讲解,对赛题数据进行说明,并给出解题思路。
本文结构和框架大部分参考自:https://tianchi.aliyun.com/competition/entrance/531810/information
https://tianchi.aliyun.com/notebook-ai/detail?spm=5176.12586969.1002.6.6406111aIKCSLV&postId=118252
Markdown转换公众号 https://mdnice.com/
赛题理解
- 赛题名称:零基础入门NLP之新闻文本分类
- 赛题目标:通过这道赛题可以引导大家走入自然语言处理的世界,带大家接触NLP的预处理、模型构建和模型训练等知识点。
- 赛题任务:赛题以自然语言处理为背景,要求选手对新闻文本进行分类,这是一个典型的字符识别问题。
赛题数据
赛题以匿名处理后的新闻数据为赛题数据。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。
赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。
label | text |
---|---|
6 | 57 44 66 56 2 3 3 37 5 41 9 57 44 47 45 33 13 63 58 31 17 47 0 1 1 69 26 60 62 15 21 12 49 18 38 20 50 23 57 44 45 33 25 28 47 22 52 35 30 14 24 69 54 7 48 19 11 51 16 43 26 34 53 27 64 8 4 42 36 46 65 69 29 39 15 37 57 44 45 33 69 54 7 25 40 35 30 66 56 47 55 69 61 10 60 42 36 46 65 37 5 41 32 67 6 59 47 0 1 1 68 |
在数据集中标签的对应的关系如下:
{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
数据列使用\t进行分割,Pandas读取数据的代码如下:
train_df = pd.read_csv('../input/train_set.csv', sep='\t')
二、评测标准
评价标准为类别f1_score的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。
LaTeX 数学公式:对应列表
计算公式:F1=2∗(precision∗recall)(precision+recall)
计算公式:F1 = 2 * \frac{(precision*recall)}{(precision+recall)}
计算公式:F1=2∗(precision+recall)(precision∗recall)
这里使用了机器学习里面常用的一个评价分类模型的方法F1-score。这里面precision表示准确率,recall表示召回率:
precision=TPFP+TP precision = \frac{TP}{FP+TP} precision=FP+TPTP
recall=TPTP+FN
recall = \frac{TP}{TP+FN}
recall=TP+FNTP
在上述两式子里,TP即true positive, 就是模型将样本分类为正样本且分类正确的样本数,FP即false positive, 就是模型将样本分类为负样本但分类错误的样本数。同理, TN,FN分别为为true negative和false negative。(注意:这里FP,TP, FN, TN样本的positive和negative,这个都是模型预测的结果,而不是实际上样本为正为负)
所以这里的precision其实就是在模型判定为正的样本里正样本(实际为正的样本)的比例,而recall就是模型判定正确的正样本数占原始数据集(就是被预测的数据集)中所有正样本的比例。precision和recall都可以用来评价分类模型。但在实际应用过程中,这两者都有所缺陷,这里我举两个二分类的例子:垃圾邮件检测和零件故障检测。在垃圾邮件检测中,我们的目的是检测出来的垃圾邮件尽量多的是准确的,不能把非垃圾邮件检测为垃圾邮件。所以这里我们需要使用precision,而不是recall。而在零件的故障检测中,我们目的是要尽可能的把所有故障零件都找出来,这里就要用到recall,而不是precision。recall 体现了模型对正样本的识别能力,recall 越高,说明模型对正样本的识别能力越强,precision 体现了模型对负样本的区分能力,precision越高,说明模型对负样本的区分能力越强。
而从上面F1-score的表达式可以看出,它是上述两者的调和平均。F1-score 越高,说明模型越稳健。
可以通过sklearn完成f1_score计算:
from sklearn.metrics import f1_score y_true = [0, 1, 2, 0, 1, 2] y_pred = [0, 2, 1, 0, 0, 1] f1_score(y_true, y_pred, average='macro')
解题思路
赛题思路分析:赛题本质是一个文本分类问题,需要根据每句的字符进行分类。但赛题给出的数据是匿名化的,不能直接使用中文分词等操作,这个是赛题的难点。
因此本次赛题的难点是需要对匿名字符进行建模,进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到
特征提取和
分类模型两个部分。为了减低参赛难度,我们提供了一些解题思路供大家参考:
思路1:TF-IDF + 机器学习分类器
直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。
这里TF-IDF方法是文本挖掘中常用的一种提取特征的技术,旨在从无结构的文本提取出有结构的数据,从而来进行模型的训练。其中TF就是Term Frequency,就是一个单词在一个document中出现的次数
然后IDF是Inverse document frequency,具体看下面计算公式
tf(w,d)=#of occurrences of word w in document d
tf(w,d) = \#of\ occurrences\ of\ word\ w\ in\ document\ d
tf(w,d)=#of occurrences of word w in document d
然后IDF是Inverse document frequency,具体看下面计算公式
idf(w)=log2(N#of documents that contain w at least once)
idf(w) = log_2(\frac{N}{\#of\ documents\ that\ contain\ w\ at\ least\ once})
idf(w)=log2(#of documents that contain w at least onceN)
这里N表示语料库的总文档数。
tf其实就是衡量一个单词w与文档d相关性程度,而idf是评判一个单词w在整个语料库中的关系。如果我们只是用tf来提取特征的话也就是CountVectorizer就会有这样的不足,当某些词在每个文档中都出现多次,那么这个词其实是不具备对文档进行分类的能力的。所以这时候就体现idf的作用了,因为这样出现在很多文档的词idf值是很小的。
tfidf(w,d)=tf(w,d)∗idf(w)
tfidf(w,d) = tf(w,d)*idf(w)
tfidf(w,d)=tf(w,d)∗idf(w)
而tfidf中和了两者的优点,将其相乘,这样来提取特征就会避免只使用词频的不足。
tfidf:
from sklearn.feature_extraction.text import TfidfVectorizer vect=TfidfVectorizer(encoding='utf-8') vect.fit(train_data) trans_traindata=vect.transform(train_data) trans_testdata=vect.transform(test_data)
SVM:
lsvc=LinearSVC() lsvc.fit(trans_traindata.toarray(),train_label) prediction["LSVC"]=lsvc.predict(trans_testdata.toarray()) print(classification_report(test_label,prediction["LSVC"])) accuracy_score(test_label,prediction["LSVC"])
XGBoost:
import xgboost as xgb cls_xgboost = xgb.XGBClassifier() cls_xgboost.fit(trans_traindata,train_label) cls_xgboost.score(trans_testdata,test_label)
- Datawhale零基础入门NLP-Task01-day3
- Datawhale零基础入门NLP-Task01-day2
- Datawhale零基础入门NLP-Task3 基于机器学习的文本分类
- Datawhale零基础入门NLP赛事Task 02: 数据读取与数据分析
- 【DataWhale学习记录13-02】零基础入门CV赛事-Task01-赛题理解
- Datawhale零基础入门NLP赛事-01赛题理解
- Datawhale零基础入门NLP赛事-04基于深度学习的文本分类1FastText
- Datawhale 零基础入门CV赛事-Task3 字符识别模型
- Datawhale 零基础入门CV赛事-Task4-模型训练与验证
- Datawhale 零基础入门CV赛事-Task4 模型训练与验证
- Datawhale 零基础入门CV赛事-Task1 赛题理解---学习笔记
- 【学习笔记】Datawhale零基础入门NLP赛事--天池新闻文本分类--Day2数据理解与数据分析
- 零基础入门NLP-Task3 基于机器学习的文本分类
- Datawhale 零基础入门CV赛事-Task3 字符识别模型
- Datawhale 零基础入门CV赛事-Task3 字符识别模型
- Datawhale零基础入门NLP——新闻文本分类(一)熟悉赛题(天池比赛)
- Datawhale 零基础入门CV赛事-Task4 模型训练与验证
- Datawhale 零基础入门CV赛事Task1 赛题理解
- Datawhale 零基础入门CV赛事-Task1 赛题理解
- [不知pandas为何物的纯金小白]Datawhale零基础入门NLP赛事--天池新闻文本分类--Day1理解赛题