——Rasa_NLU_Chi中文语义理解


随着网点移动履职系统设计和开发工作的逐步展开,与智能应答相关的智能语义分析相关研究工作也随之进行。网点移动履职系统中智能应答部分的工作基于腾讯云的智能语义模块,但我们对其理解尚浅。本文基于此背景,对自然语言处理(NLP)相关概念及流程做出简要分析,意欲理解自然语言处理的工作原理及工作场景,着重描述自然语言理解(NLU)的基本原理,并以经典自然语言处理开源框架Rasa_NLU为基础,搭建自然语言理解(NLU)开发及测试平台,简述其搭建过程,为自然语言理解的研究和应用提供直观的理论依据和环境支撑。

二、自然语言处理(NLP)概要

1、什么是自然语言处理?
2、NLP 的两大核心任务
3、NLP 自然语言处理的一般处理流程

三、深度学习与自然语言处理

在自然语言处理的过程中,模型的训练、生成与深度学习密不可分。深度学习采用的模型为深层神经网络(Deep Neural Networks,DNN)模型,即包含多个隐藏层(Hidden Layer,也称隐含层)的神经网络(Neural Networks,NN)。深度学习利用模型中的隐藏层,通过特征组合的方式,逐层将原始输入转化为浅层特征、中层特征、高层特征直至最终的任务目标。
如上,以语义理解为例,语言的原始输入是汉字、字母,进而组成单词、短语,再组成句子、段落甚至文章。不难发现,可以找到原始输入和浅层特征之间的联系,再通过中层特征,一步一步获得和高层特征的联系。想要从原始输入直接跨越到高层特征,无疑是困难的,因此深度学习以它特有的分层原理,能够形象地描述语言的认知过程,从而得到“理解能力”。
基于此原因,网点移动履职系统中智能应答模块中的语义分析部分,将以DNN模型为输出,描述提问的应答过程。
1、自然语言理解表达模型
基于深度学习模型对自然语言表达的训练结果,我们可以将经过深度学习模型和语料训练的结果作为自然语言理解的输出模型,在文字+上下文作为输入时,提供结构化的语义理解表达方式。
自然语言理解过程
对于自然语言理解的表达输出,目前常用的是frame semantics表示的一种变形:采用领域(domain)、意图(intent)和属性槽(slots)/实体(entity)来表示语义结果。
其中,领域是指同一类型的数据或者资源,以及围绕这些数据或资源提供的服务,比如“信用卡”“凭证”“票据”“餐厅”,“酒店”,“飞机票”、“火车票”、“电话黄页”等;意图是指对于领域数据的操作,一般以动宾短语来命名,比如信用卡领域中,有“办卡”、“挂失”等意图;属性槽用来存放领域的属性,比如信用卡办卡意图有“时间”“开户行”“卡号”等;对于信用卡领域,我们的语义表示结构如下图所示:
信用卡领域NLU表达
进一步,我们对于世界的语义描述(又称为domain ontology)如下:
世界的NLU表达
因此,计算机对于自然语言的理解能力,我们简单的可以认为是领域、意图和属性(实体)的表达。

四、自然语言理解开源框架Rasa_NLU

自然语言理解(NLU)系统是问答系统、聊天机器人等更高级应用的基石。基本的NLU工具,包括实体识别和意图识别两个任务。为了更加清晰地了解履职助手智能应答语义理解模块的工作原理,本实践使用Rasa开源框架。Rasa_NLU是一个经典的自然语言理解开源框架,它可以本地部署,自己针对实际需求训练和调整模型,对特定垂直领域(如金融)的需求效果要比通用的在线NLU服务更加高效精确。
1、Rasa_NLU基本原理
Rasa是一个开源机器学习框架,用于构建上下文AI助手和聊天机器人。
Rasa有两个主要模块:
Rasa_NLU:用于理解用户消息,包括意图识别和实体识别。
Rasa_Core:是一个对话管理平台,用于举行对话和决定下一步做什么,生产反馈语言。
Rasa_NLU是Rasa自然语言处理框架中的自然语言理解组件,主要作用是对语料及理解模型进行预处理和训练,以及接收自然语言的输入和意图及实体的输出,为问答的生成提供先决条件。Rasa_NLU是用Python编写的,但它可以通过使用Rasa_NLU作为HTTP服务器。从任何语言使用它。默认情况下,Rasa NLU 附带了一些预构建的组件供使用,在本次项目实践中主要以jieba分词、Mitie意图分析、sklearn实体抽取三大组件作为基础进行模型及数据的训练,下面是以 Rasa_NLU中pipeline 的配置示例:
组件的形成和使用经历了三个主要阶段:
A.创建:在训练之前初始化组件。
B.训练:该组件使用上下文和可能的先前组件的输出进行自我训练。
C.持久化:将训练过的组件保存到磁盘上以备将来使用,在初始化第一个组件之前,会创建一个上下文,该上下文用于组件之间传递信息。例如:一个组件可以计算训练数据的特征向量,将其存储在该上下文中,另一个组件可以从该上下文中检索这些特征向量并进行意图分类。当创建、训练、持久化了所有组件后,将创建一个描述整个 NLU 模型的模型元数据。
最后生成的是根据语料和训练模型训练出的NLU模型,以数据集合加元数据的形式存在,为Rasa_core的输入和反馈做好意图分解。


