赛题介绍

地址:https://tianchi.aliyun.com/competition/entrance/531810/introduction

赛题背景:

  • 要求选手根据新闻文本字符对新闻的类别进行分类
  • 带大家接触NLP的预处理、模型构建和模型训练等知识点。
  • 为本赛题定制了系列学习方案,其中包括数据科学库、通用流程和 baseline方案学习三部分。

赛题数据:

  • 赛题数据为,新闻文本
  • 按照字符级别进行匿名处理
  • 整合划分出14个候选分类类别:财经、彩票、房产、股票、家居、教育、科技、社会、时尚、时政、体育、星座、游戏、娱乐。
  • 训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本

评测标准与读取方式:

数据分析与处理

首先我们需要读出数据,但这个数据有点大,训练集20w的样本大概就900M了,所以需要根据电脑内存情况来使用pandas的参数,最简单的可以是默认读取,那读出来就是一个dataframe,方便之后做操作:

train_df = pd.read_csv('train_set.csv', sep='\t')

而若是内存不够,则需要使用下面两种方式读或者看数据:

train_tfr = pd.read_csv('train_set.csv', sep='\t', chunksize=20000)
data = pd.DataFrame()
for train_data in train_tfr:data = data.append(train_data,ignore_index=True)
data.shape


或者使用iterator参数,它相当于内置了一个生成器yield,可以根据想要的数据量进行取值,下次再使用get_chunk的时候,将拿到上一次结尾的数据,这也符合yield定义:

train_tfr = pd.read_csv('train_set.csv', sep='\t', iterator=True)
train_tfr.get_chunk(100)

有了数据后,我们就可以进行相关的信息统计:

train_df.head(5)"""
label   text    text_len
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
"""

然后使用描述性统计看看它的分布情况,这里可以取前一百条:

data.describe()"""label
count   100.000000
mean    3.770000
std 3.489826
min 0.000000
25% 1.000000
50% 2.500000
75% 6.000000
max 13.000000
"""

因为文本数据是非结构化数据,没有标准化或者缺失值异常值的处理,所以大致看明白数据长什么样,知道它是一个中英文本,以及赛题介绍的类别,我们就可以更进一步的分析与可视化了。

%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())


这里我们知道,删除空格造成的干扰后,包括字符一起,文本的平均长度是907,标准差是996,那从这两个数据可以得到样本比较稳定,趋向于正态,而最大与最小之间的差距,可能需要做一下归一化,更准确来讲可能是需要做截断。

_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")


这也应征了上面的想法,如果在结构化数据里,这已经产生偏态了。

kind = pd.DataFrame(train_df['label'].value_counts()).reset_index()
fig = px.pie(kind,names="index",values="label")
fig.show()

from collections import Counter
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)) # 6869print(word_count[0]) # ('3750', 7482224)print(word_count[-1]) # ('3133', 1)

从统计结果中可以看出,在训练集中总共包括6869个字,其中编号3750的字出现的次数最多,编号3133的字出现的次数最少。这里还可以根据字在每个句子的出现情况,反推出标点符号。下面代码统计了不同字符在句子中出现的次数,其中字符3750,字符900和字 符648在20w新闻的覆盖率接近99%,很有可能是标点符号。

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 = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse = True)print(word_count[0]) # ('3750', 197997)print(word_count[1]) # ('900', 197653)print(word_count[2]) # ('648', 191975)

TF-IDF + RidgeClassifier

import pandas as pdfrom sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import RidgeClassifier
from sklearn.metrics import f1_scoretfidf = TfidfVectorizer(ngram_range=(1,3), max_features=3000)
train_test = tfidf.fit_transform(train_df['text'])clf = RidgeClassifier()
clf.fit(train_test[:10000], train_df['label'].values[:10000])val_pred = clf.predict(train_test[10000:])
print(f1_score(train_df['label'].values[10000:], val_pred, average='macro'))"""
0.87
"""

不知道为什么第一次线上反而比线下低0.3以上?可能是我数据有问题,之前做探索性分析的时候做了很多变换。

然后用lr跑一下试试,最终达到了0.938的成绩,看来这个数据还是挺简单的,而且基本没有过拟合:

