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 }); } }
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); } } }
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; }
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; }