/// <summary> /// Создание подпредложения из xml-элемента /// </summary> /// <param name="subSentence">xml-элемент</param> /// <param name="language">язык предложения</param> /// <returns>подпредложение</returns> private static SubSentence SubSentenceFromXElement(XElement subSentence, string language) { #region [.defense.] if (!subSentence.IsName(UnitTextType.SUB_SENT)) { throw new ArgumentException("element isn't SUB_SENT"); } #endregion SubSentenceType type = (SubSentenceType)Enum.Parse(typeof(SubSentenceType), subSentence.GetAttributeValue(RDF.Attribute.Type)); SubSentence result = new SubSentence(type, _positionInSentence); switch (type) { case SubSentenceType.AdjunctPhrase: case SubSentenceType.DanglingParticiple: case SubSentenceType.Default: case SubSentenceType.Introductory: case SubSentenceType.Participial: case SubSentenceType.Subordinate: SimpleSubSentenceFromXElement(result, subSentence, language); break; case SubSentenceType.ApproximatingForceps: case SubSentenceType.DirectSpeech: SubTextFromXElement(result, subSentence, language); break; #region [.defense.] default: throw new InvalidOperationException("Unknown subSentence type"); #endregion } return(result); }
/// <summary> /// Установка субъекта для текущего подпредложения /// </summary> /// <param name="parent">родительское подпредложение</param> private void SetSubjectInCurrent(SubSentenceInfo parent) { SubSentenceType currentType = CurrentSubSentence.SubSentence.Type; if (currentType == SubSentenceType.DanglingParticiple) { SetCurrentDanglingParticipleDeterminer(parent); } else if (currentType == SubSentenceType.Participial) { SetCurrentParticipialDeterminer(parent); } else { SetCurrentSubject(); } }
/// <summary> /// Проверка, что заданный текст является союзом заданного типа /// </summary> /// <param name="conjunction">текст</param> /// <param name="type">тип союза</param> /// <returns>результат проверки</returns> private static bool IsConjunctionCurrentType(string text, SubSentenceType type) { return(_conjunctionDict[type].Any(_ => _ == text)); }
/// <summary> /// Проверка, что заданный текст является союзом заданного типа /// </summary> /// <param name="conjunction">текст</param> /// <param name="type">тип союза</param> /// <returns>результат проверки</returns> public static bool IsConjunctionType(string text, SubSentenceType type) { return(IsConjunctionCurrentType(new SimpleStringBuilder(text).LowerValue, type)); }
/// <summary> /// Создание сущности из xml-элемента /// </summary> /// <param name="entity">xml-элемент</param> /// <param name="language">язык предложения</param> /// <param name="subSentenceType">тип подпредложения</param> /// <returns>сущность</returns> private static Entity EntityFromXElement(XElement entity, string language, SubSentenceType subSentenceType) { TextEntity textEntity = new TextEntity(); textEntity.Type = entity.GetAttributeValue(RDF.Attribute.Type); textEntity.Value = entity.GetAttributeValue(RDF.Attribute.Value); textEntity.Text = GetFullValue(entity); textEntity.Language = language; textEntity.Start = _positionInSentence; textEntity.IsPseudoPlace = entity.IsContainAttribute(RDF.Attribute.PseudoPlace); if (entity.IsContainAttribute(RDF.Attribute.FirstName)) { textEntity.FirstName = entity.GetAttributeValue(RDF.Attribute.FirstName); } if (entity.IsContainAttribute(RDF.Attribute.MiddleName)) { textEntity.MiddleName = entity.GetAttributeValue(RDF.Attribute.MiddleName); } if (entity.IsContainAttribute(RDF.Attribute.LastName)) { textEntity.LastName = entity.GetAttributeValue(RDF.Attribute.LastName); } if (entity.IsContainAttribute(RDF.Attribute.MorphoInformation)) { string morpho = entity.GetAttributeValue(RDF.Attribute.MorphoInformation); if (!string.IsNullOrEmpty(morpho)) { textEntity.MorphoInfo = morpho.Split(RDF.ValueSeparator).ToList(); } } if (entity.IsContainAttribute(RDF.Attribute.MainNoun)) { textEntity.MainNoun = entity.GetAttributeValue(RDF.Attribute.MainNoun); } if (entity.IsContainAttribute(RDF.Attribute.Post)) { textEntity.Post = entity.GetAttributeValue(RDF.Attribute.Post); } if (entity.IsContainAttribute(RDF.Attribute.Prefix)) { textEntity.MainNounPrefix = entity.GetAttributeValue(RDF.Attribute.Prefix); } if (entity.IsContainAttribute(RDF.Attribute.Adjectives)) { textEntity.Adjectives = entity.GetAttributeValue(RDF.Attribute.Adjectives).Split(RDF.ValueSeparator).ToList(); } Entity result = textEntity.CreateEntity(); if (result.IsType(EntityType.Conjunction)) { ((ConjunctionEntityInfo)result.EntityInfo).ConjunctionType = subSentenceType; } if (entity.IsContainAttribute(RDF.Attribute.Role)) { result.Role = (EntityRole)Enum.Parse(typeof(EntityRole), entity.GetAttributeValue(RDF.Attribute.Role)); } foreach (XElement element in entity.Elements()) { if (IsEntity(element)) { result.AddChild(EntityFromXElement(element, language, subSentenceType)); } else { _positionInSentence += GetFullValue(element).Length; } } _sentenceEntities.Add(entity.GetAttributeValue(RDF.Attribute.ID), result); return(result); }
public ConjunctionEntityInfo(SubSentenceType conjunctionType) : base(EntityType.Conjunction) { ConjunctionType = conjunctionType; }
public SubSentence(SubSentenceType type, int startPosition) { Type = type; Children = new SubSentence[] {}; StartPosition = startPosition; }