private static void checkLinkedChainMaster(RawSentencePart part, List<string> result) { result.AddRange(from chainReference in part.ChainReferences where chainReference.IsMaster && !(part.SubjectId != null || part.PredicateId != null || part.ValuableAuxPartId != null) select "'Родителем' в отдельной Зависимой цепочке должен являться либо Главный член предложения либо Значимый объект"); }
private static void checkLinkedChainDependent(RawSentencePart part, List<string> result) { result.AddRange(from chainReference in part.ChainReferences where !chainReference.IsMaster && !(part.SubjectId == null && part.PredicateId == null && part.ValuableAuxPartId == null) select "Главные члены или Значимые объекты не должны быть в составе Зависимой цепочки в качестве Зависимого объекта"); }
/// <summary> /// Проверяет часть предложения на корректность по набору правил. /// </summary> /// <param name="part"></param> /// <returns>список ошибок (пустой, если все в порядке) </returns> public static List<string> Validate(RawSentencePart part) { var result = new List<string>(); checkDataPresence(part, result); checkLinkedChainMaster(part, result); checkLinkedChainDependent(part, result); return result.Select(s => String.Format("Предложение {0}, часть {1}: {2}", part.SentenceId + 1, part.Position + 1, s)).ToList(); }
/// <summary> /// Разбор "сырых" данных. Строки из массива ячеек преобразовываются в части предложений (семантика в соответствии с таблицей) /// </summary> /// <param name="rawData"></param> /// <returns></returns> private static List<RawSentencePart> praseData(List<RowNoHeader> rawData) { return rawData.Select(row => { var uniformId = row.FindIndex(UniformStartCell, UniformCellCount, isVluableCell) - UniformStartCell; var subjectId = row.FindIndex(SubjectStartCell, SubjectCellCount, isVluableCell) - SubjectStartCell; var predicateId = row.FindIndex(PredicateStartCell, PredicateCellCount, isVluableCell) - PredicateStartCell; var valuableAuxId = row.FindIndex(ValuableAuxStartCell, ValuableAuxCellCount, isVluableCell) - ValuableAuxStartCell; var linkedChainReferences = getChainReferences(row); var rawSentencePart = new RawSentencePart { SentenceId = Int32.Parse(row[SentenceCell]) - 1, Position = Int32.Parse(row[PositionCell]) - 1, IsAuxilary = isVluableCell(row[IsAuxilaryCell]), Word = row[WordCell], SimpleSentenceId = row.FindIndex(SimpleSentenceIdStartCell, SimpleSentenceIdCellCount, isVluableCell) - SimpleSentenceIdStartCell, UniformId = uniformId >= 0 ? uniformId : (int?) null, SubjectId = subjectId >= 0 ? subjectId : (int?) null, PredicateId = predicateId >= 0 ? predicateId : (int?) null, ValuableAuxPartId = valuableAuxId >= 0 ? valuableAuxId : (int?) null, ChainReferences = linkedChainReferences.Select(i => new RawSentencePart.LinkedChainReference { ChainId = i / 2, IsMaster = i % 2 == 0 }).ToList() }; return rawSentencePart; }).ToList(); }
private static void checkDataPresence(RawSentencePart part, List<string> errors) { if (part.SimpleSentenceId < 0) errors.Add("Не указана принадлежность к простому предложению для слова (возможно наличие лишних скрытых строк таблицы)"); }