Rasa_NLU训练过程
2、Rasa_NLU意图表达
Rasa_NLU的意图表达与自然语言语义表达基本吻合。意图表达以结构化json形势所呈现,数据字段为意图、实体和置信度。
A.意图:将用户的诉求告知机器。例如:提出办卡,要求退款等请求。
B.实体:提取用户诉求细节的属性。例如:时间、卡号、开户行等属性信息。
C.置信度:一个距离指标,该指标能够体现出NLU分析出的结果与意图列表中诉求相差多少,以百分比形式存在,接近于100%表征置信度越高,意图越明确。
此外,还有意图及置信度排序,能够更加明晰的掌握语义的理解程度,给语言生成更多选项。


1、环境准备
■搭建环境:python3.7-x64;Visual Studio 2019;windows7
■训练环境:sklearn 0.19.2;mitie;jieba分词
■mitie编译环境:cmake
■其他程序:在编译过程中使用pipline依次安装。
■服务:Rasa_nlu
1.Mitie训练模型工程下载:
下载地址:git clone
2.Rasa_nlu环境搭建:
Rasa_nlu工程下载:
https://github.com/crownpku/rasa_nlu_chi
(1)alt_requirement目录,rasa服务是依赖资源
(2)data目录下json文件是用户训练的语料集合,是用户训练的基础,需要用户维护。
(3)用户维护的训练语料样例
(4)pipeline组件配置
1.安装Rasa_NLU_Chi
命令cmd,cd到Rasa_NLU_Chi下,执行
python setup.py install
2.安装mitie。到mitie工程下执行
python setup.py install
3.准备模型数据。
先不用自己训练模型,直接下载一份训练好的模型数据,下载中文的mitie模型作为初始的训练模型。此模型来自维基百科、百度百科的训练词库。
total_word_feature_extractor_zh.dat放入data目录下。
4.准备标注语料。通过Rasa提供的网站、或者手动建立json文件进行语料维护。
5. 使用
sample_configs/config_jieba_mitie_sklearn.json
配置文件,利用语料完成数据训练,在models目录得到新的数据模型。Rasa工程下执行:
python -m rasa_nlu.train -c sample_configs/config_jieba_mitie_sklearn.yml --data data/examples/rasa/demo-rasa_zh.json --path models
6.启动rasa_nul服务,在工程目录下:
python -m rasa_nlu.server -c sample_configs/config_jieba_mitie_sklearn.yml --path models
7.验证rasa_nlu服务。
8. 输入需要说明的短语句子,验证语义理解。如下图,其中intent是根据句子理解的意图,confidence是意图的置信度,越趋近于1表面意图理解越准确;entity是此意图的实体(属性),用来表征意图。意图明晰后下一步进行自然语言生成(NLG),生成最终的反馈语句。
在NLP中,NLU自然语言理解是非常关键和重要的过程,为NLP的输出提供数据训练和模型支持。


自然语言理解是人工智能领域的明珠,它的发展一直伴随着人类社会文明的进程,我们一直尝试让计算机用某种方式理解我们的语言、意图、甚至是感情,目前随着意图识别和实体识别的发展,NLU已有成熟的进展和多领域的应用。在银行业和金融领域,自然语言理解赋予金融行业更多产品场景拓展的可能性,更加人性化地了解客户需求、发觉业务潜质、提高生产效率。本文以“网点移动履职系统”建设为契机,全面阐述自然语言处理相关概念,着重描述自然语言理解相关原理以及实践过程,为后续系统建设和行内自然语言理解发展提供理论和实践支撑。
未经允许不得转载:大自然的搬运工 » 搭建自然语言理解(NLU)实验环境实战教学