【学习笔记】新闻文本分类(一)——TF-IDF

本文介绍了参加NLP比赛的流程,以新闻分类为例,数据包含14个类别,已做匿名处理。提出了四种解决思路,包括TF-IDF与机器学习分类器结合。详细分析了TF-IDF特征提取方法,展示了如何使用不同分类器(如岭回归、朴素贝叶斯、决策树、随机森林、XGBoost和LightGBM)并比较它们的F1分数。结果显示LightGBM表现最佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

打算从简单的比赛开始,熟悉NLP比赛规范的流程,根据官方提供的教程认真学习

赛题

题目

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

赛题数据由以下几个部分构成:训练集20w条样本,测试集A包括5w条样本,测试集B包括5w条样本。为了预防选手人工标注测试集的情况,我们将比赛数据的文本按照字符级别进行了匿名处理。处理后的赛题训练数据如下:

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}

赛题数据来源为互联网上的新闻,通过收集并匿名处理得到。因此选手可以自行进行数据分析,可以充分发挥自己的特长来完成各种特征工程,不限制使用任何外部数据和模型。

数据列使用\t进行分割,Pandas读取数据的代码如下:

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

评测标准

在这里插入图片描述

from sklearn.metrics import f1_score
y_true = [0, 1, 2, 0, 1, 2]
y_pred = [0, 2, 1, 0, 0, 1]
f1_score(y_true, y_pred, average='macro')

回顾下查准率P(Precision,准确率)与查全率R(Recall,召回率)的定义:

- 预测为正 预测为反
实际为正 TP FN
实际为反 FP TN

举例:400个瓜,模型预测100个为好瓜,300个为坏瓜:

  • 100个好瓜中,真的好瓜有30个,真的坏瓜有70个
  • 300个坏瓜中,真的好瓜有100个,真的坏瓜有200个

P = T P / ( T P + F P ) = 30 / 100 P = TP/(TP+FP)=30/100 P=TP/(TP+FP)=30/100
R = T P / ( T P + F N ) = 30 / 130 R = TP/(TP+FN)=30/130 R=TP/(TP+FN)=30/130

几种思路

由于文本数据是一种典型的非结构化数据,因此可能涉及到特征提取和分类模型两个部分。为了减低参赛难度,官方提供了一些解题思路供大家参考:

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

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

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

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

数据读取与分析

读数据

\t为分隔符(按tab分割),是因为文本中包含了\t
在这里插入图片描述

先读取100行:

在这里插入图片描述

统计句子长度

通过分割空格的方法,可以快速统计字符个数,得到句子长度:
在这里插入图片描述
绘制直方图📊,可以看到大部分句子长度集中在0~2000以内
在这里插入图片描述

统计小句子数量

假设字符3750是逗号,每句话按这个分割,统计出一篇文章平均有38个句子,最短的文章一个句子,最长的文章341个句子。
在这里插入图片描述

统计类别分布

接下来统计类别,查看每类标签下有多少样本

在这里插入图片描述

统计字符分布

统计每个字符出现的次数,首先可以将训练集中所有的句子进行拼接进而划分为字符,并统计每个字符的个数。

从统计结果中可以看出,在这100个样本中总共包括2405个字,其中编号3750的字出现的次数最多,编号5034的字出现的次数最少。
在这里插入图片描述
由于单词都被匿名化,每个句子中都出现的单词很可能是标点符号,下面代码统计了不同字符在句子中出现的次数,其中字符3750,字符900和字符648在20w新闻的覆盖率接近99%,很有可能是标点符号
在这里插入图片描述

统计每类新闻中出现次数最多的字符

首先使用groupby方法,对类别分组
在这里插入图片描述
在这里插入图片描述
可以看出第0类样本,出现频率最高的单词是3750,其次是648,然后是900.

数据分析结论

  1. 大部分句子长度在1000左右,需要进行截断
  2. 句子长度存在长尾效应
  3. 类别不均衡现象存在,科技类新闻样本量接近4w,星座类新闻样本量不到1k;
  4. 赛题总共包括7000-8000个字符

思路1:TF-IDF + 机器学习分类器

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

文本表示方法:

one-hot

每个单词都是一个离散的向量表示:
句子1:我 爱 北 京 天 安 门
句子2:我 喜 欢 上 海

首先对所有句子的字进行索引,即将每个字确定一个编号:

### 文本分析分词实现代码示例 对于文本分析中的分词处理,可以采用多种方法和技术。以下是几种不同的实现方式。 #### 方法:基于正则表达式的简单分词 这种方法适用于初步的英文文本分割,通过`re`模块来进行简单的模式匹配和拆分[^2]。 ```python import re from collections import Counter def get_char(txt): vlist = re.findall(r'\b\w+\b', txt.lower()) vdic_fre = Counter(vlist) vdic_sort = vdic_fre.most_common() return vdic_sort if __name__ == '__main__': with open('test.txt', 'r', encoding='utf-8') as f: vtext = f.read() vstr = get_char(vtext) print('列出文本中的单词:') print(vstr) ``` 此段代码展示了如何利用正则表达式来识别并统计文档内的词汇频率,特别适合于英语或其他西欧语言文字的处理。 #### 方法二:使用Jieba库进行中文分词 针对中文文本,则推荐使用专门设计用来处理汉语语料的工具包——`jieba`。该库能够有效地完成高质量的中文词语切分工作[^3]。 ```python import jieba with open('华为笔记本.txt','r',encoding='utf-8') as file: content = file.read() words = jieba.lcut(content) word_count = {} for word in words: if len(word)>=2 and not word.isspace(): word_count[word] = word_count.get(word, 0) + 1 sorted_words = sorted([(v,k) for k,v in word_count.items()], reverse=True)[:10] print(sorted_words) ``` 上述脚本实现了对指定文件中内容执行精确模式下的分词操作,并统计了各词条出现次数,最后输出前十高频次条目及其对应数量。 #### 方法三:构建TF-IDF向量空间模型 当涉及到更加复杂的自然语言处理任务时,比如分类或者聚类算法之前的数据预处理阶段,通常会先将原始文本转换成数值形式表示。这里介绍种常见的做法即运用Scikit-Learn框架里的`TfidfVectorizer`类创建加权矩阵[^1]。 ```python from sklearn.feature_extraction.text import TfidfVectorizer corpus = [ "这是个示例文本", "这是另个示例文本", "个更长的示例文本" ] vectorizer = TfidfVectorizer() X = vectorizer.fit_transform(corpus) print(X.toarray()) ``` 这段程序片段说明了怎样快速建立组文档对应的TF-IDF权重表征,这对于后续机器学习建模非常有用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值