Entity Recognizers
Oscova支持多种方式创建实体识别器,可以使用已知词汇,正则模式或者直接创建方法从请求中提取。
使用CreateRecognizer()方法就可以创建了,这个方式创建的识别器是大小写不敏感的。当然开发人员可以显式指定大小写敏感。
Entries Recognizer
对于一组已知词汇,开发人员可以通过如下方式创建识别器。
var bot = new OscovaBot();
bot.CreateRecognizer("employee", new[] { "Sean", "Ali", "Patel" });
另一种写法,但意思完全一样
var recognizer = bot.CreateRecognizer("employee");
recognizer.Entries.Add("Sean");
recognizer.Entries.Add("Ali");
recognizer.Entries.Add("Patel");
大小写敏感的识别器。
var bot = new OscovaBot();
bot.CreateRecognizer("employee", new[] { "Sean", "Ahmet", "Patel" }, StringComparer.Ordinal);
Enumeration Recognizer
用于枚举类型的识别器:
enum PriorityTypes
{
Low,
High,
Mininum,
Maxinum
}
然后,
var bot = new OscovaBot();
bot.CreateRecognizer<PriorityTypes>("priority");
明白了吧!当然大小写不敏感的:
var bot = new OscovaBot();
bot.CreateRecognizer<PriorityTypes>("priority", StringComparer.Ordinal);
还可以指定同义词:
enum PriorityTypes
{
Low,
High,
[Synonyms("Min")]
Minimum,
[Synonyms("Max")] Maximum }
在读取的时候将实体类型转换到对应的枚举上。
var entity = result.Entities.OfType("priority");
var priority = entity.ValueAs<PriorityTypes>();
Pattern Recognizer
模式识别器就是用正则表达式来做识别。
var regex = new Regex("[0-9a-fA-F]+[\r\n]*");
bot.CreateRecognizer("hex", regex);
Functional Recognizer
函数类型的识别器,就是指定一个函数来处理用户输入,解析出实体对象。
如果要用于处理数据库对象,而不是将所有实体加载到内存,这种方法创建识别器非常方便。
bot.CreateRecognizer("name", request =>
{
var entities = new EntityCollection();
var message = request.NormalizedText;
foreach (var item in SomeValues) { var index = message.IndexOf(item, StringComparison.OrdinalIgnoreCase); if (index == -1) continue; var entity = new Entity("name") { Value = item, Index = index }; entities.Add(entity); } return entities; });
Custom Recognizer
自定义的识别器,实现Syn.Bot.Oscova.Interfaces.IEntityRecognizer
即可。
比如自定义了一个html实体对象,
public class HtmlEntity : IEntity
{
public HtmlEntity() { Type = "html"; } public string Type { get; set; } public string Value { get; set; } public int Index { get; set; } }
然后实现接口
public class HtmlRecognizer : IEntityRecognizer
{
public string Type => "html"; public EntityCollection Parse(Request request) { var regex = new Regex(@"<(?<tag>\w*)>(?<text>.*)</\k<tag>>"); var entities = new EntityCollection(); foreach (Match match in regex.Matches(request.NormalizedText)) { var entity = new HtmlEntity { Value = match.Value, Index = match.Index }; entities.Add(entity); } return entities; } }
需要注意的是,所有实体必须指定索引参数Index,它标记了用户输入中内容匹配的顺序。
自定义完成记得添加到bot.Recognizers
集合中,这个操作应该在训练之前。