/// <summary> /// Определение является ли контент частью данного предложения и /// распределение сущностей между предложением и контентов в противном случае /// </summary> /// <param name="contentIndex">индекс контента</param> /// <param name="sentenceInfo">информация о корректируемом предложении</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <param name="entityIndex">индекс сущности</param> private void DecomposeEntitiesAndContentToSentence(int contentIndex, CorrectedSentenceInfo sentenceInfo, CorrectedContentInfo contentInfo, ref int entityIndex) { ChildContent content = Children[contentIndex]; int notPotencialPartsShift = contentInfo.IsOnlyPotencialParts ? GetFullContentsLength(contentIndex, true) : 0; int contentStartPosition = content.StartPosition - notPotencialPartsShift; int contentEndPosition = contentStartPosition + content.GetFullLength(); List <Entity> contentEntities = new List <Entity>(); bool isShiftedContent = !contentInfo.IsOnlyPotencialParts || content.IsPotencialParentPart; bool isRemovedContent = false; if (isShiftedContent) { for (; entityIndex < sentenceInfo.SentenceItems.Entities.Length; ++entityIndex) { Entity entity = sentenceInfo.SentenceItems.Entities[entityIndex]; if (entity.PositionInfo.End <= contentStartPosition) { AddEntity(entity, contentInfo.CurrentEntityShift); continue; } else if (entity.PositionInfo.Start >= contentEndPosition) { break; } else if ((entity.PositionInfo.Start < contentStartPosition) && (contentEndPosition < entity.PositionInfo.End)) /// сущность полностью содержит контент - контент включаем в родителя { ++entityIndex; AddEntity(entity, contentInfo.CurrentEntityShift); RemoveChildContent(sentenceInfo, contentInfo, contentIndex); isRemovedContent = true; break; } else if ((contentStartPosition < entity.PositionInfo.Start) && (entity.PositionInfo.End < contentEndPosition)) { contentEntities.Add(entity); } #region [.defense.] else /// сущность пересекается с дочерним контентом - пропускаем такую сущность { ++entityIndex; } #endregion } } if (!isRemovedContent) { UpdateUnitsPosition(contentEntities, notPotencialPartsShift - content.TextStartPosition); content.SetEntitiesForContentAndChildren(contentEntities, contentInfo.IsOnlyPotencialParts); if (isShiftedContent) { contentInfo.CurrentEntityShift += content.GetFullLength(); } } }
/// <summary> /// Получение текста предложения с дочерними частями /// </summary> /// <param name="sentence">предложение</param> /// <param name="startPosition">начальная позиция предложения</param> /// <param name="isOnlyPotencial">флаг, что нужно выбирать только потенциальные части</param> /// <param name="contentIndex">индекс текущего контента</param> /// <returns>текст предложения с дочерними частями</returns> private string GetSentenceWithChildrenParts(TextParsing.Sentence sentence, int startPosition, bool isOnlyPotencial, ref int contentIndex) { StringBuilder result = new StringBuilder(sentence.Text); var indexes = GetContentIndexesInsideSentence(sentence, ref contentIndex); int partsLength = 0; foreach (int index in indexes) { ChildContent child = Children[index]; if (!isOnlyPotencial || child.IsPotencialParentPart) { result.Insert(GetContentCorrectedStart(index) - startPosition + partsLength, child.GetTextWithChildrenParts(isOnlyPotencial)); partsLength += child.GetFullLength(); } } return(result.ToString()); }