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

news/2024/11/8 8:53:24/

序言

从今天开始入门学习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. 完整代码

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

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

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


http://www.ppmy.cn/news/468886.html

相关文章

【Python数据挖掘】数据可视化及数据对象的相似性度量算法详解(超详细 附源码)

需要PPT和源码请点赞关注收藏后评论区留言私信~~~ 一、数据可视化 数据可视化(Data Visualization)通过图形清晰有效地表达数据。它将数据所包含的信息的综合体,包括属性和变量,抽象化为一些图表形式。 数据可视化方法包括&…

伪造语音检测数据集

年份名称伪造类型数据集2015ASVspoof2015语音合成、语音转换https://datashare.ed.ac.uk/handle/10283/8532016 BTAS2016 语音合成、语音转换、重放https://www.idiap.ch/en/dataset/avspoof2017ASVspoof2017语音重放https://datashare.ed.ac.uk/handle/10283/30552019ASVspoof…

openwrt netstat命令参数和使用详解

openwrt的netstat属于名为busybox的工具集,该工具集专用于嵌入式Linux,其参数很简单。 居然在Linux上没有netstat的-p选项。 因此想知道哪个进程正在监听哪个端口时,只能看到有哪个监听端口,而不能知道它属于哪个进程。 lsof也没有-i选项。openwrt netstat命令参数和使用详…

Rust语言从入门到入坑——(4)Rust语法(中)

文章目录 0 引入1、函数1.1、函数参数1.2、函数体1.3、函数返回值 2、条件语句3、循环3.1 、while3.2 、for3.3 、loop循环 4、总结 0 引入 在这里我们需要介绍Rust语法,一共分三部分,第二部分主要是一些如函数,编程中的循环等语法的介绍&am…

红外编解码模块YS-NEC使用

YS-NEC红外编解码模块使用起来非常方便。 通过其解码功能可以将NEC编码格式的红外信号解码为用户码和命令码其中用户码16位,命令码8位共3个字节的编码即满足了学习红外指令的要求。(其通过串口将数据发送给MCU默认波特率9600), …

NEC系列IC解密

针对NEC系列IC解密、单片机解密,深圳芯片解密研究所目前已经成功突破多种型号的解密技术,通过对每一款芯片解密技术手法的反复实验和多次对比验证,我们能为每一款芯片提供高效、可靠、极具竞争优势的解密方案。 NEC电子总部位于日本川崎市。作…

NEC红外(ir)解码协议

目录 一、时序二、代码实现 一、时序 一个完整的NEC解码协议&#xff0c;由以下几个部分组成&#xff0c;其中数据位为低位先行 详细的数据格式如下&#xff0c;其中如果一直按住一个按钮的时候&#xff0c;会隔110ms左右发一次引导码 二、代码实现 #include <string.…

nec编码红外遥控原理整理

遥控 &#xff1a;NEC 编码 960nm的波长 晶振为455KHZ&#xff0c;对应的发射频率(载波频率)为38KHZ&#xff0c; 遥控ID为0(即系统识别码)&#xff0c;反码为255&#xff0c;不同的遥控ID有可能不一样。 接收头&#xff1a;1838 遥控码由三部分组成 1、引导码 9ms的高电平 4…