的返回,比如status就不再介绍了。
? ?说白了,开发平台解析你的语法之后,就是会告诉你这句话中的Slot和modifier,以及你的模块名称。
? ?Slot根据你选择的类型不同,你获取的内容不同。比如ext类型的,你可以拿到slot的名称和slot的值。
? ?Datetime类型,即你的Slot是时间,你还可以拿到时间的毫秒数,起始时间等。
? ?Number类型,表示你只会抓取数字,会得到数字的计算值等。
? ?Modifier就是你自己定义的要支持的操作,只要按照他们规定的格式命名就好。
? ?2.创建应用
? ?应用可以包含多个模块,具体包含哪些模块也是由你自己决定。OLAMI默认支持了“聊天”,“百科”,“查询日期”三个模块。如果你不需要可以去掉。内置模块的说明见
? ?点击下图中的配置模块添加自己写的模块和你希望添加的内置模块。比如对话系统模块中的nonsense就是聊天用的。你可以点配置模块右边的”测试”,输入要查询的句子就可以看到结果。
? ?如果测试结果能正确返回,就表明API接口也可以获取同样的结果。
? ?比如我在输入框中“查快递”就可以看到JSON格式的输出,如下图显示:
3.查看应用的key
? ?这个key就是你访问API 接口的钥匙,在你的应用中点击”查看key”就可以看到了。
4.访问自然语言解析API接口
? ?API接口是https协议,相关说明,我就不再赘述了。
? ?我使用的是小程序访问,相关代码如下,你代码下载包的input.js里可以看到:
function parseCorpus(corpus,object) {
var usekey = Appkey;
var usesecret = Appsecret;
if (object.data.dialogtype == chat_type){
usekey = ChatAppkey;
usesecret = ChatAppsecret;
}
//获取sign的MD5值
object.setData({
text: '请稍后......'
})
var timestamp = new Date().getTime();
var originalSign = usesecret + "api=" + api + "appkey=" + usekey + "timestamp=" + timestamp + usesecret;
var sign = MD5.md5(originalSign);
var rqdata = { "data": { "input_type": 1, "text": corpus }, "data_type": "stt" };
console.log(JSON.stringify(rqdata))
console.log('\r\n')
wx.request({
url: requestUrl,
data: {
appkey: usekey,
api: api,
timestamp: timestamp,
sign: sign,
rq: JSON.stringify(rqdata),
cusid: userId,
changebuttoncolor: "#d0e0e3"
},
header: {
'content-type': 'application/x-www-form-urlencoded'
},
method: 'POST',
success: function (result) {
var data = result.data.data;
if (result.data != null && result.data.status!=null&&result.data.status=='ok'){
HandleOLAMIresponseData(data.nli[0], corpus, object);
console.log('欧拉蜜有效数据', result.data);
}else{
console.log('欧拉蜜返回失败', result.data.status);
object.setData({
text: API_data_error
})
}
},
fail: function ({errMsg}) {
console.log('request fail', errMsg)
object.setData({
text: API_data_error
})
}
})
};
- 根据获取到的Semantics内容提供服务
我的处理逻辑是根据不同的modifier进行相应的操作,不同的操作下又要检查slot,代码如下:
function HandleOLAMIresponseData(data, corpus, object)
{
var textData=''; //text文本框要show的内容
var semantics = data.semantic;
if (semantics == null || semantics.length==0){
if (data.desc_obj.result != null && data.desc_obj.result.length != 0 && data.desc_obj.status==0) {
if (data.type == 'joke' || data.type == 'cooking'){
textData = data.data_obj[0].content;
}else
textData = data.desc_obj.result;
}else
textData='抱歉,我还理解不了你说的话。';
object.setData({
expresshead: '',
text: textData
})
}else {
for (var i = 0; i < semantics.length; i++) {
var tempSem = data.semantic[0];
if (tempSem.app == expressAPPname) { //仅处理快递模块的语义
//处理modifier
var mods = tempSem.modifier;
if (mods.indexOf("query") > -1)
expAppinfo.OPT = OPT_QUERY;
else if (mods.indexOf("query_num") > -1)
expAppinfo.OPT = OPT_QUERY_NUM;
else if (mods.indexOf("query_name") > -1)
expAppinfo.OPT = OPT_QUERY_NAME;
else if (mods.indexOf("query_name_num") > -1)
expAppinfo.OPT = OPT_QUERY_NUM_NAME;
//获取slots,即快递公司名称和运单号
var slots = tempSem.slots;
if (slots != null) {
for (var j = 0;