1

我在我的机器人中使用 MS LUIS。在一个意图中,我想识别数字。当用户输入包含逗号的数字时,例如“1,25”,LuisRecognizer 将“1,25”识别为数字。我使用这样的 RecognizeAsync 方法:

var luisresult = _recognizer.RecognizeAsync<MyLuisModel>(context, cancellationToken);

MyLuisModel 是使用 LUISgen 生成的:

public class M<LuisModel : IRecognizerConvert {
    public enum Intent {
        AnIntent,
        ....
    }

    [JsonProperty("intents")]
    public Dictionary<Intent, IntentScore> Intents;
    
    public class _Entities
    {
        // Built-in entities
        public double[] number;
        ....
    }

    // More stuff
}

现在的问题是,当数字“1,25”被识别时,实体编号不包含 1.25 作为双精度值,而是 125。

我来自德国,我们使用“,”作为分数分隔符。

根据github上的这篇CultureInfo.CurrentCulture文章,我尝试设置为德国文化:

CultureInfo.CurrentCulture = CultureInfo.CreateSpecificCulture("de-DE");

覆盖 double.TryParse() 使用的 CurrentCulture 但没有成功。

我怎样才能解决这个问题?

4

1 回答 1

1

我找到了答案。我想我仍然使用 LUIS V2 端点而不是较新的 V3。我已将识别器更新为如下所示:

using Microsoft.Bot.Builder;
using Microsoft.Bot.Builder.AI.LuisV3;

namespace MyNamespace {

    public class MyRecognizer : IRecognizer {
        private LuisRecognizer _recognizer;
        private RecognizerOptionsV3 _options;

        public MyRecognizer(string appId, string apiKey, string host) {
            _options = new LuisRecognizerOptionsV3(
                new LuisApplication(appId, apiKey,host)
            );

            _recognizer = new LuisRecognizer(_options);
        }
    }

    public virtual async Task<RecognizerResult> RecognizeAsync(ITurnContext turnContext, CancellationToken cancellationToken)
    {
        return await _recognizer.RecognizeAsync(turnContext, cancellationToken);
    }

    public virtual async Task<T> RecognizeAsync<T>(ITurnContext turnContext, CancellationToken cancellationToken) where T : IRecognizerConvert, new()
    {
        return await _recognizer.RecognizeAsync<T>(turnContext, cancellationToken);
    }
}

请注意我之前使用过 LuisRecognizerOptionsV2 的构造函数中的 LuisRecognizerOptionsV3 用法将其更改为 V3 是关键部分,现在“1,25”被正确解析为 1.25 双精度值。

CultureInfo.CurrentCulture现在设置为“de-DE”。使用 V2 时,它设置为InvariantCulture. 也许这是 V2 中的一种错误。

于 2021-07-20T11:36:09.480 回答