找回密码
 立即注册
搜索

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

开篇:为什么要构建自然言语的Pipeline

自然言语的关键在于拆解文本,提取文本特征,获取不同深度层次的语义,以及语义关系

很显然处理一个文本很难经过一个算法或者一套算法来搞定。例如处理分词的算法一定和做情感分析的算法是不分歧的。因此我们希望对系统停止解耦,经过pipeline对各个解耦后的模块停止内聚。

我们可以把自然言语处理平台当做一个造车工厂,文本就是一堆原材料,如钢铁,橡胶,塑料凳。工厂有不同的车间会把原材料停止拆解加工,然后还会有对半成品停止拆卸的车间。最后的成品就是一辆车,那对于自然言语pipeline来说,输入就是文本,语音等信息,输入就是一个文本feature的集合,这就是我们想要的车了。至于这辆“车”是“劳斯莱斯”还是“比亚迪”,就取决于我们各个车间的算法设计,以及全体的执行效率。

关于构建pipeline的框架:

A方案: UIMA (Unstructured Information Management applications)框架:

UIMA官方解释是用来分析非结构化信息,并发掘知识点。我以为这个解释不够敌对,也没有表达出系统的弱小之处。我以为UIMA是一个构件残缺,流程解耦,模块化管理都比较迷信的信息流处理框架,它可以用来处理基本上我们可以接触到的一切信息,无论是语音,文本或者是图像。

UIMA提供减少反复开发的可重用分析组件,我们需求做的是基于框架开发我们本人的算法模块,经过UIMA对模块之间停止串行或者并行的管理,框架还提供了对应各种feature的 笼统,以及feature之间关系的笼统。我们也可以根据不同业务的需求去针对性的承继UIMA提供的数据结构做个性化开发。此外UIMA-RUTA 组件还提供了逻辑推理功能,可以方便的经过简单代码停止关系推论等。
UIMA框架抽取文本实体的一种流程



言语支持

UIMA系统支持java言语和c++言语开发。拿java言语举例,我们的每一个“工厂”算法,例如分词器作为一个工厂,我们需求提供一个接口Annotator去完成JCasAnnotator_ImplBase 这个类即可。资源,例如词典之类的数据可以交给框架来加载管理。把处理分词的接口写入到process方法中,框架会自动停止调用。并在处理过程中,把获取的一切信息或者特征,停止格式化写入到一个名叫JCas的对象中,JCas就是整个框架的存储容器,相似于spring中的context全局对象。JCas类中的每一个属性都是支持个性化触及的,灵敏性非常高。

UIMA的管理策略是经过执行xml文件来停止规划的(当然也可以运用代码的方式),xml里可以制定当前算法的输入输入格式,显示或者隐藏哪些特征,经过反射的方式指定算法入口和类型婚配文件等。除此之外还可以设置算法的超时工夫,指定执行方式是串行还是并行等。
经过xml配置文件决议输入输入与流程



UIMA对中国初学者并不敌对

当然UIMA我并不引荐初学者运用,假如你有两三个人的小队很需求搭建一个弱小可用的nlp流程服务,那么你可以大胆尝试UIMA。该框架是Apache下开源项目,但是其中文文档并不多,多数教程都是英文版的。学习门槛偏高。但是该系统的优越性还是不容置疑的。

B方案: 自研Pipeline框架;

为什么要自研?

小智正在录制平台构建的视频教程,之后自然言语处理平台的相关教程,都会采用本人搭建的方式,并在日常的开发过程中不断优化其功能。

本人开发的优点有很多,熟习算法与工程的结合,深化了解Nlp各个环节的互相搭配。同时,最重要的就是加深对各个算法以及对编程言语,思想的了解。例如,搭建过程中会了解什么是反射,单例等设计形式,执行效率,异常处理等,以及怎样去合理的加载资源调用模型等。

除此之外,我们在自研的过程中,也会运用到很多工业界触及的工具包,更好的接轨工业界。

下面我们来说一下如何构建本人的Nlp pipeline吧。

关于开发工具:

代码管理工具git,项目自动化构建工具gradle,开发ide: intellij, 言语java,python,微服务框架采用springboot。

我们的框架详细要放哪些算法呢?

a. 分段与分句 “工厂”

b. 分词“工厂”

c. 词性标注“工厂”

d. 实体辨认“工厂”

e. 词权重关键词“工厂”

f. 文本降噪

e. 其他... 例如文本倾向性分析,文本摘要生成,词向量等。

初期框架需求:

1.50qps单机级别(单条50字),级别异常处理

2.资源一致加载,流程串行

3.支持微服务并发调用

4.模块解耦,一切模块可独立打包

5. ......

模块化搭建:

第一步:搭建服务平台

a. 需求下载springboot包(经过build.gradle文件配置sprintboot相关地址):

b. 配置springboot启动类:SpringBootServletInitializer

c. 配置controller:用于相应http央求

第二步: 构建算法子模块

本处以建立分词子模块为例。

a. 在父模块目录下,新建gradle子项目 np_segmentor。

b. 父项目中的settings.gradle与build.gradle项目中配置子项目名--np_segmentor。

c. 在子项目中加载需求的依赖包。并构建

第三步: 反复第二步构建其他算法模块。

总结:

之后便是持续开发我们的全体框架模块了,需求开发总控模块,用来调用资源加载模块,一切算法接口的调度完成也要写在框架层面而不是算法层面。有了这些全体框架就初步成型了,之后就是一些系统的控制成绩,例如超时相应成绩,不同类型的异常处理成绩等等。

最后你的项目会很充实,如下图样式。
详细完成因需求而异



留意,根据不同需求我们一定会用到一些微服务提供的模型,例如运用tensorflow构建的其他深度学习模型,都可以运用微服务方式停止接口调用,也可以采用JNI方式外部直接调用python或c++接口。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

大神点评3

默0默 2019-9-29 15:04:46 显示全部楼层
分享了
回复

使用道具 举报

幸远星 2019-9-30 18:13:36 显示全部楼层
有空一起交流一下
回复

使用道具 举报

玥瑩 2019-10-1 19:42:25 显示全部楼层
LZ是天才,坚定完毕
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies