From dd997752a0832654991083284b8967ffb7101310 Mon Sep 17 00:00:00 2001 From: "haiping008@gmail.com" Date: Fri, 10 Aug 2018 15:10:53 -0500 Subject: [PATCH] Abstract nlp pipeline result to Doc object. The Doc object owns the sequence of tokens. --- BotSharp.Core/Abstractions/INlpPipeline.cs | 6 +- BotSharp.Core/BotSharp.Core.csproj | 2 +- BotSharp.Core/Engines/BotEngineBase.cs | 25 ++++++- BotSharp.Core/Engines/BotPreditor.cs | 26 +++++-- BotSharp.Core/Engines/BotTrainer.cs | 4 +- .../CRFsuite/CRFsuiteEntityRecognizer.cs | 40 +++++------ .../Engines/Classifiers/FasttextClassifier.cs | 18 +++-- BotSharp.Core/Engines/NlpDoc.cs | 20 ++++++ BotSharp.Core/Engines/SpaCy/SpaCyEntitizer.cs | 4 +- .../Engines/SpaCy/SpaCyEntityRecognizer.cs | 6 +- BotSharp.Core/Engines/SpaCy/SpaCyProvider.cs | 4 +- BotSharp.Core/Engines/SpaCy/SpaCyTagger.cs | 7 +- .../Engines/SpaCy/SpaCyTextCategorizer.cs | 11 +-- BotSharp.Core/Engines/SpaCy/SpaCyTokenizer.cs | 19 +++-- .../Engines/SpaCy/SpacyFeaturizer.cs | 6 +- .../Engines/TextClassificationResult.cs | 13 ++++ BotSharp.MachineLearning/CRFsuite/Crfutils.cs | 66 ++++++++++-------- BotSharp.WebHost/Program.cs | 2 +- BotSharp.WebHost/crfsuite.exe | Bin 215040 -> 0 bytes BotSharp.WebHost/ner-crf.corpus.predict.txt | 10 --- BotSharp.WebHost/ner-crf.parsed.predict.txt | 10 --- BotSharp.sln | 6 -- 22 files changed, 176 insertions(+), 129 deletions(-) create mode 100644 BotSharp.Core/Engines/NlpDoc.cs create mode 100644 BotSharp.Core/Engines/TextClassificationResult.cs delete mode 100644 BotSharp.WebHost/crfsuite.exe delete mode 100644 BotSharp.WebHost/ner-crf.corpus.predict.txt delete mode 100644 BotSharp.WebHost/ner-crf.parsed.predict.txt diff --git a/BotSharp.Core/Abstractions/INlpPipeline.cs b/BotSharp.Core/Abstractions/INlpPipeline.cs index 09e98807..68112a6d 100644 --- a/BotSharp.Core/Abstractions/INlpPipeline.cs +++ b/BotSharp.Core/Abstractions/INlpPipeline.cs @@ -25,10 +25,10 @@ namespace BotSharp.Core.Abstractions /// Process /// /// - /// Intermediate result + /// Intermediate result /// Meta data which is packed to model /// - Task Train(Agent agent, JObject data, PipeModel meta); - Task Predict(Agent agent, JObject data, PipeModel meta); + Task Train(Agent agent, NlpDoc doc, PipeModel meta); + Task Predict(Agent agent, NlpDoc doc, PipeModel meta); } } diff --git a/BotSharp.Core/BotSharp.Core.csproj b/BotSharp.Core/BotSharp.Core.csproj index 39d13d25..b978fb49 100644 --- a/BotSharp.Core/BotSharp.Core.csproj +++ b/BotSharp.Core/BotSharp.Core.csproj @@ -35,6 +35,7 @@ + @@ -42,7 +43,6 @@ - diff --git a/BotSharp.Core/Engines/BotEngineBase.cs b/BotSharp.Core/Engines/BotEngineBase.cs index c5854450..6b7072d8 100644 --- a/BotSharp.Core/Engines/BotEngineBase.cs +++ b/BotSharp.Core/Engines/BotEngineBase.cs @@ -2,6 +2,7 @@ using BotSharp.Core.Entities; using BotSharp.Core.Intents; using BotSharp.Core.Models; +using BotSharp.MachineLearning.NLP; using EntityFrameworkCore.BootKit; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; @@ -37,8 +38,28 @@ namespace BotSharp.Core.Engines public AIResponse TextRequest(AIRequest request) { var preditor = new BotPreditor(); - var text = preditor.Predict(agent, request); - return null; + var doc = preditor.Predict(agent, request).Result; + var parameters = new Dictionary(); + doc.Sentences[0].Entities.ForEach(x => parameters.Add(x.Entity, x.Value)); + + return new AIResponse + { + Lang = request.Language, + Timestamp = DateTime.UtcNow, + SessionId = request.SessionId, + Status = new AIResponseStatus(), + Result = new AIResponseResult + { + Score = doc.Sentences[0].Intent.Confidence, + ResolvedQuery = doc.Sentences[0].Text, + Fulfillment = new AIResponseFulfillment { }, + Parameters = parameters, + Metadata = new AIResponseMetadata + { + IntentName = doc.Sentences[0].Intent.Label + } + } + }; } public Agent LoadAgent(string id) diff --git a/BotSharp.Core/Engines/BotPreditor.cs b/BotSharp.Core/Engines/BotPreditor.cs index 6feb5855..d8345d61 100644 --- a/BotSharp.Core/Engines/BotPreditor.cs +++ b/BotSharp.Core/Engines/BotPreditor.cs @@ -5,6 +5,7 @@ using DotNetToolkit; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.IO; @@ -16,7 +17,7 @@ namespace BotSharp.Core.Engines { public class BotPreditor { - public async Task Predict(Agent agent, AIRequest request) + public async Task Predict(Agent agent, AIRequest request) { // load model var dir = Path.Join(AppDomain.CurrentDomain.GetData("DataPath").ToString(), "ModelFiles", agent.Id); @@ -32,10 +33,16 @@ namespace BotSharp.Core.Engines var provider = TypeHelper.GetInstance(providerPipe.Name, assemblies) as INlpPipeline; provider.Configuration = config.GetSection(meta.Platform); - var data = JObject.FromObject(new + var data = new NlpDoc { - Text = request.Query.FirstOrDefault() - }); + Sentences = new List + { + new NlpDocSentence + { + Text = request.Query.FirstOrDefault() + } + } + }; await provider.Train(agent, data, providerPipe); meta.Pipeline.RemoveAt(0); @@ -51,7 +58,7 @@ namespace BotSharp.Core.Engines { Directory.CreateDirectory(settings.PredictDir); } - + // pipe process meta.Pipeline.ForEach(async pipeMeta => { @@ -61,7 +68,14 @@ namespace BotSharp.Core.Engines await pipe.Predict(agent, data, pipeMeta); }); - return ""; + Console.WriteLine(JsonConvert.SerializeObject(data, new JsonSerializerSettings + { + Formatting = Formatting.Indented, + NullValueHandling = NullValueHandling.Ignore, + ContractResolver = new CamelCasePropertyNamesContractResolver() + })); + + return data; } } } diff --git a/BotSharp.Core/Engines/BotTrainer.cs b/BotSharp.Core/Engines/BotTrainer.cs index 1dd1986c..7f2b1364 100644 --- a/BotSharp.Core/Engines/BotTrainer.cs +++ b/BotSharp.Core/Engines/BotTrainer.cs @@ -40,9 +40,7 @@ namespace BotSharp.Core.Engines .Where(x => x.AgentId == agentId) .ToList(); - var data = JObject.FromObject(new - { - }); + var data = new NlpDoc(); // Get NLP Provider var config = (IConfiguration)AppDomain.CurrentDomain.GetData("Configuration"); diff --git a/BotSharp.Core/Engines/CRFsuite/CRFsuiteEntityRecognizer.cs b/BotSharp.Core/Engines/CRFsuite/CRFsuiteEntityRecognizer.cs index aee09b85..d5bbae28 100644 --- a/BotSharp.Core/Engines/CRFsuite/CRFsuiteEntityRecognizer.cs +++ b/BotSharp.Core/Engines/CRFsuite/CRFsuiteEntityRecognizer.cs @@ -10,6 +10,7 @@ using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; @@ -22,14 +23,13 @@ namespace BotSharp.Core.Engines.CRFsuite public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var dc = new DefaultDataContextLoader().GetDefaultDc(); var corpus = agent.Corpus; meta.Model = "ner-crf.model"; - List> tokens = data["Tokens"].ToObject>>(); List> userSays = corpus.UserSays; List> list = new List>(); @@ -41,9 +41,9 @@ namespace BotSharp.Core.Engines.CRFsuite { using (StreamWriter sw = new StreamWriter(fs)) { - for (int i = 0; i < tokens.Count; i++) + for (int i = 0; i < doc.Sentences.Count; i++) { - List curLine = Merge(tokens[i], userSays[i].Entities); + List curLine = Merge(doc.Sentences[i].Tokens, userSays[i].Entities); curLine.ForEach(trainingData => { string[] wordParams = { trainingData.Entity, trainingData.Token, trainingData.Pos, trainingData.Chunk }; @@ -134,14 +134,12 @@ namespace BotSharp.Core.Engines.CRFsuite return trainingTuple; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { - List> tokens = data["Tokens"].ToObject>>(); var uniFeatures = meta.Meta["uniFeatures"].ToString(); var biFeatures = meta.Meta["biFeatures"].ToString(); string field = meta.Meta["fields"].ToString(); string[] fields = field.Split(" "); - string rawPredictingDataFileName = Path.Join(Settings.PredictDir, "ner-crf.corpus.predict.txt"); string parsedPredictingDataFileName = Path.Join(Settings.PredictDir, "ner-crf.parsed.predict.txt"); @@ -152,9 +150,9 @@ namespace BotSharp.Core.Engines.CRFsuite using (StreamWriter sw = new StreamWriter(fs)) { List curLine = new List(); - foreach (List tokenList in tokens) + foreach (NlpDocSentence sentence in doc.Sentences) { - foreach (NlpToken token in tokenList) + foreach (NlpToken token in sentence.Tokens) { for (int i = 0 ; i < fields.Length; i++) { @@ -180,29 +178,30 @@ namespace BotSharp.Core.Engines.CRFsuite sw.Flush(); } } + new MachineLearning.CRFsuite.Ner() .NerStart(rawPredictingDataFileName, parsedPredictingDataFileName, field, uniFeatures.Split(" "), biFeatures.Split(" ")); var output = CmdHelper.Run(Path.Join(Settings.AlgorithmDir, "crfsuite"), $"tag -i -m {modelFileName} {parsedPredictingDataFileName}", false); var entities = new List(); - // - string[] entityProbabilityPairs = output.Split("\r"); - for (int i = 0 ; i < entityProbabilityPairs.Length ; i++) + + string[] entityProbabilityPairs = output.Split(Environment.NewLine).Where(x => !String.IsNullOrEmpty(x)).ToArray(); + for (int i = 0; i < entityProbabilityPairs.Length; i++) { string entityProbabilityPair = entityProbabilityPairs[i]; string entity = entityProbabilityPair.Split(":")[0]; decimal probability = decimal.Parse(entityProbabilityPair.Split(":")[1]); - NlpEntity nlpentity = new NlpEntity(); - nlpentity.Entity = entity; - nlpentity.Value = tokens[0][i].Text; - nlpentity.Confidence = probability; - entities.Add(nlpentity); + entities.Add(new NlpEntity + { + Entity = entity, + Value = doc.Sentences[0].Tokens[i].Text, + Confidence = probability + }); } + + doc.Sentences[0].Entities = entities.Where(x => x.Entity != "O").ToList(); - - - data["entities"] = JObject.FromObject(entities); if(File.Exists(rawPredictingDataFileName)) { File.Delete(rawPredictingDataFileName); @@ -211,6 +210,7 @@ namespace BotSharp.Core.Engines.CRFsuite { File.Delete(parsedPredictingDataFileName); } + return true; } } diff --git a/BotSharp.Core/Engines/Classifiers/FasttextClassifier.cs b/BotSharp.Core/Engines/Classifiers/FasttextClassifier.cs index 9383fcf5..7de0432e 100644 --- a/BotSharp.Core/Engines/Classifiers/FasttextClassifier.cs +++ b/BotSharp.Core/Engines/Classifiers/FasttextClassifier.cs @@ -17,18 +17,26 @@ namespace BotSharp.Core.Engines.Classifiers public PipeSettings Settings { get; set; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { string modelFileName = Path.Join(Settings.ModelDir, meta.Model); - string predictFileName = Path.Join(Settings.PredictDir, "test.txt"); - var output = CmdHelper.Run(Path.Join(Settings.AlgorithmDir, "fasttext"), $"predict-prob {modelFileName}.bin {predictFileName}", false); + string predictFileName = Path.Join(Settings.PredictDir, "fasttext.txt"); + File.WriteAllText(predictFileName, doc.Sentences[0].Text); - data["Intent"] = JObject.FromObject(new { Name = output.Split(' ')[0].Split("__label__")[1], Confidence = output.Split(' ')[1] }); + var output = CmdHelper.Run(Path.Join(Settings.AlgorithmDir, "fasttext"), $"predict-prob {modelFileName}.bin {predictFileName}"); + + File.Delete(predictFileName); + + doc.Sentences[0].Intent = new TextClassificationResult + { + Label = output.Split(' ')[0].Split("__label__")[1], + Confidence = decimal.Parse(output.Split(' ')[1]) + }; return true; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { meta.Model = "classification-fasttext.model"; diff --git a/BotSharp.Core/Engines/NlpDoc.cs b/BotSharp.Core/Engines/NlpDoc.cs new file mode 100644 index 00000000..2e69a536 --- /dev/null +++ b/BotSharp.Core/Engines/NlpDoc.cs @@ -0,0 +1,20 @@ +using BotSharp.MachineLearning.NLP; +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core.Engines +{ + public class NlpDoc + { + public List Sentences { get; set; } + } + + public class NlpDocSentence + { + public string Text { get; set; } + public List Tokens { get; set; } + public List Entities { get; set; } + public TextClassificationResult Intent { get; set; } + } +} diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyEntitizer.cs b/BotSharp.Core/Engines/SpaCy/SpaCyEntitizer.cs index dba99988..172fbe6b 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyEntitizer.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyEntitizer.cs @@ -17,12 +17,12 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("entitize", Method.GET); diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyEntityRecognizer.cs b/BotSharp.Core/Engines/SpaCy/SpaCyEntityRecognizer.cs index 328583d9..0432e00e 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyEntityRecognizer.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyEntityRecognizer.cs @@ -19,7 +19,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { String modelPath = "./entity_rec_output"; String newModelName = "test"; @@ -52,12 +52,10 @@ namespace BotSharp.Core.Engines.SpaCy var response = client.Execute(request); - data["EntityModelTrained"] = response.Data.EntityModelTrained; - return true; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyProvider.cs b/BotSharp.Core/Engines/SpaCy/SpaCyProvider.cs index 38b5dd27..2bdb44c8 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyProvider.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyProvider.cs @@ -17,7 +17,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("load", Method.GET); @@ -30,7 +30,7 @@ namespace BotSharp.Core.Engines.SpaCy return response.IsSuccessful; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyTagger.cs b/BotSharp.Core/Engines/SpaCy/SpaCyTagger.cs index bd372e71..0409e12a 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyTagger.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyTagger.cs @@ -17,7 +17,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("tagger", Method.GET); @@ -32,12 +32,11 @@ namespace BotSharp.Core.Engines.SpaCy tags.Add(response.Data.Tags); res = res && response.IsSuccessful; }); - data.Add("Tags", JToken.FromObject(tags)); - + return res; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyTextCategorizer.cs b/BotSharp.Core/Engines/SpaCy/SpaCyTextCategorizer.cs index 48bbf845..0154098c 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyTextCategorizer.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyTextCategorizer.cs @@ -18,7 +18,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { //var input = new List>(); @@ -54,17 +54,10 @@ namespace BotSharp.Core.Engines.SpaCy var response = client.Execute(request); - data["ModelName"] = response.Data.ModelName; - /* - //Predict - var request2 = new RestRequest("predict", Method.GET); - request2.AddParameter("text", "the roof is leaking"); - var response2 = client.Execute(request2); - */ return true; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } diff --git a/BotSharp.Core/Engines/SpaCy/SpaCyTokenizer.cs b/BotSharp.Core/Engines/SpaCy/SpaCyTokenizer.cs index ca45062a..25672ffd 100644 --- a/BotSharp.Core/Engines/SpaCy/SpaCyTokenizer.cs +++ b/BotSharp.Core/Engines/SpaCy/SpaCyTokenizer.cs @@ -19,7 +19,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("tokenizer", Method.GET); @@ -28,6 +28,8 @@ namespace BotSharp.Core.Engines.SpaCy var dc = new DefaultDataContextLoader().GetDefaultDc(); var corpus = agent.Corpus; + doc.Sentences = new List(); + corpus.UserSays.ForEach(usersay => { Console.WriteLine(usersay.Text); request.AddParameter("text", usersay.Text); @@ -35,16 +37,20 @@ namespace BotSharp.Core.Engines.SpaCy tokens.Add(response.Data.Tokens); + doc.Sentences.Add(new NlpDocSentence + { + Tokens = response.Data.Tokens, + Text = usersay.Text + }); + res = res && response.IsSuccessful; }); - data.Add("Tokens", JToken.FromObject(tokens)); - return res; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("tokenizer", Method.GET); @@ -52,15 +58,14 @@ namespace BotSharp.Core.Engines.SpaCy Boolean res = true; var corpus = agent.Corpus; - request.AddParameter("text", data["Text"]); + request.AddParameter("text", doc.Sentences[0].Text); var response = client.Execute(request); tokens.Add(response.Data.Tokens); res = res && response.IsSuccessful; - - data.Add("Tokens", JToken.FromObject(tokens)); + doc.Sentences[0].Tokens = tokens[0]; return true; } diff --git a/BotSharp.Core/Engines/SpaCy/SpacyFeaturizer.cs b/BotSharp.Core/Engines/SpaCy/SpacyFeaturizer.cs index 6aaa30d1..f6888b41 100644 --- a/BotSharp.Core/Engines/SpaCy/SpacyFeaturizer.cs +++ b/BotSharp.Core/Engines/SpaCy/SpacyFeaturizer.cs @@ -16,7 +16,7 @@ namespace BotSharp.Core.Engines.SpaCy public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } - public async Task Train(Agent agent, JObject data, PipeModel meta) + public async Task Train(Agent agent, NlpDoc doc, PipeModel meta) { var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value); var request = new RestRequest("featurize", Method.GET); @@ -32,12 +32,12 @@ namespace BotSharp.Core.Engines.SpaCy res = res && response.IsSuccessful; });*/ - data.Add("Features", JToken.FromObject(vectors)); + // data.Add("Features", JToken.FromObject(vectors)); return res; } - public async Task Predict(Agent agent, JObject data, PipeModel meta) + public async Task Predict(Agent agent, NlpDoc doc, PipeModel meta) { return true; } diff --git a/BotSharp.Core/Engines/TextClassificationResult.cs b/BotSharp.Core/Engines/TextClassificationResult.cs new file mode 100644 index 00000000..91273f89 --- /dev/null +++ b/BotSharp.Core/Engines/TextClassificationResult.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BotSharp.Core.Engines +{ + public class TextClassificationResult + { + public String Label { get; set; } + + public Decimal Confidence { get; set; } + } +} diff --git a/BotSharp.MachineLearning/CRFsuite/Crfutils.cs b/BotSharp.MachineLearning/CRFsuite/Crfutils.cs index f725ef1d..eb1adcfd 100644 --- a/BotSharp.MachineLearning/CRFsuite/Crfutils.cs +++ b/BotSharp.MachineLearning/CRFsuite/Crfutils.cs @@ -67,30 +67,32 @@ namespace BotSharp.MachineLearning.CRFsuite { List>> Xs = new List>>(); List> X = new List>(); - StreamReader sr = new StreamReader(fiPath, Encoding.Default); - string line; - while ((line = sr.ReadLine()) != null) + using (StreamReader sr = new StreamReader(fiPath, Encoding.Default)) { - line = line.Replace("\n",""); - if (line == null || line.Length == 0) + string line; + while ((line = sr.ReadLine()) != null) { - Xs.Add(new List>(X)); - X.Clear(); - } - else - { - String[] fields = line.Split(sep); - if (fields.Count() < names.Count) + line = line.Replace("\n", ""); + if (line == null || line.Length == 0) { - // Error Exception + Xs.Add(new List>(X)); + X.Clear(); } - Dictionary item = new Dictionary(); - item.Add("F", new List()); - for (int i = 0 ; i < names.Count ; i++) + else { - item.Add(names[i], fields[i]); + String[] fields = line.Split(sep); + if (fields.Count() < names.Count) + { + // Error Exception + } + Dictionary item = new Dictionary(); + item.Add("F", new List()); + for (int i = 0; i < names.Count; i++) + { + item.Add(names[i], fields[i]); + } + X.Add(item); } - X.Add(item); } } return Xs; @@ -135,25 +137,27 @@ namespace BotSharp.MachineLearning.CRFsuite /// an extractor which to do the feature extracting work /// attributes name seperated by space /// string whihch seperated by - public void CRFFileGenerator (System.Action>> FeatureExtractor, string fields, string rawFile, string parsedName, string sep= " ") + public void CRFFileGenerator(System.Action>> FeatureExtractor, string fields, string rawFile, string parsedName, string sep = " ") { - FileStream fs = new FileStream(parsedName, FileMode.Create); - StreamWriter sw = new StreamWriter(fs); - List F = fields.Split(" ").ToList(); - List>> Xs = Readiter(rawFile, F, " "); - - foreach (List> X in Xs) + using (FileStream fs = new FileStream(parsedName, FileMode.Create)) { - if (X.Any(x => x["w"].ToString() == "")) + using (StreamWriter sw = new StreamWriter(fs)) { + List F = fields.Split(" ").ToList(); + List>> Xs = Readiter(rawFile, F, " "); + foreach (List> X in Xs) + { + if (X.Any(x => x["w"].ToString() == "")) + { + + } + FeatureExtractor(X); + OutputFeatures(sw, X, "y"); + } + sw.Flush(); } - FeatureExtractor(X); - OutputFeatures(sw, X, "y"); } - sw.Flush(); - sw.Close(); - fs.Close(); } } } \ No newline at end of file diff --git a/BotSharp.WebHost/Program.cs b/BotSharp.WebHost/Program.cs index 5fd67be8..19cc1605 100644 --- a/BotSharp.WebHost/Program.cs +++ b/BotSharp.WebHost/Program.cs @@ -27,7 +27,7 @@ namespace BotSharp.WebHost config.AddJsonFile(setting, optional: false, reloadOnChange: true); }); }) - .UseUrls("http://0.0.0.0:3116") + .UseUrls("http://0.0.0.0:3112") .UseStartup() .Build(); } diff --git a/BotSharp.WebHost/crfsuite.exe b/BotSharp.WebHost/crfsuite.exe deleted file mode 100644 index 74c7ad448bf10a0ca86a91d4fcae802407145429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215040 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⪙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 diff --git a/BotSharp.WebHost/ner-crf.corpus.predict.txt b/BotSharp.WebHost/ner-crf.corpus.predict.txt deleted file mode 100644 index 33dadcc5..00000000 --- a/BotSharp.WebHost/ner-crf.corpus.predict.txt +++ /dev/null @@ -1,10 +0,0 @@ - when WRB - when WRB is VBZ - when WRB is VBZ the DT - when WRB is VBZ the DT next JJ - when WRB is VBZ the DT next JJ train NN - when WRB is VBZ the DT next JJ train NN in IN - when WRB is VBZ the DT next JJ train NN in IN muncher NN - when WRB is VBZ the DT next JJ train NN in IN muncher NN freiheit NN - when WRB is VBZ the DT next JJ train NN in IN muncher NN freiheit NN ? . - diff --git a/BotSharp.WebHost/ner-crf.parsed.predict.txt b/BotSharp.WebHost/ner-crf.parsed.predict.txt deleted file mode 100644 index aea6d1e2..00000000 --- a/BotSharp.WebHost/ner-crf.parsed.predict.txt +++ /dev/null @@ -1,10 +0,0 @@ - w[0]=when w[1]=when w[2]=when wl[0]=when wl[1]=when wl[2]=when pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[0]= chk[1]= chk[2]= shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[0]=L shaped[1]=L shaped[2]=L type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[0]=w p1[1]=w p1[2]=w p2[0]=wh p2[1]=wh p2[2]=wh p3[0]=whe p3[1]=whe p3[2]=whe p4[0]=when p4[1]=when p4[2]=when s1[0]=n s1[1]=n s1[2]=n s2[0]=en s2[1]=en s2[2]=en s3[0]=hen s3[1]=hen s3[2]=hen s4[0]=when s4[1]=when s4[2]=when 2d[0]=no 2d[1]=no 2d[2]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[0]=no d&.[1]=no d&.[2]=no up[0]=no up[1]=no up[2]=no iu[0]=no iu[1]=no iu[2]=no au[0]=no au[1]=no au[2]=no al[0]=yes al[1]=yes al[2]=yes ad[0]=no ad[1]=no ad[2]=no ao[0]=no ao[1]=no ao[2]=no cu[0]=no cu[1]=no cu[2]=no cl[0]=yes cl[1]=yes cl[2]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[0]=no cd[1]=no cd[2]=no cs[0]=no cs[1]=no cs[2]=no w[0]|w[1]=when|when w[1]|w[2]=when|when pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[1..4]=when w[1..4]=when w[1..4]=when w[1..4]=when __BOS__ - w[-1]=when w[0]=when w[1]=when w[2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-1]= chk[0]= chk[1]= chk[2]= shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[1..4]=when w[1..4]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when w[2]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= chk[2]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[1..4]=when w[1..4]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when w[2]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= chk[2]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[1..4]=when w[1..4]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when w[2]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= chk[2]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[1..4]=when w[1..4]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when w[2]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= chk[2]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[1..4]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when w[2]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when wl[2]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB pos[2]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= chk[2]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shape[2]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L shaped[2]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter type[2]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p1[2]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p2[2]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p3[2]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when p4[2]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s1[2]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s2[2]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s3[2]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when s4[2]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 2d[2]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no 4d[2]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&a[2]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&-[2]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&/[2]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&,[2]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no d&.[2]=no up[-2]=no up[-1]=no up[0]=no up[1]=no up[2]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no iu[2]=no au[-2]=no au[-1]=no au[0]=no au[1]=no au[2]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes al[2]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ad[2]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no ao[2]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cu[2]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes cl[2]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes ca[2]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cd[2]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no cs[2]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when w[1]|w[2]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB pos[1]|pos[2]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| chk[1]|chk[2]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L shaped[1]|shaped[2]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter type[1]|type[2]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[1..4]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when w[1]=when wl[-2]=when wl[-1]=when wl[0]=when wl[1]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB pos[1]=WRB chk[-2]= chk[-1]= chk[0]= chk[1]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shape[1]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L shaped[1]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter type[1]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p1[1]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p2[1]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p3[1]=whe p4[-2]=when p4[-1]=when p4[0]=when p4[1]=when s1[-2]=n s1[-1]=n s1[0]=n s1[1]=n s2[-2]=en s2[-1]=en s2[0]=en s2[1]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s3[1]=hen s4[-2]=when s4[-1]=when s4[0]=when s4[1]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 2d[1]=no 4d[-2]=no 4d[-1]=no 4d[0]=no 4d[1]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&a[1]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&-[1]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&/[1]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&,[1]=no d&.[-2]=no d&.[-1]=no d&.[0]=no d&.[1]=no up[-2]=no up[-1]=no up[0]=no up[1]=no iu[-2]=no iu[-1]=no iu[0]=no iu[1]=no au[-2]=no au[-1]=no au[0]=no au[1]=no al[-2]=yes al[-1]=yes al[0]=yes al[1]=yes ad[-2]=no ad[-1]=no ad[0]=no ad[1]=no ao[-2]=no ao[-1]=no ao[0]=no ao[1]=no cu[-2]=no cu[-1]=no cu[0]=no cu[1]=no cl[-2]=yes cl[-1]=yes cl[0]=yes cl[1]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes ca[1]=yes cd[-2]=no cd[-1]=no cd[0]=no cd[1]=no cs[-2]=no cs[-1]=no cs[0]=no cs[1]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when w[0]|w[1]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB pos[0]|pos[1]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| chk[0]|chk[1]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L shaped[0]|shaped[1]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter type[0]|type[1]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[1..4]=when - w[-2]=when w[-1]=when w[0]=when wl[-2]=when wl[-1]=when wl[0]=when pos[-2]=WRB pos[-1]=WRB pos[0]=WRB chk[-2]= chk[-1]= chk[0]= shape[-2]=LLLL shape[-1]=LLLL shape[0]=LLLL shaped[-2]=L shaped[-1]=L shaped[0]=L type[-2]=AllLetter type[-1]=AllLetter type[0]=AllLetter p1[-2]=w p1[-1]=w p1[0]=w p2[-2]=wh p2[-1]=wh p2[0]=wh p3[-2]=whe p3[-1]=whe p3[0]=whe p4[-2]=when p4[-1]=when p4[0]=when s1[-2]=n s1[-1]=n s1[0]=n s2[-2]=en s2[-1]=en s2[0]=en s3[-2]=hen s3[-1]=hen s3[0]=hen s4[-2]=when s4[-1]=when s4[0]=when 2d[-2]=no 2d[-1]=no 2d[0]=no 4d[-2]=no 4d[-1]=no 4d[0]=no d&a[-2]=no d&a[-1]=no d&a[0]=no d&-[-2]=no d&-[-1]=no d&-[0]=no d&/[-2]=no d&/[-1]=no d&/[0]=no d&,[-2]=no d&,[-1]=no d&,[0]=no d&.[-2]=no d&.[-1]=no d&.[0]=no up[-2]=no up[-1]=no up[0]=no iu[-2]=no iu[-1]=no iu[0]=no au[-2]=no au[-1]=no au[0]=no al[-2]=yes al[-1]=yes al[0]=yes ad[-2]=no ad[-1]=no ad[0]=no ao[-2]=no ao[-1]=no ao[0]=no cu[-2]=no cu[-1]=no cu[0]=no cl[-2]=yes cl[-1]=yes cl[0]=yes ca[-2]=yes ca[-1]=yes ca[0]=yes cd[-2]=no cd[-1]=no cd[0]=no cs[-2]=no cs[-1]=no cs[0]=no w[-2]|w[-1]=when|when w[-1]|w[0]=when|when pos[-2]|pos[-1]=WRB|WRB pos[-1]|pos[0]=WRB|WRB chk[-2]|chk[-1]=| chk[-1]|chk[0]=| shaped[-2]|shaped[-1]=L|L shaped[-1]|shaped[0]=L|L type[-2]|type[-1]=AllLetter|AllLetter type[-1]|type[0]=AllLetter|AllLetter w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when w[-4..-1]=when __EOS__ - diff --git a/BotSharp.sln b/BotSharp.sln index 6c089b5e..c3bb81a6 100644 --- a/BotSharp.sln +++ b/BotSharp.sln @@ -13,8 +13,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.WebHost", "BotShar EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BotSharp.MachineLearning", "BotSharp.MachineLearning\BotSharp.MachineLearning.csproj", "{E664115A-AE86-49E9-8AE4-D4589A568CD7}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetToolkit", "..\DotNetToolkit\DotNetToolkit\DotNetToolkit.csproj", "{49F8D187-599E-458F-8567-40FCD146CFFA}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -41,10 +39,6 @@ Global {E664115A-AE86-49E9-8AE4-D4589A568CD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {E664115A-AE86-49E9-8AE4-D4589A568CD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {E664115A-AE86-49E9-8AE4-D4589A568CD7}.Release|Any CPU.Build.0 = Release|Any CPU - {49F8D187-599E-458F-8567-40FCD146CFFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49F8D187-599E-458F-8567-40FCD146CFFA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49F8D187-599E-458F-8567-40FCD146CFFA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49F8D187-599E-458F-8567-40FCD146CFFA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE