离线技能开发指南

效果

送:来首周杰伦的红豆

出:

{

"intent": "music",

"rule": 1

"parameters": {

    "artist": "周杰伦",  

    "song": "红豆" 

}

}

后面应用就根据这个,自己来处理了。Artist,song,music,rule是应用开发者自己预先定义的


技能json配置文件

用户自己配置修改

{

"name":" music ",
"active":"on",
"body":[
   {
        "pattern":"(我|咱|俺)?(要|想要|想)?(听|来|播放)(一)?(首)?(.+)的(.+)",
        "rule":1,
        “priority”:0,
        "parameters":{
            "artist":6,
            "song":7
        }
    },

   {
        "pattern":"(听|来|播放)(一)?(首)?歌",
        "rule":2,
    }
]

}

Name:意图的名称

Active:开启(on)或者关闭(off)

Pattern: 正则匹配规则

Rule:匹配的第几个规则

Parameters:变量,保存语义槽

Priority: 优先级,0最低。如果优先级高的,那么就算它的打分再低,也会优先匹配,忽略其它优先级低的

"artist":6,

"song":7

表示正则第6第7个解析的变量,存储在artist和song中。

这个6和7比较难懂,后面计划做个人性化的编辑方式,用脚本语言再转换为json格式


比如人性化的方式:

service = 'music'

me = '(我|咱|俺)'

want = '(要|想要|想)'

listen = '(听|来|播放)(一)?(首)?'

artist = range_tag(4, 'artist')

music_name = range_tag(8, 'song')

来首周杰伦的歌

case_1 = e(me) + e(want) + listen + artist + '的歌(曲)?'

rule_1 = Rule(attach_perperty(case_1, {'operation': 'play', 'rule': 1}))

我想听王菲的红豆

case_2 = e(me) + e(want) + listen + artist + '的' + music_name

rule_2 = Rule(attach_perperty(case_2, {'operation': 'play', 'rule': 2}))

我们实现技能配置的时候,一个意图里,可以做多种正则规则的配置

但是这些规则匹配成功,都代表这个意图。内部实现可以用链表连起来


API接口说明:

void micro_nlp_load_file(char* path); 第一次使用的时候,调用一次。path是我们定义技能janson文件的文件夹路径

void micro_nlp_unload(void); 不使用该库的时候使用,基本用不到

char* micro_nlp_process(char* src, int* score); 返回值是json结果,匹配的意图数据。如果匹配失败,返回为空。src是我们需要处理的中文文字信息,不要分词。score代表分数,越高越好,返回值的buffer是库内部维护的,一个4096字节的大小,应用程序只应该对它读,不要去写

一个使用的简单例子:

#include "micro_nlp_api.h"

int main(int argc, char **argv)

{

int score = 0;

micro_nlp_load_file("skills");

char *dst = micro_nlp_process("我想听王菲的红豆", &score);

printf("score = %d, dst = %s\n", score, dst);

return 0;

}

正则规则

char *src = "我想听王菲的红豆";

char *pattern = "(我|咱|俺)?(要|想要|想)?(听|来|播放)(一)?(首)?(.+)(的)(.+)";

1 (我|咱|俺)? --->代表括号内的可有可无

2 (我|咱|俺) --->存在的话,必须只能是其中一个

3 (的) --->必须要有

4 (.+) --->一个或多个字符

加了括号会影响匹配的分数,加了就会比较大,建议所以的都加括号统一


参考代码

在 senseflow 里,components内,可以参考 nlp_engine 和 skill_demo

results matching ""

    No results matching ""