/// <summary> /// Проверка, что заданный потенциальный конец предложения относится к обрывочной ситате /// </summary> /// <param name="end">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsScrappyCitation(PotencialSentenceEnd end) { string endText = Text.Substring(end.Index, end.End - end.Index); return(((endText == "…") || (endText == "...")) && (OpenQuotes.Contains(Text.GetPreviousCharAfterSpace(end.Index)) || CloseQuotes.Contains(Text.GetNextCharAfterSpace(end.End - 1)))); }
/// <summary> /// Проверка, что заданный потенциальный конец предложения является точкой при названии сервиса Яндекса /// </summary> /// <param name="end">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsYandexServicePoint(PotencialSentenceEnd end) { if (IsPoint(end)) { string previousWord = Text.GetWordBeforeCurrentPosition(end.Index, true).ToUpper(); return(!Char.IsWhiteSpace(Text.GetPreviousChar(end.Index)) && ((previousWord == "ЯНДЕКС") || (previousWord == "YANDEX")) && Char.IsLetter(Text.GetNextChar(end.End - 1))); } return(false); }
/// <summary> /// Фильтрация позиций концов предложений, идущих подряд /// </summary> public void FilterPositionsInSuccesion() { for (int i = 1; i < _sentenceEndPositions.Count; ++i) { PotencialSentenceEnd current = _sentenceEndPositions[i]; PotencialSentenceEnd previous = _sentenceEndPositions[i - 1]; if (string.IsNullOrEmpty(Text.Substring(previous.End, current.Index - previous.End).Trim())) { --i; _sentenceEndPositions.RemoveAt(i); } } }
/// <summary> /// Проверка, что заданный потенциальный конец предложения является многоточием в математическом выражении /// </summary> /// <param name="end">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsMathematicalSuspensionPoint(PotencialSentenceEnd end) { string value = Text.Substring(end.Index, end.End - end.Index); if ((value == "...") || (value == "…")) { char previousChar = Text.GetPreviousCharAfterSpace(end.Index); if (Char.IsDigit(previousChar) || previousChar.EqualsAny(',', '+', '*', '-', '=', '±', '≥', '≤')) { return(true); } } return(false); }
/// <summary> /// Выделение предложений из текста параграфа /// </summary> /// <param name="text">текст параграфа</param> /// <param name="isBlogText">флаг, что парсится блоговский текст</param> /// <returns>список предложений</returns> public List <Sentence> Select(string paragraph, bool isBlogText) { var paragraphMap = new ParagraphMap(_tokenSelector, paragraph, PotencialSentenceEnd.Select(paragraph)); Filter(paragraphMap); var sentenceEnds = paragraphMap.SentenceEndPositions().ToList(); if (isBlogText) { sentenceEnds = sentenceEnds .Union(_tokenSelector.SelectTokens(paragraph, TokenType.Smile).Select(_ => new PotencialSentenceEnd(_.Index, _.Index + _.Length))) .OrderBy(_ => _.Index) .ToList(); } return(CreateSentences(paragraphMap.Text, sentenceEnds)); }
/// <summary> /// Проверка, что заданный потенциальный конец предложения является точкой при инициале /// </summary> /// <param name="end">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsInitialPoint(PotencialSentenceEnd end) { string initial; if (IsPoint(end) && GetWordWithFirstUpperLetterBeforePoint(end.Index, MaxInitalLength, out initial)) { bool isDegree = IsDegree(end.Index, Text.GetWordBeforeCurrentPosition(end.Index, true)); bool isInterjection = _tokenSelector.Dictionaries.GetDictionaryElements(DictionaryType.Interjections).Contains(initial); char nextChar = Text.GetNextCharAfterSpace(end.End - 1); if (!isInterjection && !(IsRomanNumber(initial) && RussianUpperAlphabet.Contains(nextChar)) && !(isDegree && Char.IsUpper(nextChar))) { _initialPoints.Add(end.Index); return(true); } } return(false); }
/// <summary> /// Проверка, что заданный потенциальный конец предложения является точкой при домене /// </summary> /// <param name="end">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsDomenPoint(PotencialSentenceEnd end) { if (IsPoint(end)) { string previousWord = Text.GetWordBeforeCurrentPosition(end.Index, true); string nextWord = Text.GetWordAfterCurrentPosition(end.Index, true); Register previousWordRegister = GetWordRegister(previousWord); Register nextWordRegister = GetWordRegister(nextWord); if (IsPointCloseToPreviousWord(end.Index, previousWord) && IsPointCloseToNextWord(end.End, nextWord) && (previousWordRegister == nextWordRegister) && (nextWordRegister != Register.Mixed) && _tokenSelector.Dictionaries.GetDictionaryElements(DictionaryType.Domens).Contains(nextWord.ToLower())) { return(true); } } return(false); }
/// <summary> /// Проверка, что заданный поетнциальный конец предложения - точка /// </summary> /// <param name="potencialSentenceEnd">потенциальный конец предложения</param> /// <returns>результат проверки</returns> private bool IsPoint(PotencialSentenceEnd potencialSentenceEnd) { return((potencialSentenceEnd.End - potencialSentenceEnd.Index == 1) && Text[potencialSentenceEnd.Index].IsPoint()); }
/// <summary> /// Проверка, что параграф заканчивается на потенциальный конец предложения /// </summary> /// <param name="paragraph">параграф</param> /// <returns>результат проверки</returns> private bool IsPotencialParagraphEnd(Paragraph paragraph) { return(PotencialSentenceEnd.Select(paragraph.Text.Trim().LastOrDefault().ToString()).Any()); }