序言

从今天开始入门学习NLP,虽然有点晚,但是我觉得任何时候都值得开始,尤其是面对你去感兴趣的事情。今天的任务是 【零基础入门NLP - 新闻文本分类】,这是天池大赛中的入门级算法比赛,入口链接请自取【在这里】。目前正式赛已经结束了,不过赛道同时也开放了长期赛,正好适合我这样的新手练习和学习。

1. 理解题意

  • 简单总结一下。赛题中的文本数据来源于新闻文本,但是所有文本内容已经按照字符集进行匿名处理。总共有14个待分类的类别,包括:科技,股票,体育,娱乐,时政等。所提供的训练数据的数据量是20w,测试数据的数据量是5w。接下来我们利用pandas读取并先初步了解数据的整体情况。
  • 评估指标:类别f1_score的均值
  • 数据
# 1. 读取 查看数据
train_data = pd.read_csv("dataset/train_set.csv", sep='\t')
print(train_data.head(5))
"""label\ttext
0  2\t2967 6758 339 2021 1854 3731 4109 3792 4149...
1  11\t4464 486 6352 5619 2465 4802 1452 3137 577...
2  3\t7346 4068 5074 3747 5681 6093 1777 2226 735...
3  2\t7159 948 4866 2109 5520 2490 211 3956 5520 ...
4  3\t3646 3055 3055 2490 4659 6065 3370 5814 246...print(train_data.describe())
"""
"""label
count  200000.000000
mean        3.210950
std         3.084955
min         0.000000
25%         1.000000
50%         2.000000
75%         5.000000
max        13.000000
"""
# 其中25%说的是排序之后排在25%位置的数 训练的样本树是20万# 2. 长度分布情况
#新闻文本句子长度分布情况
train_data['text_len'] = train_data['text'].apply(lambda x : len(x.split(' ')))
print(train_data['text_len'].describe())"""
count    200000.000000
mean        907.207110
std         996.029036
min           2.000000
25%         374.000000
50%         676.000000
75%        1131.000000
max       57921.000000
Name: text_len, dtype: float64
"""
# 平均值是907,新闻的长度比较长。最短的是2个。
# 查看文本长度直方图,看看句子的长度的分布情况#绘制句子长度的直方图
import matplotlib.pyplot as pltplt.hist(train_data['text_len'],bins=100)
plt.xlabel('Length')
plt.ylabel('Numbers')
plt.title('Histogram of xinwen length')
plt.show()

