首页 > 其他分享 >Pytext上手——Intent-Slot 模型实战

Pytext上手——Intent-Slot 模型实战

时间:2023-05-17 18:33:03浏览次数:84  
标签:Slot doc 模型 label joint Pytext Intent model config


1 意图分类任务简介

对话系统里,首先要对用户的输入进行领域、意图识别和槽抽取。深度学习发展以后,意图识别的方法多使用深度学习的算法,使用CNN对意图进行多分类,领域分类和意图分类较为类似。而槽的预测可以看成是标签序列预测问题。例如句子“我想听周杰伦的菊花台”,标签可以定义为“O O O B-singer M-singer E-singer O B-song M-song E-song”。标签序列预测多使用CRF,RNN,LSTM,LSTM+crf的模型。

2 槽位填充

槽位填充可以理解为一个序列标注的问题,我们训练范例{(x((n)),y((n)) ):n=1,……,N},然后我们想要识别学到一个函数f∶x→y,这个函数能够匹配输入序列x和相应的标签序列y。在槽位填充中,输入序列和标签序列长度相同,因此排列是准确的。






表1:ATIS语料样本及其意图和槽位注释


3 数据集ATIS

ATIS数据集包含4978训练数据和893个测试数据,文本内容为客服对话,意图一共有26类。查询话语中的每个标记与填充IOB标签的插槽对齐,也就是上面图片中Sentence和Slots都是一一对齐的。

4 Pytext实战

本部分内容主要参考官方的文档Train Intent-Slot model on ATIS Dataset,有些地方稍微出入。

4.1 安装

目前Pytext只支持Linux和Mac系统,在命令行输入下面语句安装:

pip install pytext-nlp

4.2 文件准备




4.3 数据预处理

python3 demo/atis_joint_model/data_processor.py --download-folder atis/ --output-directory demo/atis_joint_model/



数据预处理


4.4 模型训练

pytext train < demo/atis_joint_model/atis_joint_config.json

在没有使用GPU的情况下,训练需要30分钟左右




模型训练


模型训练完毕时,我们通过



4.6 模型导出

保存PyTorch模型时,简单的使用pickle进行序列化。这意味着简单的代码更改(例如,单词嵌入更新)可能导致与已部署模型的向后不兼容。为了解决此问题,可以使用内置的ONNX集成将模型导出为Caffe2格式。无论PyText或开发代码中的更改如何,导出的Caffe2模型都具有相同的行为。

在命令行中分别输入下面两行语句

CONFIG=demo/atis_joint_model/atis_joint_config.json
pytext export --output-path exported_model.c2 < "$CONFIG"

4.5 模型评估

我们可以使用来测试模型在测试集上的表现

pytext test < "$CONFIG"



评估结果


4.6 模型应用

我们可以将训练的模型部署成一个web应用,新建文件

import sys
import flask
import pytext

config_file = sys.argv[1]
model_file = sys.argv[2]

config = pytext.load_config(config_file)
predictor = pytext.create_predictor(config, model_file)

app = flask.Flask(__name__)

@app.route('/get_flight_info', methods=['GET', 'POST'])
def get_flight_info():
    text = flask.request.data.decode()

    # Pass the inputs to PyText's prediction API
    result = predictor({"raw_text": text})

    # Results is a list of output blob names and their scores.
    # The blob names are different for joint models vs doc models
    # Since this tutorial is for both, let's check which one we should look at.
    doc_label_scores_prefix = (
        'scores:' if any(r.startswith('scores:') for r in result)
        else 'doc_scores:'
    )

    # For now let's just output the top document label!
    best_doc_label = max(
        (label for label in result if label.startswith(doc_label_scores_prefix)),
        key=lambda label: result[label][0],
    # Strip the doc label prefix here
    )[len(doc_label_scores_prefix):]

    return flask.jsonify({"question": f"Are you asking about {best_doc_label}?"})

app.run(host='0.0.0.0', port='8080', debug=True)

执行

python flask_app.py "$CONFIG" exported_model.c2

然后打开另一个Terminal,我们测试下服务:
测试1

curl http://localhost:8080/get_flight_info -H "Content-Type: text/plain" -d  "I am looking for flights from San Francisco to Minneapolis"

{
  "question": "Are you asking about flight?"
}

测试2

curl http://localhost:8080/get_flight_info -H "Content-Type: text/plain" -d  "How much does a trip to NY cost?"

