深度学习自然言语全流程平台搭建

图灵汇官网

开篇:为什么需要构建自然语言处理流水线

自然语言处理的核心在于解析文本,提取文本特征,理解多层次的语义及其关联。单一算法往往难以覆盖所有处理步骤,例如分词和情感分析需要不同的算法。因此,为了实现高效处理,我们需要将系统解耦,通过流水线的方式串联各个模块。

我们可以将自然语言处理平台比作一个汽车制造厂,文本就像原材料,如钢铁、橡胶和塑料。工厂的不同车间负责拆解和加工这些原材料,最终生产出一辆完整的汽车。对于自然语言处理流水线而言,输入可以是文本或语音信息,输出则是一系列特征,这些特征组合起来就是我们期望的结果。至于最终的产品质量如何,取决于各个模块的设计及整体执行效率。

关于构建流水线框架

A方案:UIMA框架

UIMA是一种处理非结构化信息的框架,它能够挖掘知识点,但其官方解释显得不够直观。实际上,UIMA是一个高度模块化的框架,适用于处理各种信息,包括语音、文本和图像。

UIMA提供了可重复使用的分析组件,减少了重复开发的工作。我们需要做的就是基于框架开发自己的算法模块,并通过UIMA对模块进行串行或并行管理。UIMA还提供了抽象层,便于管理和操作各种特征及其关系。此外,UIMA-RUTA组件提供了逻辑推理功能,简化了关系推断等任务。

语言支持

UIMA支持Java和C++两种编程语言。以Java为例,每个“工厂”算法,如分词器,都需要实现一个名为Annotator的接口。资源,如词典等,可以由框架加载和管理。处理分词的接口需要写入process方法中,框架会自动调用。处理过程中获取的所有信息或特征将被格式化并写入JCas对象中,JCas是框架的存储容器,类似于Spring中的全局上下文。JCas类中的每个属性都支持个性化访问,灵活性很高。

UIMA的管理策略可以通过XML文件进行配置,XML文件中可以定义算法的输入输出格式、展示或隐藏哪些特征、指定算法入口和类型匹配文件等。此外,还可以设置算法的超时时间,指定执行方式是串行还是并行等。

UIMA对中国初学者并不友好

虽然UIMA是一个强大的框架,但它并不适合初学者。如果团队较小且需要搭建一个强大的自然语言处理流程服务,可以大胆尝试UIMA。该框架是Apache下的开源项目,但其中文文档较少,多数教程为英文版。不过,该系统的优点仍然显著。

B方案:自研流水线框架

为什么要自研?

我们正在录制关于平台构建的视频教程,并将在后续发布关于自然语言处理平台的相关教程。采用自研的方式不仅可以在日常开发中不断优化功能,还能深入了解算法与工程的结合,深化对NLP各环节的理解。此外,自研过程还会接触到许多工业界常用工具,更好地接轨工业界。

接下来,我们将讨论如何构建自己的NLP流水线。

开发工具

我们推荐使用Git进行代码管理,Gradle作为项目自动化构建工具,IDE选择IntelliJ IDEA。编程语言可以选择Java或Python,微服务框架采用Spring Boot。

流水线包含的算法

  • 分段与分句
  • 分词
  • 词性标注
  • 实体识别
  • 关键词提取
  • 文本降噪
  • 其他功能(如文本倾向性分析、文本摘要生成、词向量等)

初期框架需求

  1. 单机50QPS(每秒查询率)
  2. 资源统一加载,流程串行
  3. 支持微服务并发调用
  4. 模块解耦,所有模块可独立打包

模块化搭建

  1. 搭建服务平台

    • 下载Spring Boot包(通过build.gradle配置Spring Boot相关地址)
    • 配置Spring Boot启动类:SpringBootServletInitializer
    • 配置Controller:用于响应HTTP请求
  2. 构建算法子模块

    • 在父模块目录下新建Gradle子项目np_segmentor
    • 在父项目settings.gradle与build.gradle中配置子项目名np_segmentor
    • 加载所需依赖包并构建
  3. 重复上述步骤构建其他算法模块

总结

通过以上步骤,我们可以逐步搭建起完整的框架模块。需要开发总控模块,调用资源加载模块,并在框架层面而非算法层面实现所有算法接口的调度。有了这些基础,流水线框架就初步成型了。接下来,还需要解决一些系统控制问题,如超时响应、不同类型异常处理等。

最终项目将非常充实,可以根据具体需求灵活调整。此外,还可以利用微服务提供的模型,如通过TensorFlow构建的深度学习模型,进行接口调用,或采用JNI方式直接调用Python或C++接口。

本文来源: 图灵汇 文章作者: 春园