【新闻文本分类】(task1)赛题数据分析

举报
野猪佩奇996 发表于 2022/01/23 00:02:42 2022/01/23
【摘要】 学习总结 (1)要熟悉pandas、matplotlib等工具包,如train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join...

学习总结

(1)要熟悉pandas、matplotlib等工具包,如train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))以空格为分隔提取每个单词后存取set去重再转为list操作,得到去重后的text_unique列。
(2)文本分类问题,需要根据每句的字符进行分类。难点是需要对匿名字符进行建模(不能直接使用中文分词等操作),进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取和分类模型两个部分。
(3)几个大体的思路:
【思路1】:TF-IDF提取特征 + 机器学习分类器
直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost等机器学习分类器。
【思路2】:FastText
【思路3】:Word2Vec + 深度学习分类器:WordVec词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。
【思路4】:Bert词向量

一、NLP 赛题理解

1.1 题目

赛题介绍:https://tianchi.aliyun.com/competition/entrance/531810/introduction
赛题以匿名处理后的新闻数据为赛题数据,数据集报名后可见并可下载。赛题数据为新闻文本,并按照字符级别进行匿名处理。整合划分出 14 个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐的文本数据。

赛题数据由以下几个部分构成:
训练集 20w 条样本,测试集 A 包括 5w 条样本,测试集 B 包括 5w 条样本。
为了预防选手人工标注测试集的情况,将比赛数据的文本按照字符级别进行了匿名处理。评价标准为类别 f1_score 的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。

处理后的赛题训练数据如下:

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}

1.2 评测指标

评价标准为类别f1_score的均值,选手提交结果与实际测试集的类别进行对比,结果越大越好。

1.3 大体思路

文本分类问题,需要根据每句的字符进行分类。难点是需要对匿名字符进行建模(不能直接使用中文分词等操作),进而完成文本分类的过程。由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取和分类模型两个部分。

思路1:TF-IDF + 机器学习分类器
直接使用TF-IDF对文本提取特征,并使用分类器进行分类。在分类器的选择上,可以使用SVM、LR、或者XGBoost。

思路2:FastText
FastText是入门款的词向量,利用Facebook提供的FastText工具,可以快速构建出分类器。

思路3:Word2Vec + 深度学习分类器
WordVec是进阶款的词向量,并通过构建深度学习分类完成分类。深度学习分类的网络结构可以选择TextCNN、TextRNN或者BiLSTM。

思路4:Bert词向量
Bert是高配款的词向量,具有强大的建模学习能力。

二、读取比赛数据

天池:https://account.aliyun.com/login/login.htm
下载比赛数据集,https://tianchi.aliyun.com/competition/entrance/531810/introduction
读取比赛数据集,读取代码:

import pandas as pd
# nrows为读取的行数
train_df = pd.read_csv('train_set.csv', sep='\t', nrows=100)
train_df['word'] = train_df['text'].apply(lambda x: len(x.split(' ')))

  
 
  • 1
  • 2
  • 3
  • 4

读取数据集的前几行,第一列(label列)为新闻的类别,第二列(text列)为新闻的字符:

   label                                               text  word
0      2  2967 6758 339 2021 1854 3731 4109 3792 4149 15...  1057
1     11  4464 486 6352 5619 2465 4802 1452 3137 5778 54...   486
2      3  7346 4068 5074 3747 5681 6093 1777 2226 7354 6...   764
3      2  7159 948 4866 2109 5520 2490 211 3956 5520 549...  1570
4      3  3646 3055 3055 2490 4659 6065 3370 5814 2465 5...   307

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、对数据集字符进行可视化,统计标签和字符分布

统计数据集中所有句子所包含字符的平均个数
统计数据集中不同类别下句子平均字符的个数
统计数据集中类别分布的规律
统计数据集中不同类别下句子中最常见的5个字符

3.1 句子长度分析

# 句子长度分析
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())

  
 
  • 1
  • 2
  • 3

apply是作用于每行中,lambda是匿名函数得到每坨东西的单词长度x。
在这里插入图片描述

