private object[] _processParticiple(SentenceElement element, Sentence sentence, UniformPartsFinalResults upRows) { var participleId = element.Id; var hasChildrenNotServicePart = sentence.SyntacticChildren(participleId).Any(x => x.SyntacticRole.Value != SyntacticRole.ParticleNegative.Value && x.SyntacticRole.Value != SyntacticRole.CoordinatingConjunction.Value && x.SyntacticRole.Value != SyntacticRole.Particle.Value); if (hasChildrenNotServicePart) { Log.InfoFormat(" Обнаружили потомка не СЧР. Причастие -- Причастие Финальное 1"); var finalParticiple1 = participleId; return new object[] {participleId, finalParticiple1, -1, finalParticiple1, -1}; } Log.InfoFormat("Причастие - Причастие - предварительное 2)"); if (!upRows.All.Any(x => x.Id == participleId)) { Log.InfoFormat(" Причастие не принадлежит ни одному из рядов. Причастие -- Признак 1"); var participleFeature = participleId; return new object[] {participleId, -1, -1, -1, participleFeature}; } var rowNr = upRows.All.Find(x => x.Id == participleId).RowNr; Log.InfoFormat(" Причастие принадлежит к ряду ОЧ {0}. Причастие - предваритиельное 3", rowNr); if (sentence.Elements.FindAll(x => upRows.All.Select(y => y.Id).Contains(x.SyntacticParentWordId)).Any(x => x.SyntacticRole.Value != SyntacticRole.ParticleNegative.Value && x.SyntacticRole.Value != SyntacticRole.CoordinatingConjunction.Value && x.SyntacticRole.Value != SyntacticRole.Particle.Value)) { Log.InfoFormat(" У сочиненных с рассматриваемым причастий нет потомков не СЧР. Причастие -- Признак 2"); var participleFeature = participleId; return new object[] { participleId, -1, -1, -1, participleFeature }; } else { Log.InfoFormat(" У сочиненных с рассматриваемым причастий есть хотя бы один потомок не СЧР. Причастие -- Финальное 2"); var participleFinal2 = participleId; return new object[] { participleId, -1, participleFinal2, participleFinal2, -1 }; } }
public int ConjunctedWordId(Sentence sent) { // ищем соч связь между прилагательными через соч связь существительных if (FalseParentId > -1) { var falseElement = sent.GetElement(FalseParentId); var conjunctedWord = sent.Elements.Find(x => falseElement.ConjunctedWithId == x.Id); var firstChild = sent.SyntacticChildren(conjunctedWord).First(x => (x.SyntacticRole.Value == SyntacticRole.AgreedAttribute.Value || x.SyntacticRole.Value == SyntacticRole.ConcordantAttr.Value) && x.GrammarInfo.IsSingular && x.ConjunctedWithId == -1); return firstChild.Id; } else if (SuspectedParentId > -1) { var suspectedElement = sent.GetElement(SuspectedParentId); var conjunctedWord = sent.Elements.Find(x => x.ConjunctedWithId == suspectedElement.Id); var firstChild = sent.SyntacticChildren(conjunctedWord).First(x => (x.SyntacticRole.Value == SyntacticRole.AgreedAttribute.Value || x.SyntacticRole.Value == SyntacticRole.ConcordantAttr.Value) && x.GrammarInfo.IsSingular && x.ConjunctedWithId == -1); return firstChild.Id; } return -1; }
private void _processConfirmedAttach(QuasiUPAttachmentHelperObject confirmedAttach, List<QuasiUPAttachmentHelperObject> additionalAttachments, Sentence sentence, QuasiUniformPartsAttachmentMainHelperData resultHelpData) { Log.InfoFormat("Обрабатываем подтвержденный КвазиОЧ-Приложение. Тип1: {0}, Тип2: {1}, Текст: {2}, Id: {3}", confirmedAttach.Type1Confirmed, confirmedAttach.Type2Confirmed, confirmedAttach.Text, confirmedAttach.Id); var attachParentElement = sentence.SyntacticParent(confirmedAttach); if (attachParentElement != null) { Log.InfoFormat(" Нашли родителя: Текст: {0}, Id: {1}", attachParentElement.Id, attachParentElement.Text); if (attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Noun.Value || attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Pronoun.Value) { Log.InfoFormat(" У родителя часть речи: существительное или местоимение, добавляем квази ОЧ."); var attachParentElementWithHelperInfo = new QuasiUPAttachmentHelperObject(attachParentElement) { SourceNr = -1, Type1Confirmed = confirmedAttach.Type1Confirmed, Type2Confirmed = confirmedAttach.Type2Confirmed, IsInitiallyType1 = confirmedAttach.IsInitiallyType1, IsInitiallyType2 = confirmedAttach.IsInitiallyType2, IsAdditional = true, AddedParent = true, NewNr = confirmedAttach.SourceNr }; additionalAttachments.Add(attachParentElementWithHelperInfo); } else if(attachParentElement.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Verb.Value) { Log.InfoFormat(" У родителя часть речи: глагол, ищем потомков-существительные с таким же падежом, как у обрабатываемого Квази ОЧ."); var parentChildren = sentence.SyntacticChildren(attachParentElement).FindAll( x => x.GUID != confirmedAttach.GUID && x.GrammarInfo.PartOfSpeech.Value == PartOfSpeech.Noun.Value && x.GrammarInfo.Case.Value == confirmedAttach.GrammarInfo.Case.Value); if (parentChildren.Count > 0) { foreach (var child in parentChildren) { Log.InfoFormat(" Добавляем потомка-существительного с падежом {0} к результирующему массиву", confirmedAttach.GrammarInfo.Case.Value); var childWithHelperInfo = new QuasiUPAttachmentHelperObject(child) { SourceNr = -1, Type1Confirmed = confirmedAttach.Type1Confirmed, Type2Confirmed = confirmedAttach.Type2Confirmed, IsInitiallyType1 = confirmedAttach.IsInitiallyType1, IsInitiallyType2 = confirmedAttach.IsInitiallyType2, IsAdditional = true, AddedChildForParent = true, NewNr = confirmedAttach.SourceNr }; additionalAttachments.Add(childWithHelperInfo); } } else Log.InfoFormat(" У родителя с PartOfSpeech = {0} не найдены потомки-существительные в падеже {1}, кроме текущего активного элемента. Ничего не делаем", attachParentElement.GrammarInfo.PartOfSpeech.Value, confirmedAttach.GrammarInfo.Case.Value); } } else Log.Error("Для данного ТЭ не найден синтаксический родитель!"); }