# 查看文本长度直方图,看看句子的长度的分布情况#绘制句子长度的直方图
train_data['label'].value_counts().plot(kind='bar')
plt.title('Histogram of category')
plt.xlabel("category")
plt.ylabel("Numbers")
plt.show()"""
{'科技': 0, '股票': 1, '体育': 2, '娱乐': 3, '时政': 4, '社会': 5, '教育': 6, '财经': 7, '家居': 8, '游戏': 9, '房产': 10, '时尚': 11, '彩票': 12, '星座': 13}
类别的分布也不是平衡的,甚至可以说差距还是蛮大的

2. 解决思路

思路一:词频权重 岭回归分类器

def count_rl():"""tfidf + 岭回归分类器:return:"""df = pd.read_csv('dataset/train_set.csv', sep='\t')CountVec = CountVectorizer(max_features=4000)train_text = CountVec.fit_transform(df.text)# 这里的train_text实际上保存了一个词频数量的矩阵。# print(train_text.toarray())words = CountVec.get_feature_names_out()print("个数:{} 单词:{}".format(len(words), words))# 我们直接获得结果,因此尽可能使用较多的训练数据x_train, x_val, y_train, y_val = train_test_split(train_text, df.label, test_size=0.25, random_state=0)clf = RidgeClassifier()clf.fit(x_train, y_train)val_pre = clf.predict(x_val)score_f1 = f1_score(y_val, val_pre, average='macro')print('CountVectorizer + RidgeClassifier : %.4f' % score_f1)# CountVectorizer + RidgeClassifier : 0.8198# 预测结果test_df = pd.read_csv('dataset/test_a.csv')test_count = CountVec.transform(test_df.text)test_pre = clf.predict(test_count)write_the_result(test_pre, "results/test_result_cv_rl.csv")

测试集上的结果可达0.8165

思路二:词频权重 岭回归分类器

def tfidf_rl():"""tfidf + 岭回归分类器:return:"""# 获取训练数据df = pd.read_csv('dataset/train_set.csv', sep='\t')Tfidf = TfidfVectorizer(max_features=4000)train_tfidf = Tfidf.fit_transform(df.text)# 这里的train_text实际上保存了一个词频数量的矩阵。# print(train_text.toarray())x_train, x_val, y_train, y_val = train_test_split(train_tfidf, df.label, test_size=0.25, random_state=0)clf = RidgeClassifier()clf.fit(x_train, y_train)val_pre = clf.predict(x_val)score_f1 = f1_score(y_val, val_pre, average='macro')print('Tfidf + RidgeClassifier : %.4f' % score_f1)# Tfidf + RidgeClassifier : 0.8826# 预测结果test_df = pd.read_csv('dataset/test_a.csv')test_tfidf = Tfidf.transform(test_df.text)test_pre = clf.predict(test_tfidf)write_the_result(test_pre, "results/test_result_tfidf_rl.csv")

测试集上的结果可达0.8835

3. 完整代码

点击自取,一起学习。【在这里】

随后如果有更多的解题思路,我也会持续更新。最后再引用一句蔡元培先生的话作为文章的结尾吧。

“今日所与诸君陈说者只此,以后会晤日长,随时再为商榷可也。”

【初学者入门】零基础入门NLP - 新闻文本分类相关推荐

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

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

  2. 零基础入门NLP - 新闻文本分类

    本文是对阿里云新人竞赛中的"零基础入门NLP - 新闻文本分类"解体过程进行的记录,目前仅使用了textCNN模型进行预测,后续还会考虑使用LSTM进行对比. 赛题数据 赛题以新闻 ...

  3. 零基础入门NLP - 新闻文本分类,正式赛第一名方案分享

    零基础入门NLP - 新闻文本分类,正式赛第一名方案分享:https://mp.weixin.qq.com/s/7WpZUqdlItBToLYuRLm44g

  4. 天池零基础入门NLP - 新闻文本分类Top1方案的bert4torch复现

    天池有些长期比赛可以练习玩玩(还可以继续提交),于是试了下简单的新闻文本分类任务,Top1的解决方案思路是"预训练+fgm+交叉验证模型融合",代码是基于bert4keras的,本 ...

  5. python爬虫教程入门-零基础入门Python爬虫不知道怎么学?这是入门的完整教程

    原标题:零基础入门Python爬虫不知道怎么学?这是入门的完整教程 这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑 ...

  6. java统计文本中英文单词个数split_零基础入门NLP - 新闻文本分类Task2(天池入门赛)...

    本章主要内容是主要是通过pandas模块来进行数据分析.(注:文章只是对天池入门赛课件的学习) 一.学习目标 1.学习使用pandas读取赛题规律 2.分布赛题数据的分布规律 二.数据读取 使用pan ...

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

    problem 1.赛题理解 数据集: 在NLP_data_list_0715.csv中,有三个链接. 分别可以下载训练集,测试集A,测试样例. f1_score介绍: F1分数(F1-score)是 ...

  8. 【学习笔记】零基础入门NLP - 新闻文本分类实战

    赛题理解   首先要理解赛题的背景及描述--赛题以新闻数据为赛题数据,数据集报名后可见并可下载.赛题数据为新闻文本,并按照字符级别进行匿名处理.整合划分出14个候选分类类别:财经.彩票.房产.股票.家 ...

  9. 【天池学习赛】零基础入门NLP - 新闻文本分类

    一.赛题描述 赛题数据为新闻文本,并按照字符级别进行匿名处理.整合划分出14个候选分类类别:财经.彩票.房产.股票.家居.教育.科技.社会.时尚.时政.体育.星座.游戏.娱乐的文本数据. 赛题任务:赛 ...

最新文章

  1. html设备监控系统模板,蓝色的远程监控设备系统后台管理界面模板
  2. ubuntu vscode_如何在Ubuntu-18.04下用VSCode编译LibTorch
  3. Windows系统漏洞学习总结
  4. 【题解】Luogu P2783 有机化学之神偶尔会做作弊
  5. 蚂蚁金服疯了吗?大动作,非裁员,年底全员涨薪又涨假期!!!
  6. python print 分隔符_python print 使用分隔符 或行尾符
  7. 3D打印切片软件Cura的简单使用
  8. MP2669GR-锂电池充电管理芯片
  9. 锂电池是什么材料做的
  10. ecshop 框架 简单分析
  11. Unity3D世界坐标和局部坐标的关系,之间转换浅谈
  12. 经典贪吃蛇大战逆向 去广告+游戏内购
  13. python Excel xlsx file; not supported
  14. tomcat禁止访问路径与文件、错误页面跳转配置
  15. java 实现输出水仙花数
  16. Python爬虫之初识简介以及舆情系统简介【爬虫篇一】
  17. 九马画山数命运, 一身伴君不羡仙! 与代码不离不弃!
  18. 爬虫学的好,牢饭吃的好 (入门篇)
  19. 微信小程序傻瓜制作_不会编程,如何傻瓜式一键制作一个微信小程序?
  20. python批量删除微信好友_Python找出微信上删除你好友的人脚本写法

热门文章

  1. VPS2103 电流模式 PWM 控制器 4-50V IN /90V/0.1Ω功率管
  2. uni-app和微信原生小程序的工具请求文件
  3. 程序员的脑回路到底有多新奇?
  4. 新概念英语第二册单词
  5. Win10小喇叭显示红叉,显示未找到输出设备的解决方式
  6. 互联网测试校招系列3:笔试篇
  7. html5e插件,前端vscode必备插件,给你更好的编程体验!
  8. 又又被报道赴美IPO,跨境电商独角兽Shein价值几何?
  9. 时辰查小时 api数据接口
  10. C语言sizeof与strlen的区别与使用