# 绘制单词数直方图,bins指定区间长度
_ = plt.hist(train_df['text_len'], bins = 200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")

  
 
  • 1
  • 2
  • 3
  • 4

绘制每个单词数对应的数量,bins指定每个柱子的区间长度。
在这里插入图片描述

3.2 新闻类别分布

train_df['label'].value_counts().plot(kind = 'bar')
plt.title('News class count')
plt.xlabel("category")

hist2 = plt.hist(train_df['label'])
plt.xlabel('category')
plt.title("News class count")

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述
在训练集中科技类新闻最多,其次是股票类新闻,最少的新闻是星座新闻。
如果用上面hist2的方法也能画:
在这里插入图片描述

3.3 字符分布统计

首先可以学习一个字典排序栗子(用到lambda表达式):

# 字典排序栗子
dict1 = {'a': 1, 'b': 4, 'c': 0}
# 以列表形式输出字典dict1的key
# dict1.items()为字典的键值对
lst1 = [key for key, value in dict1.items()]
print(lst1) # ['a', 'b', 'c']

# 颠倒字典的key:value值
dict2 = {value: key for key, value in dict1.items()}
print(dict2) # {1: 'a', 4: 'b', 0: 'c'}

# 将字典dict1按照value值进行排序,得到列表形式 
lst2 = sorted(dict1.items(), key = lambda x: x[1])
print(lst2) # [('c', 0), ('a', 1), ('b', 4)]
"""
这里的items()是字典的键值对,即待排序的对象;
key = lambda x: x[1]为前面对象的第二位数据的值(即value)进行排序
key = lambda 变量:变量[维数]
"""

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

有了上面基础后,我们现在要统计不同单词的出现次数(并进行排序):

# 字符分布统计
from collections import Counter
# 把所有text的元素拼接成一个大字符串
all_lines = ' '.join(list(train_df['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(),
                    key = lambda d: d[1],
                    reverse = True)
print("不同的单词的个数:", len(word_count))
print("出现最多的单词:", word_count[0])
print("出现最少的单词:", word_count[-1])

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
不同的单词的个数: 2405
出现最多的单词: ('3750', 3702)
出现最少的单词: ('5034', 1)

  
 
  • 1
  • 2
  • 3

现在要统计不同字符在所有句子中的出现比率,和上面一样也是先拼接成一个包含所有字符的string字符串,为了统计出现的每个单词的出现个数,先去重:' '.join(list(set(x.split(' '))))以空格为分割找到每个单词,然后把这些单词用set去重后再转为list。

后面通过Counter得到得到一个字典列表word_count({'3750': 99, '900': 99}),value即对应单词key的个数。
(下面第一行代码不要被劝退到,看lambda里面的东西,参考上面我的解释~)

# 统计不同字符在所有句子中的出现比率
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
# 拼接所有的单词成为一个大的字符串
all_lines = ' '.join(list(train_df['text_unique']))
# 得到一个字典列表word_count({'3750': 99, '900': 99})
word_count = Counter(all_lines.split(" "))
# print("===验证一波===", word_count)
word_count = sorted(word_count.items(),
                    key = lambda d: int(d[1]),
                    reverse = True)
print(word_count[0])
print(word_count[1])
print(word_count[2])
# ('648', 96)表示648字符在20w新闻的出现比率为96%

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

附:打卡清单

任务名称 难度 所需技能
报名比赛,下载比赛数据集并完成读取 低 Pandas
对数据集字符进行可视化,统计标签和字符分布 中 Pandas
使用 TFIDF 提取文本特征 中 Sklearn
使用 TFIDF 特征 和 线性模型完成训练和预测 中 Sklearn
使用 TFIDF 特征 和 XGBoost 完成训练和预测 中 Sklearn、XGBoost
学会训练 FastText、Word2Vec 词向量 中 FastText、gensim
使用 Word2Vec 词向量,搭建 TextCNN 模型训练预测 高 Pytorch、Keras
使用 Word2Vec 词向量,搭建 BILSTM 模型训练预测 高 Pytorch、Keras
学会 Bert 基础,transformer 库基础使用 中 Pytorch、transformer
使用 Bert 在比赛数据集中完成预训练 高 Pytorch、transformer
使用 Bert 在比赛数据集上完成微调 高 Pytorch、transformer

具体打卡要求
需要使用Python环境下Notebook完成任务
需要完成所有的任务细节才算完成一个任务
所有的任务可以写在一个Notebook内

Reference

(1)https://tianchi.aliyun.com/competition/entrance/531810/introduction

文章来源: andyguo.blog.csdn.net,作者:山顶夕景,版权归原作者所有,如需转载,请联系作者。

原文链接:andyguo.blog.csdn.net/article/details/121109171

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。