From 7b05297c30b4f055f44ce36f282011b22efd70cc Mon Sep 17 00:00:00 2001 From: haiping008 Date: Mon, 18 Dec 2017 07:31:15 -0600 Subject: [PATCH] Intent, Intent Expression --- Bot.Rasa/Agents/Agent.cs | 7 +++- Bot.Rasa/Agents/AgentExtension.cs | 36 ++++++++++++++++++++ Bot.Rasa/Console/RequestExtension.cs | 50 ++++++---------------------- Bot.Rasa/EntityDbContextExtension.cs | 11 ++++++ Bot.Rasa/Intents/Intent.cs | 12 +++++++ Bot.Rasa/Intents/IntentExpression.cs | 29 ++++++++++++++++ Bot.Rasa/Models/RasaTrainingData.cs | 13 ++++++++ Bot.Rasa/Models/UserSay.cs | 12 +++++++ Bot.UnitTest/AgentTest.cs | 9 +++-- Bot.UnitTest/Database.cs | 5 --- Bot.UnitTest/GenerateTestData.cs | 34 +++++++++++++++++++ 11 files changed, 171 insertions(+), 47 deletions(-) create mode 100644 Bot.Rasa/Agents/AgentExtension.cs create mode 100644 Bot.Rasa/Intents/IntentExpression.cs create mode 100644 Bot.Rasa/Models/RasaTrainingData.cs create mode 100644 Bot.Rasa/Models/UserSay.cs create mode 100644 Bot.UnitTest/GenerateTestData.cs diff --git a/Bot.Rasa/Agents/Agent.cs b/Bot.Rasa/Agents/Agent.cs index 42a9d61c..80ddfa72 100644 --- a/Bot.Rasa/Agents/Agent.cs +++ b/Bot.Rasa/Agents/Agent.cs @@ -1,8 +1,10 @@ -using CustomEntityFoundation.Entities; +using Bot.Rasa.Intents; +using CustomEntityFoundation.Entities; using EntityFrameworkCore.BootKit; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; using System.Text; namespace Bot.Rasa.Agents @@ -11,5 +13,8 @@ namespace Bot.Rasa.Agents { [MaxLength(64)] public String Name { get; set; } + + [ForeignKey("AgentId")] + public List Intents { get; set; } } } diff --git a/Bot.Rasa/Agents/AgentExtension.cs b/Bot.Rasa/Agents/AgentExtension.cs new file mode 100644 index 00000000..b406ea43 --- /dev/null +++ b/Bot.Rasa/Agents/AgentExtension.cs @@ -0,0 +1,36 @@ +using Bot.Rasa.Models; +using CustomEntityFoundation; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Bot.Rasa.Agents +{ + public static class AgentExtension + { + public static RasaTrainingData GrabCorpus(this RasaAgent agent, EntityDbContext dc) + { + var trainingData = new RasaTrainingData + { + UserSays = new List() + }; + + var intents = dc.Intent().Include(x => x.Expressions).ToList(); + + intents.ForEach(intent => { + + trainingData.UserSays.AddRange(intent.Expressions + .Select(exp => new UserSay + { + Intent = intent.Name, + Text = exp.Text + })); + + }); + + return trainingData; + } + } +} diff --git a/Bot.Rasa/Console/RequestExtension.cs b/Bot.Rasa/Console/RequestExtension.cs index bbd46b30..18168891 100644 --- a/Bot.Rasa/Console/RequestExtension.cs +++ b/Bot.Rasa/Console/RequestExtension.cs @@ -1,4 +1,5 @@ using Bot.Rasa.Agents; +using Bot.Rasa.Models; using CustomEntityFoundation; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; @@ -25,54 +26,25 @@ namespace Bot.Rasa.Console return response.Data; } - public static bool Train(this RasaConsole console, String agentId) + public static bool Train(this RasaConsole console, EntityDbContext dc, String agentId) { - var client = new RestClient($"{console.options.HostUrl}"); + var agent = dc.Agent().Find(agentId); + var corpus = agent.GrabCorpus(dc); - var request = new RestRequest("train", Method.POST); - - request.AddQueryParameter("project", agentId); - - string json = JsonConvert.SerializeObject(new - { - rasa_nlu_data = new RasaTrainingData + string json = JsonConvert.SerializeObject(new { rasa_nlu_data = corpus }, + new JsonSerializerSettings { - UserSays = new List - { - new UserSay{ Text = "What's the weather like today?", Intent = "Weather" }, - new UserSay{ Text = "Is gonna rain tomorrow?", Intent = "Weather"}, - new UserSay{ Text = "Sunny", Intent = "Weather"}, - new UserSay{ Text = "Is it raining outside?", Intent = "Weather"}, - new UserSay{ Text = "It is raining", Intent = "Weather"}, - new UserSay{ Text = "How old are you?", Intent = "Age"}, - new UserSay{ Text = "When were you born?", Intent = "Age"}, - new UserSay{ Text = "Where do you come from", Intent = "Country"}, - new UserSay{ Text = "Where are you from?", Intent = "Country"}, - new UserSay{ Text = "are you from US?", Intent = "Country"}, - new UserSay{ Text = "What do you like for lunch?", Intent = "Lunch"}, - new UserSay{ Text = "Would you like some cookie?", Intent = "Lunch"} - } - } - }, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); + ContractResolver = new CamelCasePropertyNamesContractResolver() + }); + var client = new RestClient($"{console.options.HostUrl}"); + var request = new RestRequest("train", Method.POST); + request.AddQueryParameter("project", agentId); request.AddParameter("application/json", json, ParameterType.RequestBody); var response = client.Execute(request); return true; } - - } - - public class RasaTrainingData - { - [JsonProperty("common_examples")] - public List UserSays { get; set; } - } - - public class UserSay - { - public String Text { get; set; } - public String Intent { get; set; } } } diff --git a/Bot.Rasa/EntityDbContextExtension.cs b/Bot.Rasa/EntityDbContextExtension.cs index 9fda0c99..d317834e 100644 --- a/Bot.Rasa/EntityDbContextExtension.cs +++ b/Bot.Rasa/EntityDbContextExtension.cs @@ -1,4 +1,5 @@ using Bot.Rasa.Agents; +using Bot.Rasa.Intents; using CustomEntityFoundation; using EntityFrameworkCore.BootKit; using Microsoft.EntityFrameworkCore; @@ -15,5 +16,15 @@ namespace Bot.Rasa { return dc.Table(); } + + public static DbSet Intent(this EntityDbContext dc) + { + return dc.Table(); + } + + public static DbSet IntentExpression(this EntityDbContext dc) + { + return dc.Table(); + } } } diff --git a/Bot.Rasa/Intents/Intent.cs b/Bot.Rasa/Intents/Intent.cs index ee832c61..d073a73c 100644 --- a/Bot.Rasa/Intents/Intent.cs +++ b/Bot.Rasa/Intents/Intent.cs @@ -2,6 +2,7 @@ using EntityFrameworkCore.BootKit; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; @@ -9,6 +10,17 @@ namespace Bot.Rasa.Intents { public class RasaIntent : Entity, IDbRecord { + [Required] + [StringLength(36)] + public String AgentId { get; set; } + + [MaxLength(32)] public String Name { get; set; } + + [MaxLength(256)] + public String Description { get; set; } + + [ForeignKey("IntentId")] + public List Expressions { get; set; } } } diff --git a/Bot.Rasa/Intents/IntentExpression.cs b/Bot.Rasa/Intents/IntentExpression.cs new file mode 100644 index 00000000..d3860640 --- /dev/null +++ b/Bot.Rasa/Intents/IntentExpression.cs @@ -0,0 +1,29 @@ +using CustomEntityFoundation; +using CustomEntityFoundation.Entities; +using EntityFrameworkCore.BootKit; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; + +namespace Bot.Rasa.Intents +{ + public class RasaIntentExpression : Entity, IDbRecord + { + [Required] + [StringLength(36)] + public String IntentId { get; set; } + + [Required] + [MaxLength(128)] + public String Text { get; set; } + + public override bool IsExist(EntityDbContext dc) + { + return dc.Table().Any(x => x.IntentId == IntentId && x.Text == Text); + } + } +} diff --git a/Bot.Rasa/Models/RasaTrainingData.cs b/Bot.Rasa/Models/RasaTrainingData.cs new file mode 100644 index 00000000..6629eff3 --- /dev/null +++ b/Bot.Rasa/Models/RasaTrainingData.cs @@ -0,0 +1,13 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Bot.Rasa.Models +{ + public class RasaTrainingData + { + [JsonProperty("common_examples")] + public List UserSays { get; set; } + } +} diff --git a/Bot.Rasa/Models/UserSay.cs b/Bot.Rasa/Models/UserSay.cs new file mode 100644 index 00000000..0906531c --- /dev/null +++ b/Bot.Rasa/Models/UserSay.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Bot.Rasa.Models +{ + public class UserSay + { + public String Text { get; set; } + public String Intent { get; set; } + } +} diff --git a/Bot.UnitTest/AgentTest.cs b/Bot.UnitTest/AgentTest.cs index 82c0df65..baa0454c 100644 --- a/Bot.UnitTest/AgentTest.cs +++ b/Bot.UnitTest/AgentTest.cs @@ -27,7 +27,12 @@ namespace Bot.UnitTest Name = "Pizza Bot" }; - dc.DbTran(() => rasa.CreateAgent(agent)); + int row = dc.DbTran(() => rasa.CreateAgent(agent)); + if(row > 0) + { + var generator = new GenerateTestData(); + dc.DbTran(() => generator.LoadData(dc, agent)); + } } [TestMethod] @@ -43,7 +48,7 @@ namespace Bot.UnitTest public void Train() { var rasa = new RasaConsole(dc, Options); - rasa.Train(PIZZA_BOT_ID); + rasa.Train(dc, PIZZA_BOT_ID); } } } diff --git a/Bot.UnitTest/Database.cs b/Bot.UnitTest/Database.cs index fdb0b189..fc6feeff 100644 --- a/Bot.UnitTest/Database.cs +++ b/Bot.UnitTest/Database.cs @@ -1,11 +1,6 @@ using CustomEntityFoundation; -using CustomEntityFoundation.Entities; -using EntityFrameworkCore.BootKit; -using Microsoft.Data.Sqlite; using System; -using System.Collections.Generic; using System.IO; -using System.Text; namespace Bot.UnitTest { diff --git a/Bot.UnitTest/GenerateTestData.cs b/Bot.UnitTest/GenerateTestData.cs new file mode 100644 index 00000000..a8bb3917 --- /dev/null +++ b/Bot.UnitTest/GenerateTestData.cs @@ -0,0 +1,34 @@ +using Bot.Rasa; +using Bot.Rasa.Agents; +using Bot.Rasa.Intents; +using CustomEntityFoundation; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Bot.UnitTest +{ + public class GenerateTestData + { + public void LoadData(EntityDbContext dc, RasaAgent agent) + { + var intent = new RasaIntent + { + AgentId = agent.Id, + Name = "Weather", + Expressions = new List + { + new RasaIntentExpression { Text ="What is the weather like today in Chicago?" }, + new RasaIntentExpression { Text ="Is it will be rain?" }, + new RasaIntentExpression { Text ="It's windy outside?" }, + new RasaIntentExpression { Text ="It's very code there?" } + } + }; + + if (dc.Intent().Any(x => x.Name == intent.Name)) return; + + dc.Intent().Add(intent); + } + } +}