public ExplanationWindow(TextGeneratorContext context) : this() { _context = context; BuildTree(); }
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); } }
private ExplanationWindow() { InitializeComponent(); _context = null; }
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)); } }
private ConsultWindow() { InitializeComponent(); _resultContext = null; }