Abstract nlp pipeline result to Doc object. The Doc object owns the sequence of tokens.

This commit is contained in:
haiping008@gmail.com 2018-08-10 15:10:53 -05:00
parent f656f3a42a
commit dd997752a0
22 changed files with 176 additions and 129 deletions

View file

@ -25,10 +25,10 @@ namespace BotSharp.Core.Abstractions
/// Process
/// </summary>
/// <param name="agent"></param>
/// <param name="data">Intermediate result</param>
/// <param name="doc">Intermediate result</param>
/// <param name="meta">Meta data which is packed to model</param>
/// <returns></returns>
Task<bool> Train(Agent agent, JObject data, PipeModel meta);
Task<bool> Predict(Agent agent, JObject data, PipeModel meta);
Task<bool> Train(Agent agent, NlpDoc doc, PipeModel meta);
Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta);
}
}

View file

@ -35,6 +35,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="DotNetToolkit" Version="1.5.2" />
<PackageReference Include="EntityFrameworkCore.BootKit" Version="1.8.0" />
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="2.1.1" />
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
@ -42,7 +43,6 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\DotNetToolkit\DotNetToolkit\DotNetToolkit.csproj" />
<ProjectReference Include="..\BotSharp.MachineLearning\BotSharp.MachineLearning.csproj" />
</ItemGroup>

View file

@ -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<String, Object>();
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)

View file

@ -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<string> Predict(Agent agent, AIRequest request)
public async Task<NlpDoc> 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<NlpDocSentence>
{
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;
}
}
}

View file

@ -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");

View file

@ -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<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Train(Agent agent, NlpDoc doc, PipeModel meta)
{
var dc = new DefaultDataContextLoader().GetDefaultDc();
var corpus = agent.Corpus;
meta.Model = "ner-crf.model";
List<List<NlpToken>> tokens = data["Tokens"].ToObject<List<List<NlpToken>>>();
List<TrainingIntentExpression<TrainingIntentExpressionPart>> userSays = corpus.UserSays;
List<List<TrainingData>> list = new List<List<TrainingData>>();
@ -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<TrainingData> curLine = Merge(tokens[i], userSays[i].Entities);
List<TrainingData> 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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
List<List<NlpToken>> tokens = data["Tokens"].ToObject<List<List<NlpToken>>>();
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<string> curLine = new List<string>();
foreach (List<NlpToken> 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<NlpEntity>();
//
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;
}
}

View file

@ -17,18 +17,26 @@ namespace BotSharp.Core.Engines.Classifiers
public PipeSettings Settings { get; set; }
public async Task<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Train(Agent agent, NlpDoc doc, PipeModel meta)
{
meta.Model = "classification-fasttext.model";

View file

@ -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<NlpDocSentence> Sentences { get; set; }
}
public class NlpDocSentence
{
public string Text { get; set; }
public List<NlpToken> Tokens { get; set; }
public List<NlpEntity> Entities { get; set; }
public TextClassificationResult Intent { get; set; }
}
}

View file

@ -17,12 +17,12 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Train(Agent agent, NlpDoc doc, PipeModel meta)
{
var client = new RestClient(Configuration.GetSection("SpaCyProvider:Url").Value);
var request = new RestRequest("entitize", Method.GET);

View file

@ -19,7 +19,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<Result>(request);
data["EntityModelTrained"] = response.Data.EntityModelTrained;
return true;
}
public async Task<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}

View file

@ -17,7 +17,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}

View file

@ -17,7 +17,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}

View file

@ -18,7 +18,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Train(Agent agent, NlpDoc doc, PipeModel meta)
{
//var input = new List<Tuple<String, JObject>>();
@ -54,17 +54,10 @@ namespace BotSharp.Core.Engines.SpaCy
var response = client.Execute<Result>(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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}

View file

@ -19,7 +19,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<NlpDocSentence>();
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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<Result>(request);
tokens.Add(response.Data.Tokens);
res = res && response.IsSuccessful;
data.Add("Tokens", JToken.FromObject(tokens));
doc.Sentences[0].Tokens = tokens[0];
return true;
}

View file

@ -16,7 +16,7 @@ namespace BotSharp.Core.Engines.SpaCy
public IConfiguration Configuration { get; set; }
public PipeSettings Settings { get; set; }
public async Task<bool> Train(Agent agent, JObject data, PipeModel meta)
public async Task<bool> 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<bool> Predict(Agent agent, JObject data, PipeModel meta)
public async Task<bool> Predict(Agent agent, NlpDoc doc, PipeModel meta)
{
return true;
}

View file

@ -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; }
}
}

View file

@ -67,30 +67,32 @@ namespace BotSharp.MachineLearning.CRFsuite
{
List<List<Dictionary<string, Object>>> Xs = new List<List<Dictionary<string, Object>>>();
List<Dictionary<string, Object>> X = new List<Dictionary<string, Object>>();
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<Dictionary<string, Object>>(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<Dictionary<string, Object>>(X));
X.Clear();
}
Dictionary<string, Object> item = new Dictionary<string, Object>();
item.Add("F", new List<string>());
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<string, Object> item = new Dictionary<string, Object>();
item.Add("F", new List<string>());
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
/// <param name="FeatureExtractor">an extractor which to do the feature extracting work</param>
/// <param name="fields">attributes name seperated by space</param>
/// <param name="sep">string whihch seperated by</param>
public void CRFFileGenerator (System.Action<List<Dictionary<string, Object>>> FeatureExtractor, string fields, string rawFile, string parsedName, string sep= " ")
public void CRFFileGenerator(System.Action<List<Dictionary<string, Object>>> FeatureExtractor, string fields, string rawFile, string parsedName, string sep = " ")
{
FileStream fs = new FileStream(parsedName, FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
List<string> F = fields.Split(" ").ToList();
List<List<Dictionary<string, Object>>> Xs = Readiter(rawFile, F, " ");
foreach (List<Dictionary<string, Object>> 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<string> F = fields.Split(" ").ToList();
List<List<Dictionary<string, Object>>> Xs = Readiter(rawFile, F, " ");
foreach (List<Dictionary<string, Object>> 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();
}
}
}

View file

@ -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<Startup>()
.Build();
}

Binary file not shown.

View file

@ -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 ? .

View file

@ -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__

View file

@ -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