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结合(下)的更多相关文章

  1. linux设备驱动归纳总结(四):5.多处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67673.html linux设备驱动归纳总结(四):5.多处理器下的竞态和并发 xxxxxxxxxx ...

  2. linux设备驱动归纳总结(四):4.单处理器下的竞态和并发【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-67005.html linux设备驱动归纳总结(四):4.单处理器下的竞态和并发 xxxxxxxxxx ...

  3. 全栈开发工程师微信小程序-中(下)

    全栈开发工程师微信小程序-中(下) 微信小程序视图层 wxml用于描述页面的结构,wxss用于描述页面的样式,组件用于视图的基本组成单元. // 绑定数据 index.wxml <view> ...

  4. 全栈开发工程师微信小程序-上(下)

    全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...

  5. 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? */ ...

  6. 微信小程序的下拉刷新

    微信小程序的下拉刷新:在page的js文件中有监听用户下拉刷新的处理函数onPullDownRefresh:function(){} //js文件中自带的处理函数,在onUnload下面,注意不要重复 ...

  7. 微信小程序禁止下拉_解决小程序下拉出现空白的情况

    微信小程序禁止下拉 在微信小程序中,用力往下拉动,页面顶部会出现一段空白的地方. 产品的需求不太允许这么做,会影响用户体验,查看文档发现可以使用enablePullDownRefresh这属性来实现, ...

  8. JVM(四):深入分析Java字节码-下

    JVM(四):深入分析Java字节码-下 在上文中,我们讲解了 Class 文件中的文件标识,常量池等内容.在本文中,我们就详细说一下剩下的指令集内容,阐述其分别代表了什么含义,以及 JVM 团队这样 ...

  9. 【转载】salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解

    salesforce 零基础开发入门学习(四)多表关联下的SOQL以及表字段Data type详解   建立好的数据表在数据库中查看有很多方式,本人目前采用以下两种方式查看数据表. 1.采用schem ...

随机推荐

  1. curl常用功能

    <?php //创建一个新cURL资源 $ch = curl_init(); //******************************************************** ...

  2. pos提交提交数据时碰到Django csrf

    我的github(PS:希望star):https://github.com/thWinterSun/v-admin 最近在用Vue写前端代码,再用vue-resource向后台提交数据.项目后台是用 ...

  3. spring boot 学习(二)spring boot 框架整合 thymeleaf

    spring boot 框架整合 thymeleaf spring boot 的官方文档中建议开发者使用模板引擎,避免使用 JSP.因为若一定要使用 JSP 将无法使用. 注意:本文主要参考学习了大神 ...

  4. web项目中的路径问题

    “/”表示根路径 1.“/”代表的意思不是固定的,是要根据具体的方法,才能知道在该方法中"/"所代表的含义,同样相对路径也不是固定的,需要根据具体的方法来判断具体是相对哪个路径的相 ...

  5. Swift网络封装库Moya中文手册之Targets

    Targets 使用Moya,我们首先需要定义一个target - 这通常是继承 TargetType 协议的 枚举 变量.接下来,你的app只需要处理这些targets,也就是一些你希望调用API完 ...

  6. DevExpress ASPxComboBox lost selected item after postback

    <dx:ASPxComboBox ID="cbxSname" ClientInstanceName="cbxSname" Font-Names=" ...

  7. ubuntu下的烧录工具

    Flash Image Tool1.0 为了ubuntu下能够方便地烧录版本,我开发了Flash Image Tool.现在服务器(192.167.100.225)上有一份它的拷贝share/Tool ...

  8. 几个css问题

    1.中文.英文和数字的表现方式不一样. 中文可以自动换行,英文和数字并不会自动换行,设置强制换行显示.word-wrap:break-word; 2.textarea中输入文字多的情况下,和邻边的in ...

  9. SWIFT用ScrollView加图片制作Banner

    网上参考OBJC写的用ScrollView图片轮播效果,照着画了个,先上效果图: 附上代码: @IBOutlet weak var pc: UIPageControl! @IBOutlet weak ...

  10. C语言基础:初级指针 分类: iOS学习 c语言基础 2015-06-10 21:50 30人阅读 评论(0) 收藏

    指针:就是地址. &   取地址运算符 %p   打印地址占位符 int a=0; printf("%p ",&a);    指针变量:用来存放地址的变量 定义: ...