AI(四): 微信与luis结合(下)
LUIS(Language Understanding Intelligent Services)是微软新近推出了的的语义理解服务,可以方便用户进行API调用,创建自己场景的语义理解服务,网址为 https://www.luis.ai, 一旦应用程序上线,接收到真实的数据,LUIS使用主动学习来提高自身。在主动学习过程中,LUIS将模棱两可的文本识别出来,并要求你根据意图和实体标记它们。其次,通过专门的样本,LUIS可以快速地学习,短时间内达到特定领域较高的智能水平
目录:
- LUIS功能
- App定义
- 代码访问
LUIS功能
- 本地化支持: LUIS UI始终为英语,但在理解语音时,支持英语,法语,意大利语,西班牙语和中文等多种语言
- 以编程方式访问LUIS:LUIS提供了一个可编程的REST API,可用于自动化创建和发布特定语意模型
App定义
- 创建Application,如下图:
- 在菜单面板的左上角,可看到一个Intent、Entity区域。 所有应用程序都有一个预定义的Intent,“None”。 这将识别与应用程序无关的用户语句
- 实体是我们的搜索关键字,就像在我们的例子中实体是"股票“
- Intent: 指我们的愿望和意图是什么,如下图:我想查股票价格
- utterances:表达方式,为了让系统理解语意,对文本内容做特定标记,如下图
- 点击左下角"Train", 然后进行发布,将模型发布成HTTP服务,它将解释我们发送的句子。单击左上角的“发布”按钮,然后在生成的窗口中发布Web服务。几分钟后,你将看到一个网址,使你的模型可用作Web服务。 LUIS将如下面的截图所示
- 在Query里面可以输入你要表示的主义进行测试,如输入"帮我查一下000977的价格",回车后,测试返回结果如下:
代码访问
- 结合微信输入 + luis 语义理解,代码示例实时股票价格查询demo
- 接收微信服务器转发的请求信息,作业务处理,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Runtime.Serialization;
using System.IO; namespace WXHandler
{
/// <summary>
///
/// </summary>
public class WeixinExecutor : IWeixinExecutor
{
/// <summary>
///
/// </summary>
public static WeixinExecutor Default
{
get { return new WeixinExecutor(); }
} /// <summary>
///
/// </summary>
/// <param name="message"></param>
/// <returns>已经打包成xml的用于回复用户的消息包</returns>
public string Execute(WeixinMessage message)
{
string result = string.Empty;
var openId = message.Body.FromUserName.Value;
var myUserName = message.Body.ToUserName.Value;
switch (message.Type)
{
case WeixinMessageType.Text://文字消息
{
string userMessage = message.Body.Content.Value;
var BotMessage = LuisService.Default.PostMessage(userMessage);
result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
}
break;
case WeixinMessageType.Image://图片消息
{
string imageUrl = message.Body.PicUrl.Value;//图片地址 var msg = ImageService.Default.PostMessage(imageUrl);
result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, msg);
}
break;
case WeixinMessageType.Voice://语音消息
{
var recognition = Convert.ToString(message.Body.Recognition.Value);
var BotMessage = LuisService.Default.PostMessage(recognition);
if (BotMessage == LuisInfos.DEFAULT_LUIS)
BotMessage += string.Format(" 您输入的内容为:{0}", recognition);
result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
}
break;
case WeixinMessageType.Location://地理位置消息
{
var location_X = message.Body.Location_X.Value.ToString();
var location_Y = message.Body.Location_Y.Value.ToString(); var BotMessage = LocationService.Default.PostMessage(location_Y, location_X);
result = ReplayPassiveMessageAPI.RepayText(openId, myUserName, BotMessage);
}
break;
case WeixinMessageType.Link://链接消息
{
var title = message.Body.Title.Value.ToString();
var description = message.Body.Description.Value.ToString();
var url = message.Body.Url.Value.ToString();
var msgId = message.Body.MsgId.Value.ToString();
}
break;
default:
result = ReplayPassiveMessageAPI.RepayText(openId, myUserName,"xxxxxx......");
break;
}
return result;
}
}
} - 将接收到的信息通过luis理解,获取intents 和 entity,在这里我们可以封装一个luis实体对象
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web; namespace WXHandler
{
public class LuisAPI
{
/// <summary>
///
/// </summary>
private static readonly string URI = "https://api.projectoxford.ai/luis/v2.0/apps/eed6361a-dfce-4faf-b69c-b13d1298a560?subscription-key=订阅号&q={0}"; /// <summary>
///
/// </summary>
public static LuisAPI Default
{
get { return new LuisAPI(); }
} /// <summary>
///
/// </summary>
/// <param name="Query"></param>
/// <returns></returns>
public LuisMessage GetLuis(string Query)
{
Query = Uri.EscapeDataString(Query);
LuisMessage Data = new LuisMessage();
using (HttpClient client = new HttpClient())
{
string RequestURI = string.Format(URI, Query);
var task = client.GetAsync(RequestURI);
HttpResponseMessage msg = task.Result; if (msg.IsSuccessStatusCode)
{
var task1 = msg.Content.ReadAsStringAsync();
var JsonDataResponse = task1.Result;
Data = JsonConvert.DeserializeObject<LuisMessage>(JsonDataResponse);
}
}
return Data;
}
}
} 根据不同的intents,封装不同的业务逻辑处理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web; namespace WXHandler
{
public class LuisExecutor
{
/// <summary>
///
/// </summary>
public static LuisExecutor Default
{
get { return new LuisExecutor(); }
} /// <summary>
///
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public string PostMessage(string query)
{
LuisMessage luisMsg = LuisAPI.Default.GetLuis(query);
if (luisMsg == null || luisMsg.entities == null || luisMsg.entities.Length <= )
return LuisInfos.DEFAULT_LUIS; string reponse = "";
switch (luisMsg.topScoringIntent.intent)
{
case "查询天气":
reponse = LuisWeather.Default.QueryWeather(luisMsg.entities[].entity);
break;
case"查询价格":
reponse = LuisStock.Default.QueryStock(luisMsg.entities[].entity);
break;
case "查询客户信息":
reponse = LuisPartner.Default.QueryInfo(luisMsg.entities[].entity);
break;
case "查覆盖率":
reponse = LuisStaConver.Default.QueryInfo(luisMsg.entities[].entity);
break;
default:
reponse = LuisInfos.DEFAULT_LUIS;
break;
} return reponse;
}
}
}获取实时股票信息示例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Web; namespace WXHandler
{
/// <summary>
///
/// </summary>
public class LuisStock
{
private const string dataurl = "http://hq.sinajs.cn/list={0}"; /// <summary>
///
/// </summary>
public static LuisStock Default
{
get { return new LuisStock(); }
} /// <summary>
///
/// </summary>
/// <param name="location"></param>
/// <returns></returns>
public string QueryStock(string stockID)
{
string returnString = string.Empty;
string id = this.ParseStockID(stockID);
if (string.IsNullOrEmpty(id))
return string.Format(LuisInfos.DEFAULT_STOCK_REPLY, stockID); string dataUrl = string.Format(dataurl, id);
HttpClient client = new HttpClient();
var task = client.GetStringAsync(dataUrl);
string realInfo = task.Result;
Utils.WriteLog(realInfo);
string[] infos = realInfo.Split('\n');
if (infos.Length <= )
return string.Format(LuisInfos.DEFAULT_STOCK_REPLY, stockID); StockRealInfo stockInfo = new StockRealInfo(infos[]);
if (stockInfo.IsNull)
{
return string.Format(LuisInfos.DEFAULT_STOCK_REPLY, stockID);
} return string.Format("股票 {0} 名称: {1};开盘价: {2}; 当前价: {3}; 今日最高价: {4}; 今日最低价:{5}; 涨跌幅:{6}",
id,
stockInfo.Name,
stockInfo.TodayOpen,
stockInfo.Current,
stockInfo.High,
stockInfo.Low,
stockInfo.DiffPrec);
} /// <summary>
///
/// </summary>
/// <param name="stockid"></param>
/// <returns></returns>
private string ParseStockID(string id)
{
if (id.Length == || id.Length < )
return string.Empty; if (id.Substring(, ) == "")//上海是600打头
{
return string.Format("sh{0},", id);
}
else if (id.Substring(, ) == "")//上海基金
{
return string.Format("sh{0},", id);
}
else //深圳
{
return string.Format("sz{0},", id);
}
}
}
}运行效果:
AI(四): 微信与luis结合(下)的更多相关文章
- linux设备驱动归纳总结(四):5.多处理器下的竞态和并发【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-67673.html linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxx ...
- linux设备驱动归纳总结(四):4.单处理器下的竞态和并发【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-67005.html linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxx ...
- 全栈开发工程师微信小程序-中(下)
全栈开发工程师微信小程序-中(下) 微信小程序视图层 wxml用于描述页面的结构,wxss用于描述页面的样式,组件用于视图的基本组成单元. // 绑定数据 index.wxml <view> ...
- 全栈开发工程师微信小程序-上(下)
全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...
- a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a?(异或解决值互换问题)
package com.Summer_0424.cn; /** * @author Summer * a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a? */ ...
- 微信小程序的下拉刷新
微信小程序的下拉刷新:在page的js文件中有监听用户下拉刷新的处理函数onPullDownRefresh:function(){} //js文件中自带的处理函数,在onUnload下面,注意不要重复 ...
- 微信小程序禁止下拉_解决小程序下拉出现空白的情况
微信小程序禁止下拉 在微信小程序中,用力往下拉动,页面顶部会出现一段空白的地方. 产品的需求不太允许这么做,会影响用户体验,查看文档发现可以使用enablePullDownRefresh这属性来实现, ...
- JVM(四):深入分析Java字节码-下
JVM(四):深入分析Java字节码-下 在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容.在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样 ...
- 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解
salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解 建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...
随机推荐
- 清除mac出现的.DS_Store文件
一.什么是.DS_Store文件 在 Mac OS X 系统下,大部分文件夹中都包含 .DS_Store 隐藏文件,这里保存着针对这个目录的特殊信息和设置配置,例如查看方式.图标大小以及这个目录的一些 ...
- 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset
int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...
- Rotate Array 旋转数组 JS 版本解法
Given an array, rotate the array to the right by k steps, where k is non-negative. 给定一个数组,并且给定一个非负数的 ...
- simulate mdns message
use dns-sd command simulate mdns message: dns-sd -R test _test._tcp local 1234 a=1111111111111111111 ...
- spoj375
题解: 树链剖分的模板题 具体代码详见网上的其他代码 代码: #include<cstdio> #include<cmath> #include<cstring> ...
- 坏消息:百度影音、快播关闭P2P服务器!
继日前优酷土豆集团.搜狐视频.腾讯视频.乐视网.中国电影著作权协会(MPA).美国电影协会 (MPAA).日本内容产品流通海外促进机构(CODA).万达影业.光线传媒.乐视影业联合发布“中国网络视频反 ...
- python查看文件的编码格式
pip install chardet 执行 import chardet f = open('a.doc',r) data = f.read() print chardet.detect(data) ...
- juery 安全加固 集合
来源 jquery升级坑 2 3 4 5 版本 相关源码分享 新建document jquery ajax使用说明 最近在iteye的新闻中看到jQuery已经更新到了1.6.1. 和 ...
- WiFi Pineapple的Karma攻击与原理探究
WiFi钓鱼是一种被炒烂了的安全威胁,你几乎每天都能从电视.网络媒体中看到因误连了恶意WiFi导致大笔资金失窃的案例,并且很多媒体语不惊人死不休的报道风格总是能把当事人的受害过程删减修饰到灵异的程度. ...
- vim/vi用法总结
第一章:安装: 在命令行运行vim,如果找不到程序,需要自己安装. 1.1 下载 从官方网站ftp://ftp.vim.org/pub/vim/unix/中选择一个版本下载,我这里使用的是vim-7. ...