zoukankan      html  css  js  c++  java
  • Syn Bot /OSCOVA 实体识别器(13)

    Entity Recognizers

    Oscova支持多种方式创建实体识别器,可以使用已知词汇,正则模式或者直接创建方法从请求中提取。

    使用CreateRecognizer()方法就可以创建了,这个方式创建的识别器是大小写不敏感的。当然开发人员可以显式指定大小写敏感。

    Entries Recognizer

    对于一组已知词汇,开发人员可以通过如下方式创建识别器。

    var bot = new OscovaBot();
    bot.CreateRecognizer("employee", new[] { "Sean", "Ali", "Patel" });

    另一种写法,但意思完全一样

    var recognizer = bot.CreateRecognizer("employee");
    recognizer.Entries.Add("Sean");
    recognizer.Entries.Add("Ali");
    recognizer.Entries.Add("Patel");

    大小写敏感的识别器。

    var bot = new OscovaBot();
    bot.CreateRecognizer("employee", new[] { "Sean", "Ahmet", "Patel" }, StringComparer.Ordinal);

    Enumeration Recognizer

    用于枚举类型的识别器:

    enum PriorityTypes
    {
        Low,
        High,
        Mininum,
        Maxinum
    }

    然后,

    var bot = new OscovaBot();
    bot.CreateRecognizer<PriorityTypes>("priority");

    明白了吧!当然大小写不敏感的:

    var bot = new OscovaBot();
    bot.CreateRecognizer<PriorityTypes>("priority", StringComparer.Ordinal);

    还可以指定同义词:

    enum PriorityTypes
    {
        Low,
        High,
    
        [Synonyms("Min")]
        Minimum,
    
        [Synonyms("Max")]
        Maximum
    }

    在读取的时候将实体类型转换到对应的枚举上。
    var entity = result.Entities.OfType("priority");
    var priority = entity.ValueAs<PriorityTypes>();
     

    Pattern Recognizer

    模式识别器就是用正则表达式来做识别。

    var regex = new Regex("[0-9a-fA-F]+[
    ]*");
    bot.CreateRecognizer("hex", regex);

    Functional Recognizer

    函数类型的识别器,就是指定一个函数来处理用户输入,解析出实体对象。

    如果要用于处理数据库对象,而不是将所有实体加载到内存,这种方法创建识别器非常方便。

    bot.CreateRecognizer("name", request =>
    {
        var entities = new EntityCollection();
        var message = request.NormalizedText;
        foreach (var item in SomeValues)
        {
            var index = message.IndexOf(item, StringComparison.OrdinalIgnoreCase);
            if (index == -1) continue;
            var entity = new Entity("name")
            {
                Value = item,
                Index = index
            };
            entities.Add(entity);
        }
        return entities;
    });

    Custom Recognizer

    自定义的识别器,实现Syn.Bot.Oscova.Interfaces.IEntityRecognizer 即可。

    比如自定义了一个html实体对象,

    public class HtmlEntity : IEntity
    {
        public HtmlEntity() { Type = "html"; }
        public string Type { get; set; }
        public string Value { get; set; }
        public int Index { get; set; }
    }

    然后实现接口

    public class HtmlRecognizer : IEntityRecognizer
    {
        public string Type => "html";
        public EntityCollection Parse(Request request)
        {
            var regex = new Regex(@"<(?<tag>w*)>(?<text>.*)</k<tag>>");
            var entities = new EntityCollection();
            foreach (Match match in regex.Matches(request.NormalizedText))
            {
                var entity = new HtmlEntity
                {
                    Value = match.Value,
                    Index = match.Index
                };
                entities.Add(entity);
            }
            return entities;
        }
    }

    需要注意的是,所有实体必须指定索引参数Index,它标记了用户输入中内容匹配的顺序。

    自定义完成记得添加到bot.Recognizers 集合中,这个操作应该在训练之前。

  • 相关阅读:
    《流畅的Python》Data Structures--第7章 colsure and decorator
    CSS Reset 2.0标准
    Layout
    一个简单的例子 vux mutation改变状态
    __WEBPACK_IMPORTED_MODULE_3_vuex__.a is not a constructor
    vuex 使用
    (转)Vue-初步了解vue-router的三要素:路由map 、路由视图、路由导航
    router-link-active 和 router-link-exact-active router-link-active
    当前目录 根目录 写法
    mode: 'history', 去掉路由地址的#
  • 原文地址:https://www.cnblogs.com/mrtiny/p/9082819.html
Copyright © 2011-2022 走看看