中文文本分类
题目简介
赛题要求对商品标题进行分类,类似淘宝商品的中文文本标题作为特征,三级类别作为标签。评分占比:精度70% 效率30%
相关推荐
- 🚀 AI Power 高性价比云GPU租借/出租平台:现在注册并绑定(参考Github)即可获得高额算力,打比赛赶论文必备,奖励可随时提现。详情请参考AI Power指南
数据分析
数据格式
- 每行作为一个sample
中文文本 + 制表符 + 类别标签 - 训练集 50万 带标签样本,测试集 450万 无标签样本
- 每个标签带有三级关系,逐层递进细分
数据分布
- 数据不平衡 (Find 500000 samples in 22 1-class, 192 2-class, 1258 3-class)
总共50w训练样本中含有22个一级类别,192个二级类别,1258个三级类别
一级类别: 单一类最多包含样本: 82800, 最少: 350, 平均: 22727
二级类别: 单一类最多包含样本: 63999, 最少: 12, 平均: 2604
三级类别: 单一类最多包含样本: 26835, 最少: 11, 平均: 397
- 句长极差大
最长句长达 97, 最短 5, 平均 42
ML
数据预处理
中文导入
with codecs.open(input_file, encoding='gb18030', errors="ignore") as infs:
目前最新的标准是 GB18030 中文编码,按汉字收集量依次为 GB2312 < GBK < GB18030
jieba 分词
- 使用多线程加速分词速度,线程数取 CPU 核心数。
import jieba jieba.enable_parallel(cpu_count())
- 直接使用中文文本无法参与计算,需要把一段中文文本转换为一连串的数字才可以。sklearn 中对文本的处理默认是针对英文的,所以为了使用sklearn 把我们的句子转换成数字,需要让中文句子看起来像英文句子一样。
eg. I like artificial intelligence 我 喜欢 人工智能
jieba在分词的时候,空格也会算作一个字符,如果提前去掉可能会破坏句子原本的语义信息,所以我们在分词后去掉
这里采用 jieba分词 默认的精确模式,更多细节点这里。
jieba 关键词提取
除了以上分词方法之外,还可以直接提取关键词,这样做可以大大减少干扰项,降低数据维度,但也可能错过少量重要词汇。
同分布划分数据集
train_test_split(input_x,
input_y,
test_size=0.25,
random_state=66,
stratify=input_y
)
- 训练集测试集比例 3:1
- 随机数种子统一设置66,方便复现
stratify=input_y
我们的数据集不同类别所含数据量严重失衡,直接切分会导致切分后的测试集漏包含某些类别。总共1258类数据,直接切分后训练集包含1258类,测试集仅包含1253类数据,这会导致部分类别不参与测试,而且也没法绘制混淆矩阵。将所有的标签input_y
传入这个参数可以获得与原数据类别比例相同的测试集。
TF-IDF 词袋向量
- CountVectorizer 词袋模型
把训练集所有样本中出现的单词放入词袋,假设放入了5个词,那么每个句子将被表示成一个5维的向量,每一个维度的值表示一个特定词出现的次数。更多例子