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));
        }
Ejemplo n.º 2
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 ?");
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }