示例#1
0
        /// <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))));
        }
示例#2
0
 /// <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);
 }
示例#3
0
 /// <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);
         }
     }
 }
示例#4
0
        /// <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));
        }
示例#6
0
        /// <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);
        }
示例#7
0
 /// <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);
 }
示例#8
0
 /// <summary>
 /// Проверка, что заданный поетнциальный конец предложения - точка
 /// </summary>
 /// <param name="potencialSentenceEnd">потенциальный конец предложения</param>
 /// <returns>результат проверки</returns>
 private bool IsPoint(PotencialSentenceEnd potencialSentenceEnd)
 {
     return((potencialSentenceEnd.End - potencialSentenceEnd.Index == 1) && Text[potencialSentenceEnd.Index].IsPoint());
 }
示例#9
0
 /// <summary>
 /// Проверка, что параграф заканчивается на потенциальный конец предложения
 /// </summary>
 /// <param name="paragraph">параграф</param>
 /// <returns>результат проверки</returns>
 private bool IsPotencialParagraphEnd(Paragraph paragraph)
 {
     return(PotencialSentenceEnd.Select(paragraph.Text.Trim().LastOrDefault().ToString()).Any());
 }