public async Task <object> AnswerAsync(Question question) { var results = NumberWithUnitRecognizer .RecognizeCurrency(question.ToString(), Culture.English) .Where(r => r.TypeName == "currency" && r.AttributesStrings().ContainsKey("isoCurrency")) .ToList(); if (!results.Any()) { throw new ArgumentException("Unknown currency: " + question); } // currency conversion if (results.Count == 2 && results[0].TypeName == "currency" && results[1].TypeName == "currency") { var from = results[0].AttributesStrings(); var to = results[1].AttributesStrings()["isoCurrency"]; var rate = await GetCurrencyRateAsync(from["isoCurrency"], to); return(from.ContainsKey("value") && from["value"] is string value // present and not a null value ? new Currency(decimal.Parse(value) * rate, to, symbolsByCode[to]) : rate as object); } var parsed = string.Join( Environment.NewLine, results .Select(d => d.AttributesStrings()) .Select(d => symbolsByCode[d["isoCurrency"]] + " " + d["unit"] + " (" + d["isoCurrency"] + ")") ); return(parsed); }
protected override Task <PromptRecognizerResult <NumberWithUnitResult> > OnRecognizeAsync(ITurnContext turnContext, IDictionary <string, object> state, PromptOptions options, CancellationToken cancellationToken = default(CancellationToken)) { if (turnContext == null) { throw new ArgumentNullException(nameof(turnContext)); } var result = new PromptRecognizerResult <NumberWithUnitResult>(); if (turnContext.Activity.Type == ActivityTypes.Message) { var message = turnContext.Activity.AsMessageActivity(); var culture = turnContext.Activity.Locale ?? DefaultLocale ?? English; List <Microsoft.Recognizers.Text.ModelResult> results = null; switch (PromptType) { case NumberWithUnitPromptType.Currency: results = NumberWithUnitRecognizer.RecognizeCurrency(message.Text, culture); break; case NumberWithUnitPromptType.Dimension: results = NumberWithUnitRecognizer.RecognizeDimension(message.Text, culture); break; case NumberWithUnitPromptType.Age: results = NumberWithUnitRecognizer.RecognizeAge(message.Text, culture); break; case NumberWithUnitPromptType.Temperature: results = NumberWithUnitRecognizer.RecognizeTemperature(message.Text, culture); break; } if (results?.Count > 0) { var resolvedUnit = results[0].Resolution["unit"].ToString(); var resolvedValue = results[0].Resolution["value"].ToString(); if (double.TryParse(resolvedValue, out var value)) { result.Succeeded = true; var numberWithUnitResult = new NumberWithUnitResult { Unit = resolvedUnit, Value = value }; result.Value = numberWithUnitResult; } } } return(Task.FromResult(result)); }
public void RecognizeCurrency() { var input = "montgomery county , md . - - $ 75 million of general obligation , series b , consolidated public improvement bonds of 1989 , through a manufacturers hanover trust co . group ."; var actual = NumberWithUnitRecognizer.RecognizeCurrency(input, Culture.English); Assert.AreEqual("currency", actual[0].TypeName); Assert.AreEqual("$ 75 million", actual[0].Text); Assert.AreEqual("75000000", actual[0].Resolution["value"]); Assert.AreEqual("Dollar", actual[0].Resolution["unit"]); }
private Tuple <string, string> ExtractNumberCurrency(string ammount) { var res = NumberWithUnitRecognizer.RecognizeCurrency(ammount, Culture.French).Where(x => x.TypeName == "currency").FirstOrDefault(); if (res != null) { var amm = (string)res.Resolution["value"]; var cur = (string)res.Resolution["unit"]; return(new Tuple <string, string>(amm, cur)); } return(new Tuple <string, string>(null, null)); }
/// <summary> /// Parse query with all recognizers /// </summary> private static IEnumerable <ModelResult> ParseAll(string query, string culture) { return(MergeResults( // Number recognizer will find any number from the input // E.g "I have two apples" will return "2". NumberRecognizer.RecognizeNumber(query, culture), // Ordinal number recognizer will find any ordinal number // E.g "eleventh" will return "11". NumberRecognizer.RecognizeOrdinal(query, culture), // Percentage recognizer will find any number presented as percentage // E.g "one hundred percents" will return "100%" NumberRecognizer.RecognizePercentage(query, culture), // Number Range recognizer will find any cardinal or ordinal number range // E.g. "between 2 and 5" will return "(2,5)" NumberRecognizer.RecognizeNumberRange(query, culture), // Age recognizer will find any age number presented // E.g "After ninety five years of age, perspectives change" will return "95 Year" NumberWithUnitRecognizer.RecognizeAge(query, culture), // Currency recognizer will find any currency presented // E.g "Interest expense in the 1988 third quarter was $ 75.3 million" will return "75300000 Dollar" NumberWithUnitRecognizer.RecognizeCurrency(query, culture), // Dimension recognizer will find any dimension presented // E.g "The six-mile trip to my airport hotel that had taken 20 minutes earlier in the day took more than three hours." will return "6 Mile" NumberWithUnitRecognizer.RecognizeDimension(query, culture), // Temperature recognizer will find any temperature presented // E.g "Set the temperature to 30 degrees celsius" will return "30 C" NumberWithUnitRecognizer.RecognizeTemperature(query, culture), // Datetime recognizer This model will find any Date even if its write in coloquial language // E.g "I'll go back 8pm today" will return "2017-10-04 20:00:00" DateTimeRecognizer.RecognizeDateTime(query, culture), // PhoneNumber recognizer will find any phone number presented // E.g "My phone number is ( 19 ) 38294427." SequenceRecognizer.RecognizePhoneNumber(query, culture), // Add IP recognizer - This recognizer will find any Ipv4/Ipv6 presented // E.g "My Ip is 8.8.8.8" SequenceRecognizer.RecognizeIpAddress(query, culture), // Add Boolean recognizer - This model will find yes/no like responses, including emoji - // E.g "yup, I need that" will return "True" ChoiceRecognizer.RecognizeBoolean(query, culture) )); }
private static bool IsValidNumberCurrency(string ammount, string currency) { if ((String.IsNullOrEmpty(currency)) || (String.IsNullOrEmpty(ammount))) { return(false); } if (NumberWithUnitRecognizer.RecognizeCurrency(ammount, Culture.French).Where(x => x.TypeName == "currency").FirstOrDefault() != null) { // var ret = res.Resolution["value"]; return(true); } else { if (NumberRecognizer.RecognizeNumber(ammount, Culture.French).Where(x => x.TypeName == "number").FirstOrDefault() != null) { return(true); } } return(false); }
private static List <ModelResult> RecognizeNumberWithUnit(string utterance, string culture) { var number = NumberRecognizer.RecognizeNumber(utterance, culture); if (number.Any()) { // Result when it matches with a number recognizer return(number); } else { // Analyze every option for numberWithUnit var results = new List <List <ModelResult> >(); results.Add(NumberWithUnitRecognizer.RecognizeCurrency(utterance, culture)); results.Add(NumberWithUnitRecognizer.RecognizeAge(utterance, culture)); results.Add(NumberWithUnitRecognizer.RecognizeTemperature(utterance, culture)); results.Add(NumberWithUnitRecognizer.RecognizeDimension(utterance, culture)); // Filter the options that returned nothing and return the one that matched return(results.FirstOrDefault(r => r.Any()) ?? new List <ModelResult>()); } }
private static IEnumerable <ModelResult> ParseAll(string query, string culture) { return(MergeResults( // Number recognizer will find any number from the input NumberRecognizer.RecognizeNumber(query, culture), // Ordinal number recognizer will find any ordinal number NumberRecognizer.RecognizeOrdinal(query, culture), // Percentage recognizer will find any number presented as percentage NumberRecognizer.RecognizePercentage(query, culture), // Number Range recognizer will find any cardinal or ordinal number range NumberRecognizer.RecognizeNumberRange(query, culture), // Age recognizer will find any age number presented NumberWithUnitRecognizer.RecognizeAge(query, culture), // Currency recognizer will find any currency presented NumberWithUnitRecognizer.RecognizeCurrency(query, culture), // Dimension recognizer will find any dimension presented NumberWithUnitRecognizer.RecognizeDimension(query, culture), // Temperature recognizer will find any temperature presented NumberWithUnitRecognizer.RecognizeTemperature(query, culture), // Datetime recognizer This model will find any Date even if its write in coloquial language DateTimeRecognizer.RecognizeDateTime(query, culture), // PhoneNumber recognizer will find any phone number presented SequenceRecognizer.RecognizePhoneNumber(query, culture), // Add IP recognizer - This recognizer will find any Ipv4/Ipv6 presented SequenceRecognizer.RecognizeIpAddress(query, culture) )); }
[NotNull] public static Extraction CurrencyAndAmount(string input, string culture = Culture.EnglishOthers) { Extraction Extract() { var results = NumberWithUnitRecognizer.RecognizeCurrency(input, culture); //Try to get the result var cur = results.FirstOrDefault(d => d.TypeName.StartsWith("currency")); if (cur == null) { return(null); } var values = cur.Resolution; if (!values.TryGetValue("unit", out var unitObj) || !(unitObj is string unit)) { return(new Extraction("unit")); } if (!values.TryGetValue("value", out var valueObj) || !(valueObj is string value)) { return(new Extraction("value")); } if (!decimal.TryParse(value, out var deci)) { return(new Extraction("value")); } return(new Extraction(unit, deci)); } return(Extract() ?? new Extraction("value,unit")); }
public void RecognizeCurrency(string text, string culture, string scale, string typeName) { NumberWithUnitRecognizer.RecognizeCurrency(text, culture); }
protected override List <ModelResult> Recognize(string text, string culture) { return(NumberWithUnitRecognizer.RecognizeCurrency(text, culture)); }
private void OutputButton_Click(object sender, EventArgs e) { listView1.Items.Clear(); string query = InputField.Text; string SelectedRecognizer = RecognizerField.Text; string culture = LanguageToCode(LanguageField.Text); if (query != "") { //----------------------------------------------------------Recognizers try { if (SelectedRecognizer == "Number Recognizer") { // Number recognizer will find any number from the input // E.g "I have two apples" will return "2". var Recognizer = NumberRecognizer.RecognizeNumber(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Ordinal Recognizer") { // Ordinal number recognizer will find any ordinal number // E.g "eleventh" will return "11". var Recognizer = NumberRecognizer.RecognizeOrdinal(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Percentage Recognizer") { // Percentage recognizer will find any number presented as percentage // E.g "one hundred percents" will return "100%" var Recognizer = NumberRecognizer.RecognizePercentage(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Number Range Recognizer") { // Number Range recognizer will find any cardinal or ordinal number range // E.g. "between 2 and 5" will return "(2,5)" var Recognizer = NumberRecognizer.RecognizeNumberRange(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Age Recognizer") { // Age recognizer will find any age number presented // E.g "After ninety five years of age, perspectives change" will return "95 Year" var Recognizer = NumberWithUnitRecognizer.RecognizeAge(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Currency Recognizer") { // Currency recognizer will find any currency presented // E.g "Interest expense in the 1988 third quarter was $ 75.3 million" will return "75300000 Dollar" var Recognizer = NumberWithUnitRecognizer.RecognizeCurrency(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Dimention Recognizer") { // Dimension recognizer will find any dimension presented // E.g "The six-mile trip to my airport hotel that had taken 20 minutes earlier in the day took more than three hours." will return "6 Mile" var Recognizer = NumberWithUnitRecognizer.RecognizeDimension(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Temperature Recognizer") { // Temperature recognizer will find any temperature presented // E.g "Set the temperature to 30 degrees celsius" will return "30 C" var Recognizer = NumberWithUnitRecognizer.RecognizeTemperature(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Date And Time Recognizer") { // Datetime recognizer This model will find any Date even if its write in coloquial language // E.g "I'll go back 8pm today" will return "2017-10-04 20:00:00" var Recognizer = DateTimeRecognizer.RecognizeDateTime(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Phone Number Recognizer") { // PhoneNumber recognizer will find any phone number presented // E.g "My phone number is ( 19 ) 38294427." var Recognizer = SequenceRecognizer.RecognizePhoneNumber(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Ip Address Recognizer") { //IP recognizer will find any Ipv4/Ipv6 presented // E.g "My Ip is 8.8.8.8" var Recognizer = SequenceRecognizer.RecognizeIpAddress(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } else if (SelectedRecognizer == "Choice Recognizer") { //Boolean recognizer will find yes/no like responses, including emoji - // E.g "yup, I need that" will return "True" var Recognizer = ChoiceRecognizer.RecognizeBoolean(query, culture); for (int i = 0; i < Recognizer.Count; i++) { string[] arr = new string[4]; ListViewItem itm; //add items to ListView arr[0] = Recognizer[i].Text.ToString(); arr[1] = Recognizer[i].Resolution["value"].ToString(); arr[2] = Recognizer[i].Start.ToString(); arr[3] = Recognizer[i].End.ToString(); itm = new ListViewItem(arr); listView1.Items.Add(itm); } } } catch (Exception error) { MessageBox.Show("Unable to Recognize\n" + "Exception: " + error.Message.ToString()); } } //----------------------------------------------------------Recognizers End }
protected override Task <InputState> OnRecognizeInputAsync(DialogContext dc, CancellationToken cancellationToken) { var validateText = dc.State.GetValue <object>(VALUE_PROPERTY); if (!(validateText is string)) { return(Task.FromResult(InputState.Invalid)); } var culture = GetCulture(dc); List <ModelResult> results; var message = validateText.ToString(); switch (NumberUnit.GetValue(dc.State)) { case NumberWithUnitInputType.Temperature: results = NumberWithUnitRecognizer.RecognizeTemperature(message, culture); break; case NumberWithUnitInputType.Dimension: results = NumberWithUnitRecognizer.RecognizeDimension(message, culture); break; case NumberWithUnitInputType.Currency: results = NumberWithUnitRecognizer.RecognizeCurrency(message, culture); break; case NumberWithUnitInputType.Age: results = NumberWithUnitRecognizer.RecognizeAge(message, culture); break; default: throw new ArgumentOutOfRangeException(); } if (results == null || results.Count <= 0) { return(Task.FromResult(InputState.Unrecognized)); } var resolvedUnit = results[0].Resolution["unit"].ToString(); var resolvedValue = results[0].Resolution["value"].ToString(); if (!double.TryParse(resolvedValue, out var value)) { return(Task.FromResult(InputState.Valid)); } var result = new { Unit = resolvedUnit, Value = value, }; if (ResultProperty != null) { dc.State.SetValue(ResultProperty.GetValue(dc.State), result); } return(Task.FromResult(InputState.Valid)); }