Skip to content

add sebis agent #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Aug 3, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
162 changes: 162 additions & 0 deletions BotSharp.Core/Engines/Sebis/AgentImporterInSebis.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using BotSharp.Core.Adapters.Dialogflow;
using BotSharp.Core.Adapters.Sebis;
using BotSharp.Core.Agents;
using BotSharp.Core.Entities;
using BotSharp.Core.Intents;
using BotSharp.Core.Models;
using DotNetToolkit;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace BotSharp.Core.Engines
{
/// <summary>
/// Import agent from Dialogflow
/// </summary>
public class AgentImporterInSebis : IAgentImporter
{
/// <summary>
/// Load agent meta
/// </summary>
/// <param name="agentName"></param>
/// <param name="agentDir"></param>
/// <returns></returns>
public Agent LoadAgent(AgentImportHeader agentHeader, string agentDir)
{
// load agent profile
string data = File.ReadAllText(Path.Join(agentDir, "Sebis", $"{agentHeader.Name}{Path.DirectorySeparatorChar}agent.json"));
var agent = JsonConvert.DeserializeObject<SebisAgent>(data);
agent.Name = agentHeader.Name;
agent.Id = agentHeader.Id;

var result = agent.ToObject<Agent>();
result.ClientAccessToken = agentHeader.ClientAccessToken;
result.DeveloperAccessToken = agentHeader.DeveloperAccessToken;
if(agentHeader.UserId != null)
{
result.UserId = agentHeader.UserId;
}

return result;
}

public void LoadCustomEntities(Agent agent, string agentDir)
{
agent.Entities = new List<EntityType>();
}

public void LoadIntents(Agent agent, string agentDir)
{
string data = File.ReadAllText(Path.Join(agentDir, "Sebis", $"{agent.Name}{Path.DirectorySeparatorChar}corpus.json"));
var sentences = JsonConvert.DeserializeObject<SebisAgent>(data).Sentences;

agent.Intents = sentences.Select(x => x.Name).Distinct().Select(x => new Intent{Name = x}).ToList();

agent.Intents.ForEach(intent => {
intent.UserSays = new List<IntentExpression>();

var userSays = sentences.Where(x => x.Name == intent.Name).ToList();

userSays.ForEach(say =>
{
var expression = new IntentExpression();

expression.Data = new List<IntentExpressionPart>();

for(int index = 0; index < say.Entities.Count; index++)
{

}

intent.UserSays.Add(expression);
});
});
}

private Intent ImportIntentUserSays(Agent agent, Intent intent, string fileName)
{
// void id confict
intent.Id = Guid.NewGuid().ToString();
intent.Name = intent.Name.Replace("/", "_");
// load user expressions

string expressionFileName = fileName.Replace(intent.Name, $"{intent.Name}_usersays_{agent.Language}");
if (File.Exists(expressionFileName))
{
string expressionJson = File.ReadAllText($"{expressionFileName}");
intent.UserSays = JsonConvert.DeserializeObject<List<IntentExpression>>(expressionJson);
}

return null;
}

public void LoadBuildinEntities(Agent agent, string agentDir)
{
agent.Intents.ForEach(intent =>
{

if (intent.UserSays != null)
{
intent.UserSays.ForEach(us =>
{
us.Data.Where(data => data.Meta != null)
.ToList()
.ForEach(data =>
{
LoadBuildinEntityTypePerUserSay(agent, data);
});
});
}

});
}

private void LoadBuildinEntityTypePerUserSay(Agent agent, IntentExpressionPart data)
{
var existedEntityType = agent.Entities.FirstOrDefault(x => x.Name == data.Meta);

if (existedEntityType == null)
{
existedEntityType = new EntityType
{
Name = data.Meta,
Entries = new List<EntityEntry>(),
IsOverridable = true
};

agent.Entities.Add(existedEntityType);
}

var entries = existedEntityType.Entries.Select(x => x.Value.ToLower()).ToList();
if (!entries.Contains(data.Text.ToLower()))
{
existedEntityType.Entries.Add(new EntityEntry
{
Value = data.Text,
Synonyms = new List<EntrySynonym>
{
new EntrySynonym
{
Synonym = data.Text
}
}
});
}
}
}

public class Sebis
{
public string Name { get; set; }
public string Desc { get; set; }
public string Lang { get; set; }
public List<TrainingIntentExpression<TrainingIntentExpressionPart>> Sentences { get; set; }
}


}
20 changes: 20 additions & 0 deletions BotSharp.Core/Engines/Sebis/SebisAgent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace BotSharp.Core.Adapters.Sebis
{
public class SebisAgent
{
public String Id { get; set; }
public String Name { get; set; }
[JsonProperty("desc")]
public String Description { get; set; }
[JsonProperty("lang")]
public String Language { get; set; }

public List<SebisIntent> Sentences { get; set; }
}
}
16 changes: 16 additions & 0 deletions BotSharp.Core/Engines/Sebis/SebisIntent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using BotSharp.Core.Intents;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;

namespace BotSharp.Core.Adapters.Sebis
{
public class SebisIntent
{
public string Text { get; set; }
[JsonProperty("intent")]
public string Name { get; set; }
public List<SebisIntentExpressionPart> Entities { get; set; }
}
}
12 changes: 12 additions & 0 deletions BotSharp.Core/Engines/Sebis/SebisIntentExpression.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
using BotSharp.Core.Engines;

namespace BotSharp.Core.Adapters.Sebis
{
public class SebisIntentExpression : TrainingIntentExpression<SebisIntentExpressionPart>
{

}
}
16 changes: 16 additions & 0 deletions BotSharp.Core/Engines/Sebis/SebisIntentExpressionPart.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Text;
using BotSharp.Core.Engines;
using Newtonsoft.Json;

namespace BotSharp.Core.Adapters.Sebis
{
public class SebisIntentExpressionPart : TrainingIntentExpressionPart
{
[JsonProperty("stop")]
public new int End { get; set; }
[JsonProperty("text")]
public new String Value { get; set; }
}
}
5 changes: 3 additions & 2 deletions BotSharp.RestApi/AgentController.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using BotSharp.Core.Agents;
using BotSharp.Core.Engines;
using BotSharp.Core.Engines.BotSharp;
using BotSharp.Core.Models;
using EntityFrameworkCore.BootKit;
using Microsoft.AspNetCore.Mvc;
Expand Down Expand Up @@ -29,9 +30,9 @@ public ActionResult Restore([FromRoute] String agentId)
var botsHeaderFilePath = Path.Join(AppDomain.CurrentDomain.GetData("DataPath").ToString(), $"DbInitializer{Path.DirectorySeparatorChar}Agents{Path.DirectorySeparatorChar}agents.json");
var agents = JsonConvert.DeserializeObject<List<AgentImportHeader>>(System.IO.File.ReadAllText(botsHeaderFilePath));

var rasa = new RasaAi();
var rasa = new BotSharpAi();
var agentHeader = agents.First(x => x.Id == agentId);
rasa.RestoreAgent<AgentImporterInDialogflow>(agentHeader);
rasa.RestoreAgent<AgentImporterInSebis>(agentHeader);

return Ok();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"description": "NLU Evaluation Corpora",
"language": "en"
}
Loading