{
  "question": "Are you asking about airfare?"
}

测试3

curl http://localhost:8080/get_flight_info -H "Content-Type: text/plain" -d  "Which airport should I go to?"

{
  "question": "Are you asking about airport?"
}

我们可以看到,模型将3次的意图都识别到了。




5 总结

其实,pytext核心部分是针对不同任务的config.json文件,里面定义了模型的结构,输入、输出等等,另外也有网友反映,现在文档对这一部分解释少,对怎么添加模型的介绍也很少,所以只能先摸索下。本篇文章,只是安装官方文档将训练一个模型的流程打通,但是自己希望接下来研究下怎么添加自定义模型和训练中文语料。

标签:Slot,doc,模型,label,joint,Pytext,Intent,model,config
From: https://blog.51cto.com/u_16116809/6292984

相关文章

  • span class=part用户操作处理: signal 和 slotspan
    1.点击`统计`,会根据button.clicked.connect函数名)调用handleCalc()函数: 2.使用textEdit.toPlainText()方法接收窗口发送的信息: 3.对代码处理结果做相关总结,并使用QMessageBox.about()方法展示结果弹窗: 4.对功能代码做封装: ......
  • el-button之slot=“prepend“和slot=“append“ 用法及区别
    说明<el-buttonslot="append"></el-button>里的slot="append"就是一个UI摆放的位置,其实就是封装的样式布局。append:代表放在紧贴在依赖组件的后面prepend:代表放在紧贴在依赖组件的前面......
  • 关于vue slot 的多级传递使用
    关于vueslot的多级传递使用关于slot以及scope-slot的基本使用,官方文档已经有了详细的介绍:点击这里查看,这里就不复述了。但是在实际的使用过程中,常常会出现外部组件内容需要多级嵌套传递到目标组件,那么slot可以如何实现呢?现在假设有A,B,C三个组件,层级关系为A>B>C(爷爷,父亲,儿子)......
  • intent调用代码总结
    进入联系人界面Intentintent=newIntent();intent.setAction(Intent.ACTION_VIEW);intent.setData(People.CONTENT_URI);startActivity(intent);查看某个联系人,当然这里是ACTION_VIEW,如果为选择并返回action改为ACTION_PICK,当然处理intent时......
  • Android提高第四篇之Activity+Intent
          Android有三个基础组件Activity,Service和BroadcastReceiver,他们都是依赖Intent来启动。本文介绍的是Activity的生命周期以及针对Activity的Intent使用。       之前的例子一直都是使用Activity,在一个LayoutXML与一个Activity捆绑的情况下可以视为一个Form,......
  • <template slot-scope="scope">
    通过后端返回的具体值,前端可以映射想要的值如:status状态值为0就是代办,为1就是处置,为2就是完成<el-table-columnlabel="工单状态"prop="status"><templateslot-scope="scope"><spanstyle="margin-left:10px">{{......
  • Vue3中slot插槽使用方式
    **********************************Vue3中slot插槽使用方式****************************************************参考:https://huaweicloud.csdn.net/638eab83dacf622b8df8d08c.html<templatev-slot:isFang></template>简写v-slot:isFang#isFang<template#isFan......
  • Android问题解决:android.os.FileUriExposedException: file:///storage/......Intent.
    文章目录一、遇到问题二、解决问题三、分析问题一、遇到问题---------beginningofcrash2022-12-2720:18:15.01014422-14422/com.lisi.evidence_boxE/AndroidRuntime:FATALEXCEPTION:mainProcess:com.lisi.evidence_box,PID:14422android.os.FileUriExpose......
  • 关于vue3中Scope slot实战中使用
    今天学了啥-23/03/28 vue提供slot机制让组件可以接收模板片段,来渲染模板片段。比如最常见的button组件,基本是如下这样使用。<FancyButton>Clickme!<!--插槽内容--></FancyButton>FancyButton组件则是这样:<buttonclass="fancy-btn"><slot></slot><!--插......
  • Vue独立组件开发: prop event slot
    本文是介绍独立组件开发的系列文章的第一篇。Vuejs无疑是当下最火热的前端框架,而它最精髓的,正是它的组件与组件化。写一个Vue项目,就是在写一个个的组件,掌握了Vue组件的各种开发模式与技巧,再复杂的业务场景也可轻松拿捏。组件的分类Vue组件分成三类:页面组件由 vue-router 产......