protected override List<PostPropcessingActionInfo> DoProcess(Sentence sourceSentence, BaseHelperData data)
        {
            var result = new List<PostPropcessingActionInfo>();
            var words = new List<KeyValuePair<int, string>>();
            var firstGroupingColumnName = HelperDataQuasiUniformPartsAttachmentMainType2ConfirmedNr.Name;
            var secondGroupingColumnName = HelperDataQuasiUniformPartsAttachmentMainType2ParentNr.Name;
            var sourceColumnName = HelperDataQuasiUniformPartsAttachmentMainType2ConfirmedId.Name;
            var destColumnName = HelperDataQuasiUniformPartsAttachmentMainType2ParentId.Name;

            foreach (DataRow row in data.Rows)
            {
                if (row.Field<int>(firstGroupingColumnName) > -1)
                    row.SetField(secondGroupingColumnName, row.Field<int>(firstGroupingColumnName));
                if (row.Field<int>(secondGroupingColumnName) > -1)
                    row.SetField(firstGroupingColumnName, row.Field<int>(secondGroupingColumnName));
            }

            foreach (var group in data.AsEnumerable().GroupBy(grp => grp.Field<int>(firstGroupingColumnName)))
            {
                var sourceColValues = group.ToList().Find(x => x.Field<int>(sourceColumnName) > -1);
                var destColValues = group.ToList().Find(x => x.Field<int>(destColumnName) > -1);
                var sourceId = sourceColValues?.Field<int>(sourceColumnName) ?? -1;
                var destId = destColValues?.Field<int>(destColumnName) ?? -1;

                if (sourceId > 0 && destId > 0)
                {
                    var dest = sourceSentence.GetElement(destId);
                    var newRoleValue = dest.SyntacticRole.Value;
                    words.Add(new KeyValuePair<int, string>(sourceId, newRoleValue));
                }
            }

            PostProcessingUtils.ChangeSyntacticRole(Name, words, sourceSentence, result);

            return result;
        }
 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 _prepareDirectObject(BaseHelperData data, string idColumnName, string predicateIdColumnName, string predicateNrColumnName, DirectObjectType type, Sentence sentence)
        {
            foreach (var row in data.AsEnumerable().ToList().FindAll(x => x.Field<int>(idColumnName) > -1))
            {
                var sentenceElement = sentence.GetElement(row.Field<int>(idColumnName));
                var predicateId = row.Field<int>(predicateIdColumnName);
                var predicateNr = row.Field<string>(predicateNrColumnName);

                DirectObjects.Add(new DirectObject()
                {
                    Id = sentenceElement.Id,
                    GUID = sentenceElement.GUID,
                    Text = sentenceElement.Text,
                    ControlPredicateId = predicateId,
                    ControlPredicateNr = predicateNr,
                    Type = type
                });
            }
        }
Пример #4
0
        public static void Process(BaseHelperData sourceData, BaseSentenceAlgorithmData result, string objectIdColumnName, string objectTypeColumnName, Sentence sentence,
            bool isSubjectProcessed = false, bool isDirectObjectProcessed = false)
        {
            Debug.Assert(isSubjectProcessed || isDirectObjectProcessed == true);

            foreach (DataRow row in sourceData.Rows)
            {
                var objectSentenceElement = sentence.GetElement(row.Field<int>(objectIdColumnName));
                var objectElementType = row.Field<string>(objectTypeColumnName);

                var objectSubstantivatorSubType = ObjectSubstantivatorType.Undefined;
                var controllerNode = objectSentenceElement.ControllerNodes.Find(x => x.ConnectionType.Value == ControllerConnectionType.Coreferential.Value);

                if (objectSentenceElement.SemanticInfo.LexicalClass.Value == SemanticInfoLexicalClass.SubstantivatorControlled.Value
                    && controllerNode != null)
                {
                    objectSubstantivatorSubType = ObjectSubstantivatorType.HasController;
                    var newText = controllerNode.OriginalText;
                    var newLemma = sentence.GetElement(controllerNode.OriginalWordGUID).Lemma;

                    // указаны массивы для Подлежащего
                    result.HelperData.AddOrUpdateCustomRow(objectSentenceElement.GUID,
                        objectSentenceElement.Id, //12
                        objectElementType, // --
                        objectSentenceElement.Id, //3.1
                        newText, //П100
                        newLemma, //П100.1
                        -1, //3.2
                        -1, //3.0
                        newText, //100
                        -1, // 6.1
                        objectSentenceElement.Id, //7
                        objectSubstantivatorSubType, //П101
                        sentence.GetElement(controllerNode.OriginalWordGUID).Order //7.1
                        );

                    if(isSubjectProcessed)
                        result.FinalResults.SubjectsFinalResults.AddOrUpdateSubject(objectSentenceElement, SubjectClass.Undefined, objectSubstantivatorSubType, aId: null, bId: objectSentenceElement.Id);
                }
                else if (objectSentenceElement.SemanticInfo.LexicalClass.Value == SemanticInfoLexicalClass.SubstantivatorInanimate.Value
                    || objectSentenceElement.SemanticInfo.LexicalClass.Value == SemanticInfoLexicalClass.SubstantivatorAnimate.Value)
                {
                    foreach (var child in result.Sentence.SyntacticChildren(objectSentenceElement.Id))
                    {
                        objectSubstantivatorSubType = ObjectSubstantivatorType.Definition;
                        result.HelperData.AddOrUpdateCustomRow(objectSentenceElement.GUID,
                            objectSentenceElement.Id,
                            objectElementType,
                            -1,
                            string.Empty,
                            string.Empty,
                            objectSentenceElement.Id,
                            -1,
                            string.Empty,
                            child.Id,
                            child.Id,
                            objectSubstantivatorSubType,
                            child.Order);
                        if (isSubjectProcessed)
                        {
                            result.FinalResults.SubjectsFinalResults.All.RemoveAll(x => x.AId == objectSentenceElement.Id);
                            result.FinalResults.SubjectsFinalResults.AddOrUpdateSubject(child, SubjectClass.Undefined,
                                objectSubstantivatorSubType, aId: null, bId: child.Id);
                        }
                    }
                }
                else
                {
                    objectSubstantivatorSubType = ObjectSubstantivatorType.NonSubstantivator;
                    result.HelperData.AddOrUpdateCustomRow(objectSentenceElement.GUID,
                        objectSentenceElement.Id,
                        objectElementType,
                        -1,
                        string.Empty,
                        string.Empty,
                        -1,
                        objectSentenceElement.Id,
                        string.Empty,
                        -1,
                        objectSentenceElement.Id,
                        objectSubstantivatorSubType,
                        objectSentenceElement.Order);

                    if(isSubjectProcessed)
                    result.FinalResults.SubjectsFinalResults.AddOrUpdateSubject(objectSentenceElement, SubjectClass.Undefined, objectSubstantivatorSubType, aId: null, bId: objectSentenceElement.Id);
                }
            }
        }
