|
@@ -24,6 +24,10 @@ namespace Yuuna
|
|
{
|
|
{
|
|
public static void Main(string[] args)
|
|
public static void Main(string[] args)
|
|
{
|
|
{
|
|
|
|
+
|
|
|
|
+ Send("打開門");
|
|
|
|
+
|
|
|
|
+ return;
|
|
// Send("打開門"); Send("開燈");
|
|
// Send("打開門"); Send("開燈");
|
|
try
|
|
try
|
|
{
|
|
{
|
|
@@ -63,64 +67,86 @@ namespace Yuuna
|
|
{
|
|
{
|
|
var segmenter = new JiebaTextSegmenter() as ITextSegmenter;
|
|
var segmenter = new JiebaTextSegmenter() as ITextSegmenter;
|
|
var allPlugins = new PluginBase[] { new Fake() };
|
|
var allPlugins = new PluginBase[] { new Fake() };
|
|
- var strategy = new DefaultStrategy();
|
|
|
|
foreach (var item in allPlugins)
|
|
foreach (var item in allPlugins)
|
|
{
|
|
{
|
|
- item.Initialize(strategy, segmenter, new GroupManager());
|
|
|
|
|
|
+ item.Initialize(segmenter, new GroupManager());
|
|
Console.WriteLine("已載入模組: " + item.GetType().AssemblyQualifiedName);
|
|
Console.WriteLine("已載入模組: " + item.GetType().AssemblyQualifiedName);
|
|
}
|
|
}
|
|
|
|
|
|
Console.WriteLine("我: " + text);
|
|
Console.WriteLine("我: " + text);
|
|
var cutted = segmenter.Cut(text);
|
|
var cutted = segmenter.Cut(text);
|
|
Console.WriteLine($"來自分詞器 {segmenter.Name} 的分詞結果: [ {string.Join(", ", cutted)} ]");
|
|
Console.WriteLine($"來自分詞器 {segmenter.Name} 的分詞結果: [ {string.Join(", ", cutted)} ]");
|
|
-
|
|
|
|
-
|
|
|
|
- var list = new List<IScore>();
|
|
|
|
- foreach (var p in allPlugins)
|
|
|
|
- list.AddRange(p.Evaluate(cutted));
|
|
|
|
- list.Sort(ScoreComparer.Default);
|
|
|
|
-
|
|
|
|
- var sb = new StringBuilder("Bot: ");
|
|
|
|
- var best = list.LastOrDefault();
|
|
|
|
- if (best is null)
|
|
|
|
- sb.Append("我不懂你的意思");
|
|
|
|
- else if (best.IsCompacted)
|
|
|
|
- {
|
|
|
|
- var resp = best.Owner.SelectBest(best).Invoke(best);
|
|
|
|
- Console.WriteLine(resp.Mood.ToString());
|
|
|
|
- sb.Append(resp.Message);
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+
|
|
|
|
+ IStrategy plan = new DefaultStrategy();
|
|
|
|
+ var m = plan.FindBest(allPlugins, cutted);
|
|
|
|
+ if (m.HasValue)
|
|
{
|
|
{
|
|
- var choices = list.Where(s => s.Missing.Count <= 1).ToImmutableArray();
|
|
|
|
- switch (choices.Length)
|
|
|
|
|
|
+ var match = m.Value;
|
|
|
|
+ var pattern = match.Pattern;
|
|
|
|
+ if (pattern.Owner.Patterns.TryGet(pattern, out var bag))
|
|
{
|
|
{
|
|
- case 1:
|
|
|
|
- {
|
|
|
|
- Console.WriteLine("#1");
|
|
|
|
- sb.Append("你" + new[] { "是想", "想要" }.RandomTakeOne() + " ");
|
|
|
|
- sb.Append(choices.Select(x => x.Pattern.ToImmutable().Aggregate(string.Empty, (s, g) => s += g.ToImmutable().RandomTakeOne().ToImmutable().RandomTakeOne())));
|
|
|
|
- sb.Append(" 嗎?");
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- case 2:
|
|
|
|
- {
|
|
|
|
- Console.WriteLine("#2");
|
|
|
|
- sb.Append("你" + new[] { "是想", "想要" }.RandomTakeOne() + " ");
|
|
|
|
- sb.AppendJoin(" 還是 ", choices.Select(x => x.Pattern.ToImmutable().Aggregate(string.Empty, (s, g) => s += g.ToImmutable().RandomTakeOne().ToImmutable().RandomTakeOne())));
|
|
|
|
- sb.Append(" ?");
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
-
|
|
|
|
- default:
|
|
|
|
- Console.WriteLine("#n");
|
|
|
|
- sb.Append("我不太清楚你想做什麼");
|
|
|
|
- break;
|
|
|
|
|
|
+ if (match.IsExactMatch)
|
|
|
|
+ {
|
|
|
|
+ Console.WriteLine(bag.Invoke(match));
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ Console.WriteLine();
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
+ else
|
|
|
|
+ throw new Exception("未知的錯誤");
|
|
}
|
|
}
|
|
|
|
+ else
|
|
|
|
+ Console.WriteLine("沒有任何模組相符");
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //var list = new List<IScore>();
|
|
|
|
+ //foreach (var p in allPlugins)
|
|
|
|
+ // list.AddRange(p.Evaluate(cutted));
|
|
|
|
+ //list.Sort(ScoreComparer.Default);
|
|
|
|
+
|
|
|
|
+ //var sb = new StringBuilder("Bot: ");
|
|
|
|
+ //var best = list.LastOrDefault();
|
|
|
|
+ //if (best is null)
|
|
|
|
+ // sb.Append("我不懂你的意思");
|
|
|
|
+ //else if (best.IsCompacted)
|
|
|
|
+ //{
|
|
|
|
+ // var resp = best.Owner.SelectBest(best).Invoke(best);
|
|
|
|
+ // Console.WriteLine(resp.Mood.ToString());
|
|
|
|
+ // sb.Append(resp.Message);
|
|
|
|
+ //}
|
|
|
|
+ //else
|
|
|
|
+ //{
|
|
|
|
+ // var choices = list.Where(s => s.Missing.Count <= 1).ToImmutableArray();
|
|
|
|
+ // switch (choices.Length)
|
|
|
|
+ // {
|
|
|
|
+ // case 1:
|
|
|
|
+ // {
|
|
|
|
+ // Console.WriteLine("#1");
|
|
|
|
+ // sb.Append("你" + new[] { "是想", "想要" }.RandomTakeOne() + " ");
|
|
|
|
+ // sb.Append(choices.Select(x => x.Pattern.ToImmutable().Aggregate(string.Empty, (s, g) => s += g.ToImmutable().RandomTakeOne().ToImmutable().RandomTakeOne())));
|
|
|
|
+ // sb.Append(" 嗎?");
|
|
|
|
+ // }
|
|
|
|
+ // break;
|
|
|
|
+
|
|
|
|
+ // case 2:
|
|
|
|
+ // {
|
|
|
|
+ // Console.WriteLine("#2");
|
|
|
|
+ // sb.Append("你" + new[] { "是想", "想要" }.RandomTakeOne() + " ");
|
|
|
|
+ // sb.AppendJoin(" 還是 ", choices.Select(x => x.Pattern.ToImmutable().Aggregate(string.Empty, (s, g) => s += g.ToImmutable().RandomTakeOne().ToImmutable().RandomTakeOne())));
|
|
|
|
+ // sb.Append(" ?");
|
|
|
|
+ // }
|
|
|
|
+ // break;
|
|
|
|
+
|
|
|
|
+ // default:
|
|
|
|
+ // Console.WriteLine("#n");
|
|
|
|
+ // sb.Append("我不太清楚你想做什麼");
|
|
|
|
+ // break;
|
|
|
|
+ // }
|
|
|
|
+ //}
|
|
|
|
|
|
- Console.WriteLine(sb);
|
|
|
|
|
|
+ //Console.WriteLine(sb);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|