从0到1构建新闻长文本分类系统

2023-11-05

新闻分类系统概述

新闻分类系统,顾名思义,就是对于一片新闻或者是一片文章,进行自动的分类,例如政治,财经,娱乐等等
从技术角度讲,其实属于自然语言处理中比较经典的文本分类问题。当然在一个工业级别的分类系统当中,会遇到各种各样的问题,例如语料优化,文本预处理,特征抽取,模型选择及融合,硬规则等一系列问题。本人有幸在国内某一线互联网公司做过相关的工作,故做一些总结。

分类系统架构设计

对于传统的分类系统来讲,就是如下这几个模块,包括文本预处理,特征抽取,特征选择,模型训练等。但是对于一个工业级的分类系统来说,这是远远不够的。
这里写图片描述
更加详细的分类模及每个模块的组件如下所示,将每个模块的结果都存入DataFlow用于定位问题。规则干预系统可以短期处理模型解决不了的case。
这里写图片描述

基本流程

  1. 文本预处理
    文本预处理主要是指分词(涉及到分词粒度的选取),停留词,高频词和低频词的过滤。值得注意的是,训练时的处理流程和预测时的处理流程要保持一致,否则很有可能出现训练和测试分词不一致的情况,从而影响整个分类系统的性能。

  2. 特征抽取
    特征抽取主要是从新闻的标题,正文中提取出特征,把新闻转换成固定维度的向量
    对于深度模型而言,可能不需要做特征抽取的工作,端到端直接训练即可。例如,fasttext,textcnn;
    对于传统的机器学习模型来说,特征工程的质量会直接影响模型的分类性能;
    在我的分类系统中,特征抽取主要包含三个方面:

    • n-gram单词特征
    • 实体归一化特征
    • 人工特征

    n-gram特征,即如果是uni-gram,文本里面每个单词就是一个特征,如果是bi-gram,那么文本里面连续的两个单词也是一个特征。通常来讲,一般是uni-gram+bi-gram。n如果很大的话,特征会非常稀疏,导致特征向量维度过大
    实体归一化特征是指,对于某些实体,可以将其映射到一个实体桶中,从而增加特征的泛化性能。例如"花千骨" ->“娱乐_电视剧”,“反恐精英” ->"游戏_射击游戏"等等。但有两个问题是,很多实体有歧义,对于这种实体可以不将其归一化,也可以根据上下文进行实体消歧(不在本文讨论范围内);第二个问题是实体归一化依赖于人工运营,且需要不断的更新,需要比较多的人力成本,但是对整个分类系统的改进也是非常明显的。
    人工特征其实就是认为的设计一些规则,如果命中规则,那么就补充特征。相比于硬规则(命中规则就分到某个类别),更加平滑。
    实际得到的特征是以上三类特征的级联

  3. 特征过滤及特征选择
    特征过滤:
    卡方检验进行特征选择:

  4. 基分类器的选取及训练
    选用了四个模型fasttext, svm, pa, nb

  • nb训练速度快,对于大规模训练语料,几分钟就能训练完,而且解释性比较好。但缺点就是模型分类性能比较弱,因为特征独立的假设在新闻分类任务中应该是不成立的。

  • svm分类效果是最好的,但是训练时间比较长。

  • fasttext是端到端的训练,不依赖特征工程,训练效果也非常不错,但是可解释性比较差。

  • pa

    上述的nb,svm,pa在sklearn中都有统一的接口可以直接调用,fasttext也有封装好的api,因此训练起来非常的方便。实际在做模型训练的时候,可以写一个统一的离线训练脚本。

  1. 模型融合策略
    对于四个子模型,如果四个子模型或三个子模型预测的结果一致,则直接投票处理;
    如果是其他情况,则可以考虑使用xgboost进行模型融合,具体的融合方法就是,对于每个样本来说,经过模型输出一个结果(可能是概率向量,即每个类别都对应的一个概率,实际去概率最大的那个类别),也可以经过各种平滑转换成概率向量。对于xgboost来说,输入就是每个子模型的输入的向量,输出就是类别。

  2. 规则系统
    规则系统简单来说就是,当某个样本满足规则的时候,就将这个样本分到某个类别,而忽略模型的分类结果。比较硬,一般用于最新的新闻,比如最近"延禧攻略"等等。这种新闻因为语料库中没有相似的样本,所以分类很可能出错,使用规则可以短期处理这个问题,但是长期来看,可以将这批最新的数据加到语料中,重新训练模型。
    需要注意的是:

  • 规则上线之前都要做评估
  • 尽可能减少对规则的依赖,可能会发生异常的后果
  1. 模型打包上线,对外提供服务

