コード例 #1
0
        public ExplanationWindow(TextGeneratorContext context)
            : this()
        {
            _context = context;

            BuildTree();
        }
コード例 #2
0
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            _resultContext = null;

            try
            {
                statusText.Text = string.Empty;

                _resultContext = _textGenerator.GenerateText(_talesNetwork, QuestionTextBox.Text);

                if (_resultContext == null)
                {
                    btnStart.IsEnabled = false;
                    statusText.Text = "Процесс генерации завершен";
                }
                else
                {
                    AnswerTextBox.Text = _resultContext.OutputText;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, Properties.Resources.ErrorMsgCaption, MessageBoxButton.OK,
                    MessageBoxImage.Error);
            }
        }
コード例 #3
0
        private ExplanationWindow()
        {
            InitializeComponent();

            _context = null;
        }
コード例 #4
0
        private void ResolveText(TalesNetwork talesNetwork, string text)
        {
            _currentContext = new TextGeneratorContext(talesNetwork, text);

            // 1. Сначала входной текст разбиваем на предложения,
            //    а каждое предложение в свою очередь на лексемы.

            IEnumerable<IEnumerable<SentenceToken>> textTokens = _textParser.Parse(text);

            // 2. Затем среди лексем входного текста выполняется поиск отдельных
            //    концептов сети (персонажей, локативов и т.д.).

            foreach (var sentenceTokens in textTokens)
            {
                ResolveSentence(sentenceTokens, talesNetwork.Persons, _currentContext.ResolvedPersons);
                ResolveSentence(sentenceTokens, talesNetwork.Locatives, _currentContext.ResolvedLocatives);
                ResolveSentence(sentenceTokens, talesNetwork.Actions, _currentContext.ResolvedActions);
            }

            // 3. Затем выполняется поиск функций, которые содержат привязавшиеся концепты.
            //    Одновременно для каждой функции рассчитывается числовой коэффициент,
            //    отображающий ее уровень релевантности контексту, содержащемуся во входном тексте.

            foreach (TaleNode tale in talesNetwork.Tales)
            {
                // TODO: Функции базовой сказки не учитываются при формировании
                //       набора привязавшихся функций и списка генерации.

                if (!(tale.BaseNode is TaleNode))
                {
                    continue;
                }

                foreach (FunctionNode function in tale.Functions)
                {
                    double resolvedFunctionNodes =
                        function.Agents.Count(agent => _currentContext.ResolvedPersons.Contains(agent)) +
                        function.Recipients.Count(recipient => _currentContext.ResolvedPersons.Contains(recipient)) +
                        function.Locatives.Count(locative => _currentContext.ResolvedLocatives.Contains(locative)) +
                        function.Actions.Count(action => _currentContext.ResolvedActions.Contains(action));

                    if (resolvedFunctionNodes != 0)
                    {
                        double generalFunctionNodes =
                            function.Agents.Count() +
                            function.Recipients.Count() +
                            function.Locatives.Count() +
                            function.Actions.Count();
                        double functionRelevanceLevel = resolvedFunctionNodes / generalFunctionNodes;

                        _currentContext.ResolvedFunctions.Add(new FunctionGenerationInfo(function, functionRelevanceLevel));
                    }
                }
            }

            // 4. Затем составляется отсортированный
            //    в соответсвии уровнем релевантности список сказок.

            Dictionary<TaleNode, double> taleRelevanceLevels = new Dictionary<TaleNode, double>();

            foreach (FunctionGenerationInfo functionResolveContext in _currentContext.ResolvedFunctions)
            {
                TaleNode currentTale = functionResolveContext.Function.Tale;
                TaleNode baseTale = currentTale.BaseNode as TaleNode;

                // TODO: Базовые сказки пока не попадают в список генерации.
                if (baseTale == null)
                {
                    continue;
                }

                double taleRelevanceLevel;

                if (!taleRelevanceLevels.TryGetValue(currentTale, out taleRelevanceLevel))
                {
                    taleRelevanceLevel = 0.0;
                }

                taleRelevanceLevel += functionResolveContext.RelevanceLevel / baseTale.Functions.Count();

                taleRelevanceLevels[currentTale] = taleRelevanceLevel;
            }

            List<KeyValuePair<TaleNode, double>> list = taleRelevanceLevels.ToList();

            // Список сортируется в порядке уменьшения уровня релевантности.

            list.Sort((firstPair, secondPair) => secondPair.Value.CompareTo(firstPair.Value));

            foreach (var pair in list)
            {
                _currentContext.Tales.Add(new TaleGenerationInfo(pair.Key, pair.Value));
            }
        }
コード例 #5
0
        private ConsultWindow()
        {
            InitializeComponent();

            _resultContext = null;
        }