Пример #5
0
        public static List<PostPropcessingActionInfo> ChangeSyntacticParent(string actionName, string sourceColumnName, string destColumnName, string firstGroupingColumnName, string secondGroupingColumnName, Sentence sourceSentence, BaseHelperData data)
        {
            var result = new List<PostPropcessingActionInfo>();
            var words = new List<KeyValuePair<int, int>>();

            foreach (DataRow row in data.Rows)
            {
                if (row.Field<int>(firstGroupingColumnName) > -1)
                    row.SetField(secondGroupingColumnName, row.Field<int>(firstGroupingColumnName));
                if (row.Field<int>(secondGroupingColumnName) > -1)
                    row.SetField(firstGroupingColumnName, row.Field<int>(secondGroupingColumnName));
            }

            foreach (var group in data.AsEnumerable().GroupBy(grp => grp.Field<int>(firstGroupingColumnName)))
            {
                var sourceColValues = group.ToList().Find(x => x.Field<int>(sourceColumnName) > -1);
                var destColValues = group.ToList().Find(x => x.Field<int>(destColumnName) > -1);
                var sourceId = sourceColValues?.Field<int>(sourceColumnName) ?? -1;
                var destId = destColValues?.Field<int>(destColumnName) ?? -1;

                if (sourceId > 0 && destId > 0)
                    words.Add(new KeyValuePair<int, int>(sourceId, destId));
            }

            // делаем синтаксического родителя источника таким же как синтаксический родитель получателя
            foreach (var pair in words)
            {
                var wordId = pair.Key;
                var newParentId = sourceSentence.GetElement(pair.Value).SyntacticParentWordId;
                var newParentGUID = sourceSentence.GetElement(pair.Value).SyntacticParentWordGUID;

                var modifiedWord = sourceSentence.GetElement(wordId);

                var oldModWordSyntacticParentId = modifiedWord.SyntacticParentWordId;
                var oldModWordSyntacticParentGUID = modifiedWord.SyntacticParentWordGUID;

                modifiedWord.SyntacticParentWordId = newParentId;
                modifiedWord.SyntacticParentWordGUID = newParentGUID;

                result.Add(new PostPropcessingActionInfo(actionName, wordId, nameof(modifiedWord.SyntacticParentWordId), oldModWordSyntacticParentId.ToString(), modifiedWord.SyntacticParentWordId.ToString()));
                result.Add(new PostPropcessingActionInfo(actionName, wordId, nameof(modifiedWord.SyntacticParentWordGUID), oldModWordSyntacticParentGUID, modifiedWord.SyntacticParentWordGUID));
            }

            return result;
        }
Пример #6
0
        public static List<PostPropcessingActionInfo> ChangeSyntacticParent(string actionName, string sourceColumnName, string destColumnName, Sentence sourceSentence, BaseHelperData data)
        {
            var result = new List<PostPropcessingActionInfo>();
            var words = new List<KeyValuePair<int, int>>();

            foreach (DataRow row in data.Rows)
            {
                var sourceId = row.Field<int?>(sourceColumnName) ?? -1;
                var destId = row.Field<int?>(destColumnName) ?? -1;

                if (sourceId > 0 && destId > 0)
                    words.Add(new KeyValuePair<int, int>(sourceId, destId));
            }
            // делаем значение синтаксического родителя источника таким же как значение получателя
            foreach (var pair in words)
            {
                var wordId = pair.Key;
                var newParetnId = pair.Value;
                var modifiedWord = sourceSentence.GetElement(wordId);

                var oldModWordSyntacticParentId = modifiedWord.SyntacticParentWordId;
                var oldModWordSyntacticParentGUID = modifiedWord.SyntacticParentWordGUID;

                modifiedWord.SyntacticParentWordId = newParetnId;
                modifiedWord.SyntacticParentWordGUID = sourceSentence.GetElement(newParetnId).GUID;

                result.Add(new PostPropcessingActionInfo(actionName, wordId, nameof(modifiedWord.SyntacticParentWordId), oldModWordSyntacticParentId.ToString(), modifiedWord.SyntacticParentWordId.ToString()));
                result.Add(new PostPropcessingActionInfo(actionName, wordId, nameof(modifiedWord.SyntacticParentWordGUID), oldModWordSyntacticParentGUID, modifiedWord.SyntacticParentWordGUID));
            }

            return result;
        }