Botframework 在Microsoft Translate之前使用Bing拼写检查,该检查在呼叫LUIS之前调用

Botframework 在Microsoft Translate之前使用Bing拼写检查,该检查在呼叫LUIS之前调用,botframework,azure-language-understanding,Botframework,Azure Language Understanding,所以。。。 我想用瑞典语和路易斯一起使用机器人框架。 使用这些示例,我实现了将输入从瑞典语翻译成英语,然后调用LUIS功能。 在我们从路易斯那里得到一些非常奇怪的意图打击之前,这一切都很完美。 我们发现,一个非常小的拼写错误(瑞典语)导致翻译产生了一个触发错误意图的信息。 我们可以通过检查收到的意图的分数来解决问题,但是返回给用户的消息“我不明白”并没有特别的帮助。 通过Bing拼写检查运行相同的消息并用正确的文本替换错误的文本将产生正确的行为(大部分) 我想做的是使用拼写检查的结果来询问用户是

所以。。。 我想用瑞典语和路易斯一起使用机器人框架。 使用这些示例,我实现了将输入从瑞典语翻译成英语,然后调用LUIS功能。 在我们从路易斯那里得到一些非常奇怪的意图打击之前,这一切都很完美。 我们发现,一个非常小的拼写错误(瑞典语)导致翻译产生了一个触发错误意图的信息。 我们可以通过检查收到的意图的分数来解决问题,但是返回给用户的消息“我不明白”并没有特别的帮助。 通过Bing拼写检查运行相同的消息并用正确的文本替换错误的文本将产生正确的行为(大部分)

我想做的是使用拼写检查的结果来询问用户是否应该用Bing的结果替换他/她输入的文本

现在的问题是:我找不到一个合适的方法来实现用户的对话框。(如果可能,我希望避免使用PromptDialog.Confirm,因为它很难本地化)

我现在得到的(不起作用)大致是:

if (activity.Type == ActivityTypes.Message)
{
    correctedText = await sc.BingSpellCheck(activity.Text, spellValues);

    if (spellValues.Count > 0)
    {
      // Ask the client if the correction is ok
      await Conversation.SendAsync(activity, () => new CorrectSpellingDialog());
    }
    Translate.Current.ToEnglish(activity.Text, "en");
    await Conversation.SendAsync(activity, () => new MeBotLuisDialog());
}
我想在这里创建一个CorrectSpellingDialog(),它只返回true或false,如果它是true,我将调用…MeBotLuisDialog()

很抱歉,所有的文字,但这是一个很长的问题:-)

有人接受这个吗

(我的另一个解决方案是创建一个意图“拼写检查错误”,该错误由Bing拼写检查触发,意图中的将一条消息连同更正后的消息发送回机器人(尽管我不知道我是否可以以正确的方式执行)) //Tommy

要在您的机器人中启用,您将首先从Bing服务获取密钥,然后在
Web.config
文件中添加
BingSpellCheckApiKey
并一起启用
IsSpellCorrectionEnabled
,例如:

。在这里,你可以在你的应用程序中创建一个服务,例如这样

然后在
messages控制器中,在向对话框发送消息之前,先检查拼写。由于您希望向用户显示一个确认对话框,以确定文本是否应替换为Bing的结果,因此您可以先发送
FormFlow
,让用户进行选择。例如:

消息控制器的代码

private static readonly bool IsSpellCorrectionEnabled=bool.Parse(WebConfigurationManager.AppSettings[“IsSpellCorrectionEnabled”]);
private BingSpellCheckService spellService=new BingSpellCheckService();
/// 
///帖子:api/Messages
///接收来自用户的消息并回复
/// 
公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
如果(IsSpillCorrectionEnabled)
{
尝试
{
var text=wait this.spellService.GetCorrectedTextAsync(activity.text);
if(text!=activity.text)
{
//如果拼写错误,请转到rootdialog
wait Conversation.sendaync(activity,()=>newdialogs.RootDialog(activity.Text,Text));
}
其他的
{
//如果正确,直接前往路易斯Dialog
wait Conversation.sendaync(活动,()=>newdialogs.MyLuisDialog());
}
}
捕获(例外情况除外)
{
Trace.TraceError(例如ToString());
}
}
其他的
{                    
wait Conversation.sendaync(活动,()=>newdialogs.MyLuisDialog());
}
}
其他的
{
HandleSystemMessage(活动);
}
var response=Request.CreateResponse(HttpStatusCode.OK);
返回响应;
}
myRootDialog的代码

[可序列化]
公共类RootDialog:IDialog
{
私有字符串otext;
私有字符串;
公共根对话框(字符串oldtext、字符串newtext)
{
otext=旧文本;
ntext=新文本;
}
公共异步任务StartAsync(IDialogContext上下文)
{
Wait(MessageReceivedAsync);
}
公共异步任务消息ReceivedAsync(IDialogContext上下文,IAwaitable结果)
{
var消息=等待结果;
变量形式=新形式对话框(新确认(otext,ntext),
Confirmation.BuildForm、FormOptions.PrompInstart、null);
调用(表单,this.GetResultAsync);
}
专用异步任务GetResultAsync(IDialogContext上下文,IAwaitable结果)
{
var状态=等待结果;
wait context.Forward(new MyLuisDialog(),null,context.Activity,System.Threading.CancellationToken.None);
}
}
[可序列化]
公开课确认
{
公共字符串文本{get;set;}
私有静态字符串otext;
私有静态字符串ntext;
公开确认(字符串旧文本、字符串新文本)
{
otext=旧文本;
ntext=新文本;
}
公共静态表单BuildForm()
{
返回新的FormBuilder()
.字段(新字段反射器(名称(文本))
.SetType(空)
.SetDefine(异步(状态、字段)=>
{
领域
.AddDescription(otext,otext)
.AddTerms(otext,otext)
.AddDescription(ntext,ntext)
.AddTerms(ntext,ntext);
返回true;
}))
.Build();
}
}

但您正在尝试在控制器中执行此操作?是的,它位于消息Controller.csIt中,如果您直接从对话框中执行此操作,效果会更好
MessageController
启动一个RootDialog,该RootDialog执行您的逻辑/调用/转发到另一个对话框,这正是我所需要的!非常感谢你@TommyEinarsson,如果这个答案有帮助的话,你能在这个答案上做个记号吗?冯。我很抱歉答案更新得太晚了。