protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var subjects = generator.GetValues(instance, Concept2.Subject).ToArray(); var answer = generator.GetValue(instance, Concept2.Answer); var unknown = generator.GetValue(instance, Concept2.Unknown); var target = generator.GetValue(instance, Concept2.Target); var directSubjects = filterDirectSubjects(subjects, answer); var indirectSubjects = filterIndirectSubjects(subjects, answer, generator); if (answer.Concept == Concept2.Nothing) { // user does not like any option return; } if (directSubjects.Count() == 1) { pushSetSubject(target, directSubjects.First(), generator, unknown); return; } if (indirectSubjects.Count() == 1) { pushSetSubject(target, indirectSubjects.First(), generator, unknown); return; } if (indirectSubjects.Count() == 0) { generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.DisambiguationFailed))); return; } if (indirectSubjects.Count() < subjects.Count()) { //create new disambiguation generator.Push(new StaticScoreEvent(0.1)); pushNewDisambiguation(indirectSubjects, unknown, target, generator); return; } if (indirectSubjects.Count() == subjects.Count()) { var knowledgeConfirmation = new ConceptInstance(Concept2.DisambiguatedKnowledgeConfirmed); generator.SetValue(knowledgeConfirmation, Concept2.Subject, answer); generator.SetValue(knowledgeConfirmation, Concept2.Target, instance); generator.Push(new StaticScoreEvent(0.05)); generator.Push(new InstanceOutputEvent(knowledgeConfirmation)); return; } //disambiguation was not helpful generator.Push(new StaticScoreEvent(-1.0)); }
protected override IEnumerable <string> execute(BeamGenerator generator) { var evt = Get <IncompleteRelationEvent>(s => !s.IsFilled && s.Subject?.Concept == Concept2.PropertyValueDisambiguation, searchInsideTurnOnly: false); if (evt == null) { yield break; } generator.Push(evt); var disambiguation = evt.Subject; var unknown = generator.GetValue(disambiguation, Concept2.Unknown); var candidates = generator.GetValues(disambiguation, Concept2.Subject); var candidateProperties = new HashSet <Concept2>(); foreach (var candidate in candidates) { var relevantProperty = generator.GetValue(candidate, Concept2.Property); candidateProperties.Add(relevantProperty.Concept); } if (candidateProperties.Count == 1) { var candidateString = string.Join(", ", candidates.Select(c => singular(c.Concept))); yield return($"I can recognize {candidateString} as {plural(candidateProperties.First())}. Which of them is related to {singular(unknown)}?"); } else if (candidateProperties.Count < 4) { var candidateString = string.Join(" or ", candidateProperties.Select(c => singular(c))); yield return($"What does {singular(unknown)} mean?"); yield return($"I think, It can be {candidateString}. Which fits best the meaning of {singular(unknown)}?"); } else { yield return($"What does {singular(unknown)} mean ?"); } }
protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator) { var answer = generator.GetValue(instance, Concept2.Answer); var options = generator.GetValues(instance, Concept2.Option); var disambiguatedOptions = disambiguate(options, answer); if (disambiguatedOptions.Count() == 1) { var activeOption = disambiguatedOptions.First(); var instanceToActivate = generator.GetValue(activeOption, Concept2.Invocation); generator.Push(new StaticScoreEvent(0.1)); generator.Push(new InstanceActivationRequestEvent(instanceToActivate)); } else if (disambiguatedOptions.Count() == 0) { generator.Push(new StaticScoreEvent(-0.2)); //push same options again pushNewOptions(options, generator); } else { pushNewOptions(disambiguatedOptions, generator); } }