首页 > 其他分享 >阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87

阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87

时间:2023-02-08 20:32:32浏览次数:42  
标签:NLP F1 tfidf train 0.87 分类器 csv data


problem

阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_词向量



1、赛题理解

  • 数据集:
    在NLP_data_list_0715.csv中,有三个链接。
    分别可以下载训练集,测试集A,测试样例。
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_分类_02

  • f1_score介绍:
    F1分数(F1-score)是分类问题的一个衡量指标 。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0。
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_阿里云_03

  • 不太明白,按照字符级别进行了匿名处理是什么意思?
    先用panda读一下数据。
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_阿里云_04

2、数据分析(数据探索 EDA)

  • 句子长度分析
    新闻文本数据的每个单词由空格隔开,所以我们可以直接统计单词的个数来得出每段新闻的长度。
    可以知道:每个句子平均由923个字符构成,最短的句子长度为64,最长的句子长度为7125。
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_阿里云_05

  • 单词分析
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_分类_06

  • 类别分布分析
    接下来我们可以对数据集类别分布进行统计,即统计每类新闻的样本个数。
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_自然语言处理_07

  • 数据结论:
    抽取训练集中100个样本进行数据分析,得到以下结论
  1. 给定的文本比较长,每个句子平均由923个字符构成,最短的句子长度为64,最长的句子长度为7125。
  2. 在训练集中总共包括2405个字,其中编号3750的字出现的次数最多,编号5034的字出现的次数最少。
  3. 各类标签有不平衡的问题,其中最多的是科技类新闻,最少的是星座类新闻。
  4. 样本偏长,需要做截断。
  5. 类别不均衡会影响模型的精度。

3、特征工程 + 模型训练

  • 解题思路:
    由于数据脱敏,我们需要对匿名字符进行建模,进而完成文本分类。由于文本数据是一种典型的非结构化的数据 ,因此可能涉及到‘特征提取’和‘分类模型’两个部分。
  • 主要思路(特征提取+分类模型):
  1. TF-IDF+机器学习分类器
    直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。
  2. WordVec+深度学习分类器
    WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。
  3. FastText
    FastText是入门款的词向量,利用Facebook提供的FastText工具,可以快速构建出分类器。
  4. Bert词向量
    Bert是高配款的词向量,具有强大的建模学习能力。

4、TF-IDF+RidgeClassifier(线性模型)

  • 原理:
  • 阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_阿里云_08

  • 代码:
import pandas as pd

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_score

train_data=pd.read_csv("train_set.csv",sep='\t')
test_data=pd.read_csv("test_a.csv",sep='\t')
train_data.shape
(200000, 2)
train_data[:5]

# Tfidf
tf_idf=TfidfVectorizer(max_features=2000).fit(train_data['text'].values)
train_tfidf=tf_idf.transform(train_data['text'].values)
train_tfidf.shape
(200000, 2000)
test_tfidf=tf_idf.transform(test_data['text'].values)

# 岭回归
clf=RidgeClassifier()
clf.fit(train_tfidf,train_data['label'].values)
RidgeClassifier()

# F1值
val_pred = clf.predict(train_tfidf[10000:])
print(f1_score(train_data['label'].values[10000:], val_pred, average='macro'))

# 测试集
df=pd.DataFrame()
df['label']=clf.predict(test_tfidf)
df.to_csv('submit.csv',index=None)

阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_分类_09

  • 结果:
F1_Score = 0.8837

阿里云天池 零基础入门NLP - 新闻文本分类 2种做法,F1=0.87_阿里云_10

5、WordVec+TextCNN(卷积神经网络)

  • 原理:
  • 运行结果
F1_Score  = 0.8562


标签:NLP,F1,tfidf,train,0.87,分类器,csv,data
From: https://blog.51cto.com/gwj1314/6044804

相关文章

  • CF1693 ABCD 题解
    题目链接:https://codeforces.com/contest/1693这场的题都非常好啊……因为现在是从div1开始做了,所以可能刚开始会有点吃力(这场我就会做一个1B呜呜呜)1A先把后缀的极......
  • 每日一道思维题——CF1761C - Set Construction
    题意:存在一个n×n的01矩阵(i,j)处值为1代表Ai 是Aj的真子集,求出这个集合A思路:我们在一开始的时候将每个位置赋初值,若i处的值是j的真子集将i处的值赋值给j代码:#inc......
  • CF1511G Chips on a Board
    CF1511GChipsonaBoard比较有启发性的一道题。询问是最简单的nim游戏,不难发现若一列上有两个棋子,那么这两个棋子对于答案是没有贡献的,因此可以令\(c_i\)表示第\(......
  • CF14D题解
    CF14DTwoPaths题解题目链接传送门题意简述给定一棵树,找出两条不经过相同点的最长路径,使得他们的长度乘积最大。题目分析首先,如果在一棵树上,两条路径没有共同的点,那......
  • CF1785B Letter Exchange 题解(思维+模拟)
    题目链接难度:绿+。题意给定\(t\)组testcase,每组testcase如下。有\(m\)个长度为3的字符串,每个字符都是\(\text{w}\)、\(\text{i}\)、\(\text{n}\)中的一个,一......
  • [CF1190D] Tokitsukaze and Strange Rectangle
    题目描述Thereare$n$pointsontheplane,the$i$-thofwhichisat$(x_i,y_i)$.Tokitsukazewantstodrawastrangerectangularareaandpickallt......
  • [SA记录] CF1073G Yet Another LCP Problem
    一开始刚看这题时感觉什么思路都没有,不过后来做完P4248[AHOI2013]差异和P7409SvT后再看感觉稍微好一点。这3道题都是SA+单调栈的套路。这一种套路看起来似乎基本都是处......
  • CF1139D Steps to One
    StepstoOne初始给一个空的数列,每次随机从\(\left[1,m\right]\)中选一个整数加入数列末尾,求数列\(\gcd=1\)时的期望长度。这是一个期望加莫反的很有意思的题目......
  • CF1333F Kate and imperfection 题解 线性筛
    题目链接:http://codeforces.com/problemset/problem/1333/F题目大意:kate有一个集合S,S中的元素是1到n的整数她认为集合S的一个子集M的集合的不完美值等于\(\max_{a,b\in......
  • CF1787G Weighed Tree Radius
    CF1787GWeighedTreeRadius前言:NGC5457发现这道题的题目名字打错了,应用"Weighted"而非"Weighed"。首先将“半径”转化为求直径的一半,这样考虑的东西就是不带有方......