/// <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="sentenceItems">элементы предложения</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <returns>новый текст предложения</returns> private string GetNewSentenceText(SentenceItems sentenceItems, CorrectedContentInfo contentInfo) { var sentenceInfo = new CorrectedSentenceInfo(sentenceItems); int entityIndex = 0; int startContentIndex = sentenceInfo.SentenceItems.ContentIndex - contentInfo.RemovedContentCount; int removedContentCountStart = contentInfo.RemovedContentCount; foreach (int index in GetContentIndexesInsideSentence(sentenceItems.Sentence, ref startContentIndex, contentInfo.RemovedContentLength)) { int removedContentCount = contentInfo.RemovedContentCount - removedContentCountStart; DecomposeEntitiesAndContentToSentence(index - removedContentCount, sentenceInfo, contentInfo, ref entityIndex); } for (int i = sentenceItems.Entities.Length - 1; i >= entityIndex; --i) { AddEntity(sentenceItems.Entities[i], contentInfo.CurrentEntityShift); } return(sentenceInfo.NewSentenceText.ToString()); }
/// <summary> /// Удаление дочернего контента /// </summary> /// <param name="sentenceInfo">информация о корректируемом предложении</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <param name="contentIndex">индекс удаляемого контента</param> private void RemoveChildContent(CorrectedSentenceInfo sentenceInfo, CorrectedContentInfo contentInfo, int contentIndex) { ChildContent content = Children[contentIndex]; string contentText = content.GetFullText(); int startPosition = GetContentCorrectedStart(contentIndex) - (sentenceInfo.SentenceItems.Sentence.GetFullStartPosition() + contentInfo.RemovedContentLength); sentenceInfo.NewSentenceText.Insert(startPosition, contentText); foreach (var entity in content.Entities) { AddEntity(entity, -(startPosition + content.TextStartPosition - content.StartPosition)); } Children.RemoveAt(contentIndex); ++contentInfo.RemovedContentCount; contentInfo.RemovedContentLength += contentText.Length; }
/// <summary> /// Получение нового параграфа /// </summary> /// <param name="sentenceItemsCollection">коллекция элементов предложений</param> /// <param name="startPosition">начальная позиция</param> /// <param name="contentInfo">информация о корректируемом контенте</param> /// <returns>новый параграф</returns> private Paragraph GetNewParagraph(IEnumerable <SentenceItems> sentenceItemsCollection, int startPosition, CorrectedContentInfo contentInfo) { List <TextParsing.Sentence> sentences = new List <TextParsing.Sentence>(); int sentenceStartPosition = 0; foreach (var sentenceItems in sentenceItemsCollection) { var sentence = new TextParsing.Sentence(GetNewSentenceText(sentenceItems, contentInfo), sentenceStartPosition); sentences.Add(sentence); sentenceStartPosition = sentence.EndPosition; } Paragraph result = new Paragraph(sentences.GetText(), startPosition); result.SetSentences(sentences); return(result); }
/// <summary> /// Задание сущностей для контента и дочерних частей /// </summary> /// <param name="isOnlyPotencial">флаг, что нужно выбирать только потенциальные части</param> /// <param name="entities">коллекция сущностей</param> public void SetEntitiesForContentAndChildren(IEnumerable <Entity> entities, bool isOnlyPotencial = true) { int sentenceIndex = 0; var sentenceItems = GetSentencesItems(GetSentencesWithChildrenParts(isOnlyPotencial), entities); int paragraphStartPosition = 0; var correctedContentInfo = new CorrectedContentInfo() { IsOnlyPotencialParts = isOnlyPotencial }; for (int i = 0; i < _paragraphs.Length; ++i) { var paragraphSentenceItems = sentenceItems.GetRange(sentenceIndex, _paragraphs[i].Sentences.Length); sentenceIndex += _paragraphs[i].Sentences.Length; _paragraphs[i] = GetNewParagraph(paragraphSentenceItems, paragraphStartPosition, correctedContentInfo); paragraphStartPosition = _paragraphs[i].EndPosition; } SetFullText(_paragraphs.GetText()); }