private IOrderedEnumerable<SentenceElement> _simpleSentenceWords(Stage3ResultElement algResult) { return algResult.ChainWordsIds.All.Values.Select(wordId => _sentence.ElementList.Find(word => word.Id == wordId)). Concat(_sentence.ElementList.FindAll(word => word.Order == algResult.Order)). OrderBy(word => word.Order); }
public override void ProcessSentence(Sentence sentence) { _sentence = sentence; Debug.Assert(sentence.ElementList != null); Debug.Assert(sentence.ElementList.Count > 0); List<SentenceElement> words = sentence.ElementList; // берем результат 2-го этапа и для каждого элемента восстанавливаем цепочку синтаксической связи foreach (var sentenceWordStage2 in _simpleSentenceStage2Result) { Stage3ResultElement item = new Stage3ResultElement(); item.CopyFromSourceWord(sentenceWordStage2); var excludeIds = new List<string>(); // формируем массив иключений при поиске зависимой цепочки foreach (var res in _simpleSentenceStage2Result) excludeIds.Add(res.Id); item.LoadChainList(excludeIds.ToArray(), ref words); item.IsCorrect = sentenceWordStage2.IsCorrect; Result.Items.Add(item); } foreach (var item in Result.Items.FindAll(x => x.IsCorrect == false)) { // Имеем дело с ОЧ-сказуемым. Находим в существующих результатах item , который является родителем по ОЧ и добавляем к нему var foundParentItem = Result.Items.Find(x => x.ConjuctedWithId == item.Id); if (foundParentItem != null) foundParentItem.ChainWordsIds.InsertChild(item.ChildWordsIds.Root.Tree); } // формируем номера ПП SortedList<int, int> minWordOrder = new SortedList<int, int>(); // номера ПП определяются по минимальному порядковому номеру слов в выбранном предложении foreach (var item in Result.Items.FindAll(x => x.IsCorrect == true)) { List<int> sentenceWordOrders = item.ChainWordsIds.All.Values.Select(x => int.Parse(x)).ToList(); sentenceWordOrders.Add(int.Parse(item.Id)); foreach (var chainWordId in item.ChainWordsIds.Values) sentenceWordOrders.Add(sentence.ElementList.Find(x => x.Id == chainWordId).Order); sentenceWordOrders.Sort(); minWordOrder.Add(int.Parse(item.Id), sentenceWordOrders[0]); } int lastNr = 1; foreach (var dictItem in minWordOrder) { Result.Items.Find(x => int.Parse(x.Id) == dictItem.Key).SimpleSentenceNr = lastNr; lastNr++; } }