No title
NLP新闻分类学习赛
https://tianchi.aliyun.com/competition/entrance/531810/forum
介绍
这只是一个经典的分类任务,从不等长的文本序列,得出一个新闻的分类,一共是13种新闻分类。
从分类算法的发展历史来说,这有800种方法可以完成
- 传统的机器学习算法
- CNN网络
- 新的预训练模型,基于Transformer结构的网络
数据
| 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 |
训练数据是长这样的。就是把汉字和标点替换成数字的匿名化处理。label是分类。这种匿名化实际上是没有什么用的,可以通过字频分析给它还原到原本的汉字。密码学真的天下第一。
这是标签
{‘科技’: 0, ‘股票’: 1, ‘体育’: 2, ‘娱乐’: 3, ‘时政’: 4, ‘社会’: 5, ‘教育’: 6, ‘财经’: 7, ‘家居’: 8, ‘游戏’: 9, ‘房产’: 10, ‘时尚’: 11, ‘彩票’: 12, ‘星座’: 13}
NLP分类的基本步骤
做CV那么久,NLP数据的预处理真的是非常麻烦。
向量化
- 可以使用One-hot编码
- 也可以用什么all_data2fold做等分
- 反正最后要放等长的Tensors进入网络
这代码也是叽里咕噜不知道在做什么东西。。。
分等长的10份,再做了一个index和text的字典。。。
拆分训练、验证集
从上述等分的fold中取几个为训练集
词汇表Vocab
词汇表构建(Vocabulary Building)是文本数据预处理中的关键步骤,涉及从训练语料中生成一个包含所有可识别单词、子词或字符的集合。
这是一个预处理的经典步骤,输入是所有句子,输出是一个字典
创建 label 和 index 对应的字典。
具体步骤如下:
- 创建 词 和
index对应的字典,这里包括 2 份字典,分别是:_id2word和_id2extword。 - 其中
_id2word是从新闻得到的, 把词频小于 5 的词替换为了UNK。对应到模型输入的batch_inputs1。 - 也有选择N个最大的词频做词汇表的做法。
_id2extword是从word2vec.txt中得到的,有 5976 个词。对应到模型输入的batch_inputs2。- 后面会有两个
embedding层,其中_id2word对应的embedding是可学习的,_id2extword对应的embedding是从文件中加载的,是固定的。 - 创建 label 和 index 对应的字典。
- 上面这些字典,都是基于
train_data创建的。 - 常见工具: 使用工具或库(如 Python 的
collections.Counter或NLTK)来统计词频。过小的词频就去掉。
一个去除了过小词汇的字典。
词汇表构建的关键在于从训练数据中提取并保存最常见的词汇,处理未登录词,并将词汇表映射到索引。在实际应用中,选择合适的词汇表大小和处理策略对于模型的性能至关重要。
网络
别看花里胡哨的写一堆
涉及时间序列的分类就用LSTM,BERT,不涉及的就可以不用这种时序网络。
中间步骤可以很复杂。
如果使用了预训练模型BERT,那么需要在它的基础上做微调,因为数据集做了匿名化处理,数据的分布是不受影响的,但是数据的表征有被影响。
最后保证输入输出的大小正确就大差不差了。
使用了BERT的模型还在跑
这是训练截图
在25W的数据集上跑了一个epoch。在测试集上面遇到了一个困难,主要是忘记加进度条了,失管失控的感觉,跑测试集3个小时出不来?
1 | 2025-12-09 10:52:38,624 INFO: Total 9000 docs. |
机器学习
这个跑出来的分类提交之后,分数只有0.06。
明明验证集的分数有0.74的,气死我了
1 | # Count Vectors + RidgeClassifier |
逆天

