using BotSharp.Core.Abstractions; using BotSharp.Core.Agents; using BotSharp.Core.Models; using BotSharp.NLP.Tokenize; using EntityFrameworkCore.BootKit; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using RestSharp; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BotSharp.Core.Engines.SpaCy { public class SpaCyTokenizer : INlpTrain, INlpPredict { public IConfiguration Configuration { get; set; } public PipeSettings Settings { get; set; } 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.POST); List> tokens = new List>(); Boolean res = true; var corpus = agent.Corpus; doc.Sentences = new List(); List sentencesList = new List(); corpus.UserSays.ForEach(usersay => sentencesList.Add(usersay.Text)); request.RequestFormat = DataFormat.Json; request.Method = Method.POST; request.AddHeader("Content-Type", "application/json; charset=utf-8"); request.AddParameter("application/json", JsonConvert.SerializeObject(new Documents(sentencesList)), ParameterType.RequestBody); var response = client.Execute(request); tokens = response.Data.TokensList; for (int i = 0; i < sentencesList.Count; i++) { doc.Sentences.Add(new NlpDocSentence { Tokens = tokens[i], Text = sentencesList[i] }); } res = res && response.IsSuccessful; return res; } 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); List> tokens = new List>(); Boolean res = true; var corpus = agent.Corpus; request.AddParameter("text", doc.Sentences[0].Text); var response = client.Execute(request); tokens = response.Data.TokensList; res = res && response.IsSuccessful; doc.Sentences[0].Tokens = tokens[0]; return true; } private class Result { public List> TokensList { get; set; } } private class Documents { public List Sentences { get; set; } public Documents(List sentences) { this.Sentences = sentences; } } } }