提升分类性能的小技巧

1. 新闻时效性问题
新闻的时效性问题很普遍,在一个工业级的产品中,有专门的算法去过滤过期的新闻。我们关心的是对于一些新的新闻,而且在训练语料中没有出现的特征,该怎么处理。短期可以用规则系统去解决。长期来讲,就要构造新的训练数据,和老训练数据做一定的融合,再进行特征抽取和特征选择,最后用总的数据重新训练再上线即可。
实际操作的时候可以写一个总的离线训练脚本,输入文件的路径,输出模型。脚本中包含特征抽取,模型训练,模型融合,模型评估等步骤,这样处理起来比较高效
2. 媒体直挂
对于一个feed流产品而言,很多的内容都是自媒体创造的,所以可以根据媒体的类型进行直挂。比如某个媒体是讲NBA的,那么这个媒体的内容大概率都是体育类。

3. 训练语料的分布及优化
训练语料中往往包含大量的噪声,如何对训练语料去噪也是一个比较头疼的问题。训练语料的优化主要包含三个个方面,一方面是某个类别的准确率很高,但是召回率不足;另一方面是准确率不足,召回率很高;还有就是准确召回都很低.
去噪手段:交叉验证,二分类器(置信度阈值),降采样,关键词

  • 对于准确率很高,召回率不足的类:查看哪些类别和该类混淆的比较多,训练一个二分类器从该类别中去去除噪声;或者说如果两个类别相互混淆,可以使用十折交叉验证(9份数据训练,对1份数据去噪,循环操作)的方法去噪。
  • 对于准确率很低,但召回率很高的类:这种情况可以看看召回错误样本的分布,然后利用降采样或者关键词的手段去噪
  • 对于准确和召回都比较低的类:这就很难了,先处理上面两种情况吧。所有的去噪手段都可以试试…

4. Debug信息管理
一个工业级别的分类系统当中,往往都需要分析badcase,如果系统只给出分类结果的话,很难去查错。正确的姿势应该是在系统的每个节点,都给出相关的信息。比如每个子模型的每个结果,融合后模型的分类结果,是否命中媒体直挂系统,是否命中规则系统等等,对于朴素贝叶斯模型,可以给出每个单词的权重。通过这种方式去分析badcase,可以直接找到错误的原因,提高效率.

分类系统服务化中的架构设计问题

这个不在本文讨论范围内,有兴趣的同学可以自己去了解

  • 加权轮询
  • 加权最小连接数
  • 源地址散列调度

开源项目

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0到1构建新闻长文本分类系统 的相关文章

随机推荐

  • 帆软下拉复选框,层级树状选择

    treelayer函数 1 概述 语法 treelayer TreeObject Int Boolean String 定义 返回一个树对象 TreeObject 第 n 层的值 一般为树数据集 或下拉树 视图树等树对象 并且可以设置返回值
  • mysql大表修改字段导致锁表(非阻塞)

    线上数据库难免会有修改表结构的需求 MySQL 在修改表结构时会锁表 这就会影响读写操作 小表还好 一会儿就修改完成了 但大表会比较麻烦 下面看一个解决方案 一 方式一 解决思路 1 新建一个表 结构就是要修改后的结构 2 在旧表上建立触发
  • 整合vxgPlayer使chrome支持vxg_media_player播放rtsp视频,目前全网唯一chrome支持rtsp,rtmp流的播放器

    目前有一个关于接入海康监控进行视频融合的项目需求 按理说在前端技术发展如此迅速的今天 使用web播放一个视频应该是不算什么难事 只是万事都有意外 因很多视频厂家的监控数据都不是普通的mp4啥的 所以使用普通的object 或者video 是
  • 单片机STM32在开发中常用库函数详解

    1 GPIO初始化函数 用法 voidGPIO Configuration void GPIO InitTypeDefGPIO InitStructure GPIO状态恢复默认参数 GPIO InitStructure GPIO Pin G
  • 【Leetcode】107. 二叉树的层序遍历 II

    题目描述 题解 很简单 分层的层序遍历 并且插入List
  • kafka异常:Uncaught exception in kafka-producer-network-thread 异常:Kafka scheduler has not been started

    版本 kafka 2 11 0 8 2 2 client java client 现象 kafka写入数据失败 没有异常信息 kafka客户端生产者日志 服务器一 2016 04 25 10 53 31 764 ERROR org apac
  • 【sklearn】fit()、transform()和fit_transform()的区别

    fit Method calculates the parameters mu and sigma and saves them as internal objects 解释 简单来说 就是求得训练集X的均值 方差 最大值以及最小值等这
  • 一些适用于ARM Cortex-M系列的动态加载库

    当涉及到ARM Cortex M系列芯片时 有许多适用于该系列的动态加载库 以下是其中一些 C OS III 它是一个基于优先级的实时操作系统 支持多任务和动态库加载 它为Cortex M系列芯片提供了完整的支持 包括ARM Cortex
  • 把玩数据在内存中的存储

    前言 时光如梭 今天到了C语言进阶啦 基础知识我们已经有了初步认识 是时候该拔高拔高自己了 目标 掌握浮点数在内存的存储 整形在内存的存储 鸡汤 时光易过 岁月蹉跎 深度剖析数据在内存中的存储 1 数据类型的介绍 前面已经讲解过了 可以再看
  • vue-element-admin第一篇:vue-element-admin初始项目

    1 事前准备 下载项目 https gitee com mirrors vue element admin git 执行代码 npm install npm run dev OK 准备工作完成 如果有报错 请移步到度娘那里去 2 先分析模块
  • [YOLO专题-10]:YOLO V5 - ultralytics/detect检测代码的命令行参数详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122266884 目录 第1章 准备
  • python时序数据处理2--提取年月信息、时间作差等

    同样首先先生成时序数据 1 生成时序数据 import pandas as pd import numpy as np from datetime import datetime timedelta test pd date range 2
  • 3.1 代码审核机制

    一次咨询活动 同一朋友交流基于复用的架构设计理念时 他说 你讲的那个很好 但离我们现状有点远 我现在每天要编码 要开会 要出差 要交流 要带人 要流程 招个能干的人可难了 而刚做顺手的就想跑 留一堆代码让我擦屁股 一段话不知道出了多少一线工
  • 三极管相关知识

    NPN型三极管 NPN型三极管 由三块半导体构成 其中两块N型和一块P型半导体组成 P型半导体在中间 两块N型半导体在两侧 三极管是电子电路中最重要的器件 它最主要的功能是电流 放大和开关作用 半导体三极管也称为晶体三极管 可以说它是电子电
  • Riverbed补齐最后一块拼图

    如果你知道APM Application Performance Management 应用性能管理 和NPM Network Performance Management 网络性能管理 应该知道它很重要 道理很简单 很多问题都是管理问题
  • C++:std::thread

    1 std thread的用法 头文件为 include
  • 【Computer Science】标准输入输出重定向

    本文介绍终端里的输入输出重定向 Windows 下的 cmd 和 Linux 下的 shell 相同 Command 功能 command gt filename 把标准输出重定向到一个文件中 command gt gt filename
  • 软件测试实习面试都问啥?

    软件测试实习面试都问啥 面试问的问题 Day1 April 8th Day2 April 9th Day3 April 10th 面试前的准备 color red heartsuit 实习面试结束 happy 这周我总共面试了三个软件测试的
  • Linux--vim使用

    普通文件编辑 vim 文件名 普通文件 命令行模式 ESC 插入模式 a i o O进入插入模式 末行模式 进入末行模式 q退出 q 强制退出 w保存 wq保存退出 w newfile另存 vim使用进阶 命令行模式下的命令 1 对于光标的
  • 从0到1构建新闻长文本分类系统

    新闻分类系统概述 新闻分类系统 顾名思义 就是对于一片新闻或者是一片文章 进行自动的分类 例如政治 财经 娱乐等等 从技术角度讲 其实属于自然语言处理中比较经典的文本分类问题 当然在一个工业级别的分类系统当中 会遇到各种各样的问题 例如语料