新闻文本分类学习笔记
赛题介绍
地址: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的成绩,看来这个数据还是挺简单的,而且基本没有过拟合:
新闻文本分类学习笔记相关推荐
- 零基础入门NLP - 天池新闻文本分类Task3笔记
零基础入门NLP - 天池新闻文本分类 以下以Datawhale与天池举办的新闻文本分类这个NLP赛题做的NLP入门Task2笔记 赛题链接:https://tianchi.aliyun.com/co ...
- 商品评价判别,文本分类——学习笔记
FASTTEXT(Facebook开源技术) 二分类任务,监督学习. 自然语言 NLP自然语言处理 步骤: 语料Corpus:好评和差评 分词Words Segmentation:基于HMM构建dic ...
- 深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类
文章目录 一.前期工作 1. 设置GPU 2. 导入预处理词库类 二.导入预处理词库类 三.参数设定 四.创建模型 五.训练模型函数 六.测试模型函数 七.训练模型与预测 今天给大家带来一个简单的中文 ...
- 【nlp】天池学习赛-新闻文本分类-深度学习1
目录 1.FastText 1.1.FastText网络结构 1.2.基于fastText的文本分类 2.word2vec训练词向量及使用 2.1.用jieba对语料进行分词处理 2.2.用LineS ...
- Datawhale组队学习-NLP新闻文本分类-TASK06
Task6 基于深度学习的文本分类3 基于深度学习的文本分类 学习目标 了解Transformer的原理和基于预训练语言模型(Bert)的词表示 学会Bert的使用,具体包括pretrain和fine ...
- 【nlp】天池学习赛-新闻文本分类-机器学习
目录 1.读取数据 查看句子长度 2.可视化 2.1.新闻的字数分布 2.2.新闻文本类别统计 3.数据分析 3.1.统计每个字符出现的次数 3.2.统计不同字符在句子中出现的次数 4.文本特征提取 ...
- NLP入门竞赛,搜狗新闻文本分类!拿几十万奖金!
该数据集来自若干新闻站点2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据. 根据新闻正文内容分析新闻的类别数据集官网链接: http://www.sogou.com/labs ...
- Task01——零基础入门NLP - 新闻文本分类之赛题理解
本篇目标 首先本篇文章会对赛题进行介绍以及个人对赛题的理解,带大家接触NLP的预处理.模型构建和模型训练等知识点. 赛题介绍 赛题名称:零基础入门NLP - 新闻文本分类 赛题任务:赛题以自然语言处理 ...
- NLP入门竞赛,搜狗新闻文本分类
该数据集来自若干新闻站点2012年6月-7月期间国内,国际,体育,社会,娱乐等18个频道的新闻数据. 根据新闻正文内容分析新闻的类别数据集官网链接: http://www.sogou.com/labs ...
- 【项目实战课】NLP入门第1课,人人免费可学,基于TextCNN的新闻文本分类实战...
欢迎大家来到我们的项目实战课,本期内容是<基于TextCNN的新闻文本分类实战>. 所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解,可以 ...
最新文章
- 上周热点回顾(12.18-12.24)
- 关于GPU-driver for linux的资料
- js随机生成4位验证码
- NeuralFinder:集成人工生命和遗传算法自动发现神经网络最优结构
- linux之通过tail命令动态跟踪日志文件里面的末尾信息
- 【转】Spark源码分析之-scheduler模块
- 《Sklearn 与 TensorFlow 机器学习实用指南》 第6章 决策树
- python_类方法和静态方法
- python链表逆序实例_python 单链表翻转的简单示例
- 拓端tecdat|R语言实现有限混合模型建模分析
- python中read,readline,和readlines的区别 并逐行输出
- 黑群晖 DSM 6.2 3617 成功安装教程
- echarts官网demo
- PHP+Swoole 搭建 Websocket 聊天室
- 解决windows10密码正确,但是显示无法连接网络
- 8类网线利弊_浅析网线8芯线各自的作用
- 大富豪5.3全网首发,真正的5.3正版破解授权,不是高防端
- Kaggle比赛心得
- SpringBoot+Vue实现前后端分离教学评价系统
- 2021年全球与中国不锈钢反应堆行业市场规模及发展前景分析
热门文章
- WIN10为什么手机连接电脑开启热点后,电脑不能上网?
- 小米手机WIFI显示已连接,但无法访问互联网,新路由器其他设备都能连
- Hi3516d平台的usb功能调试记录
- java英文翻译_Java实现英文文本单词翻译器功能的简单实例
- STM32单片机bootloader扫盲
- 用Verilog实现数字钟
- C语言:十进制、BCD码互换
- linux图片卡通处理,Linux下声卡通 (转)
- c语言定义数组中字母怎么输入,c语言数组怎么输入?
- php微信问卷调查,We_Questionnaire: !!停止维护!!基于Thinkphp3.2.3 + jqueryMobile1.4.4的微信公众号应用 -- 移动端问卷调查...