新闻文本分类学习笔记相关推荐

  1. 零基础入门NLP - 天池新闻文本分类Task3笔记

    零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...

  2. 商品评价判别,文本分类——学习笔记

    FASTTEXT(Facebook开源技术) 二分类任务,监督学习. 自然语言 NLP自然语言处理 步骤: 语料Corpus:好评和差评 分词Words Segmentation:基于HMM构建dic ...

  3. 深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

    文章目录 一.前期工作 1. 设置GPU 2. 导入预处理词库类 二.导入预处理词库类 三.参数设定 四.创建模型 五.训练模型函数 六.测试模型函数 七.训练模型与预测 今天给大家带来一个简单的中文 ...

  4. 【nlp】天池学习赛-新闻文本分类-深度学习1

    目录 1.FastText 1.1.FastText网络结构 1.2.基于fastText的文本分类 2.word2vec训练词向量及使用 2.1.用jieba对语料进行分词处理 2.2.用LineS ...

  5. Datawhale组队学习-NLP新闻文本分类-TASK06

    Task6 基于深度学习的文本分类3 基于深度学习的文本分类 学习目标 了解Transformer的原理和基于预训练语言模型(Bert)的词表示 学会Bert的使用,具体包括pretrain和fine ...

  6. 【nlp】天池学习赛-新闻文本分类-机器学习

    目录 1.读取数据 查看句子长度 2.可视化 2.1.新闻的字数分布 2.2.新闻文本类别统计 3.数据分析 3.1.统计每个字符出现的次数 3.2.统计不同字符在句子中出现的次数 4.文本特征提取 ...

  7. NLP入门竞赛,搜狗新闻文本分类!拿几十万奖金!

    该数据集来自若干新闻站点2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据. 根据新闻正文内容分析新闻的类别数据集官网链接: http://www.sogou.com/labs ...

  8. Task01——零基础入门NLP - 新闻文本分类之赛题理解

    本篇目标 首先本篇文章会对赛题进行介绍以及个人对赛题的理解,带大家接触NLP的预处理.模型构建和模型训练等知识点. 赛题介绍 赛题名称:零基础入门NLP - 新闻文本分类 赛题任务:赛题以自然语言处理 ...

  9. NLP入门竞赛,搜狗新闻文本分类

    该数据集来自若干新闻站点2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据. 根据新闻正文内容分析新闻的类别数据集官网链接: http://www.sogou.com/labs ...

  10. 【项目实战课】NLP入门第1课,人人免费可学,基于TextCNN的新闻文本分类实战...

    欢迎大家来到我们的项目实战课,本期内容是<基于TextCNN的新闻文本分类实战>. 所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解,可以 ...

最新文章

  1. 上周热点回顾(12.18-12.24)
  2. 关于GPU-driver for linux的资料
  3. js随机生成4位验证码
  4. NeuralFinder:集成人工生命和遗传算法自动发现神经网络最优结构
  5. linux之通过tail命令动态跟踪日志文件里面的末尾信息
  6. 【转】Spark源码分析之-scheduler模块
  7. 《Sklearn 与 TensorFlow 机器学习实用指南》 第6章 决策树
  8. python_类方法和静态方法
  9. python链表逆序实例_python 单链表翻转的简单示例
  10. 拓端tecdat|R语言实现有限混合模型建模分析
  11. python中read,readline,和readlines的区别 并逐行输出
  12. 黑群晖 DSM 6.2 3617 成功安装教程
  13. echarts官网demo
  14. PHP+Swoole 搭建 Websocket 聊天室
  15. 解决windows10密码正确,但是显示无法连接网络
  16. 8类网线利弊_浅析网线8芯线各自的作用
  17. 大富豪5.3全网首发,真正的5.3正版破解授权,不是高防端
  18. Kaggle比赛心得
  19. SpringBoot+Vue实现前后端分离教学评价系统
  20. 2021年全球与中国不锈钢反应堆行业市场规模及发展前景分析

热门文章

  1. WIN10为什么手机连接电脑开启热点后,电脑不能上网?
  2. 小米手机WIFI显示已连接,但无法访问互联网,新路由器其他设备都能连
  3. Hi3516d平台的usb功能调试记录
  4. java英文翻译_Java实现英文文本单词翻译器功能的简单实例
  5. STM32单片机bootloader扫盲
  6. 用Verilog实现数字钟
  7. C语言:十进制、BCD码互换
  8. linux图片卡通处理,Linux下声卡通 (转)
  9. c语言定义数组中字母怎么输入,c语言数组怎么输入?
  10. php微信问卷调查,We_Questionnaire: !!停止维护!!基于Thinkphp3.2.3 + jqueryMobile1.4.4的微信公众号应用 -- 移动端问卷调查...