在路易斯中,我用一个简单的实体创建了一个简单的图案,如下所示:
list bots {Name}
其中“名称”是我想在C#中获得的实体。模式和意图都可以正常工作,我可以正确地找到它。
我遵循官方示例并构建了IRecognizerConvert类,因此我可以反序列化结果。它可以很好地反序列化意图,但是不能反序列化实体。
在_Entities子类中,我只有要尝试反序列化的“名称”变量,而没有别的。我没有其他部分课程。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Bot.Builder;
using Newtonsoft.Json;
using Microsoft.Bot.Builder.AI.Luis;
namespace EmptyBot1.Models
{
public class ChatbotIntent : IRecognizerConvert
{
public string Text;
public string AlteredText;
public enum Intent
{
CreateBot,
ListBots,
ListAllBots,
RunBot,
Cancel,
Greet,
None
};
public Dictionary<Intent, IntentScore> Intents;
public class _Entities
{
public string Name;
}
public _Entities Entities;
[JsonExtensionData(ReadData = true, WriteData = true)]
public IDictionary<string, object> Properties { get; set; }
public void Convert(dynamic result)
{
var _result = JsonConvert.DeserializeObject<ChatbotIntent>(JsonConvert.SerializeObject(result, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
Text = _result.Text;
AlteredText = _result.AlteredText;
Intents = _result.Intents;
Entities = _result.Entities;
Properties = _result.Properties;
}
public (Intent intent, double score) TopIntent()
{
Intent maxIntent = Intent.None;
var max = 0.0;
foreach (var entry in Intents)
{
if (entry.Value.Score > max)
{
maxIntent = entry.Key;
max = entry.Value.Score.Value;
}
}
return (maxIntent, max);
}
}
}
在上一片段中,重要的部分是_Entities类,该类定义了从Luis返回时实体的外观。因为我只有1个简单的字符串实体“名称”,所以我认为这已经足够。
public class _Entities
{
public string Name;
}
但是,当我运行它时,却发出类似以下的声音:
"list bots mybots"
路易斯会正确分配Name =“ mybots”并获得正确的意图,但是它在JsonConvert.DeserializeObject行上崩溃,提示json格式不正确。我认为这是在抱怨我上的课吗?而且不是luis的实际JSON结果?
我需要在_Entities类中添加什么以便可以成功反序列化luis实体?
按照@ranusharao的建议,使用LUISGen工具,将自动生成与bot框架一起使用的类。