Example #1
0
        private void findSP(List<int> allResultIds, PartOfSpeech PartOfSpeech, ObjectType type)
        {
            // из всех текущих id выбираем такие, которые являются заданным типом СЧР
            List<int> idsToAnalyze = new List<int>();
            foreach (var resultId in allResultIds)
            {
                if (_sentence.WordList.Exists(x => x.Id == resultId && x.PartOfSpeech.Value == PartOfSpeech.Value))
                    idsToAnalyze.Add(resultId);
            }

            foreach (var wordId in idsToAnalyze)
            {
                //ищем дочернее слово для СЧР
                List<SentenceWord> childWords = _sentence.WordList.FindAll(x => x.DOM == wordId);

                foreach (var childWord in childWords)
                {
                    // найдем в текущих результатах такой элемент, id которого либо равен исследуемому, либо в его ServiceParts присутствует исследуемый id - чтобы знать куда добавлять инфу
                    var resultItem = Result.Items.Find(x => x.Id == wordId);
                    if (resultItem == null)
                    {
                        foreach (var i in Result.Items)
                        {
                            if (i.ServiceParts.Exists(x => x.Id == wordId))
                                resultItem = i;
                        }
                    }
                    Debug.Assert(resultItem != null);

                    // если дочернего слова нет в списке предварительных элеметнов, то добавляем его вместо текущего элемента, присоединяя к нему СЧР с заданным типом СЧР
                    if (!allResultIds.Exists(x => x == childWord.Id))
                    {
                        Stage2ResultElement itemToAdd = new Stage2ResultElement();
                        itemToAdd.IsRestoredFromServicePart = true;
                        itemToAdd.CopyFromSourceWord(childWord);
                        itemToAdd.ObjectType = type;
                        if (itemToAdd.ServiceParts.Find(x => x.Id == wordId) == null)
                            itemToAdd.ServiceParts.Add(_sentence.WordList.Find(x => x.Id == wordId));
                        Result.Items.Remove(resultItem);

                        Result.Items.Add(itemToAdd);
                    }
                    // а если такое слово есть, то берем его и объединяем с СЧР, с заданным типом
                    else
                    {
                        var existResult = Result.Items.Find(x => x.Id == childWord.Id);

                        if (resultItem.ServiceParts.Find(x => x.Id == wordId) == null && resultItem.Id != wordId)
                            resultItem.ServiceParts.Add(_sentence.WordList.Find(x => x.Id == wordId));
                        Result.Items.RemoveAll(x => x.Id == wordId);
                    }

                    allResultIds = getAllMainPartsIds(type);
                }
            }
        }
Example #2
0
        public override void ProcessSentence(Sentence sentence)
        {
            _sentence = sentence;
            Debug.Assert(_stage1Result != null);

            // Подлежащие
            foreach (var sourceWord in _stage1Result.Items.FindAll(x => x.ObjectType == ObjectType.Subject))
            {
                Stage2ResultElement item = new Stage2ResultElement();
                item.CopyFromSourceWord(sourceWord);
                Result.Items.Add(item);
            }

            // Сказуемые
            foreach (var sourceWord in _stage1Result.Items.FindAll(x => x.ObjectType == ObjectType.Predicate))
            {
                Stage2ResultElement item = new Stage2ResultElement();
                item.CopyFromSourceWord(sourceWord);
                Result.Items.Add(item);
            }
        }