bool CQuotesFinder::CreateQuoteValue(const Wtroka& quoteStr, CFactFields& factFields) const { DECLARE_STATIC_RUS_WORD(kChto, "что "); DECLARE_STATIC_RUS_WORD(kChtoby, "чтобы "); Wtroka qstr = quoteStr; CTextWS QuoteWS; if (qstr.has_prefix(kChto)) qstr.erase(0,4); if (qstr.has_prefix(kChtoby)) qstr.erase(0,6); if (qstr.empty()) return false; qstr = StripString(qstr); if (qstr.size() > 1 && qstr[0] =='"' && qstr.back() =='"') qstr = qstr.substr(1, qstr.size() - 2); qstr = StripString(qstr); QuoteWS.AddLemma(SWordSequenceLemma(qstr)); QuoteWS.SetArtificialPair(CWordsPair(0,0)); factFields.AddValue(CFactFields::QuoteValue, QuoteWS); return true; }
// ищет закрывающую кавычку в текущем или последующем предложениях, // добавляет все слова до закрывающей кавычки к ResultToAdd // игнорируем внутренние кавычки bool CQuotesFinder::FindCloseQuoteInNextSentences(int StartSentNo, int StartWordForFirstSentence, Wtroka& ResultToAdd, yvector<SFactAddress>& FioInQuotes, SLeadInfo& LeadInfo) { Wtroka Add; yvector<SFactAddress> AddFioInQuotes; int Depth = 1; for (int SentNo=StartSentNo; (SentNo-StartSentNo<=2)&& (SentNo< (int)m_vecSentence.size()); SentNo++) { CSentenceRusProcessor* pSent = GetSentPrc(SentNo); yset<int> QuoteWords; int k=0; if (SentNo == StartSentNo) k = StartWordForFirstSentence; for (; k < (int)pSent->getWordsCount(); k++) { const CWord& w = *pSent->getWordRus(k); Add += w.GetOriginalText() + ' '; QuoteWords.insert(k); bool bHasCloseQuote = false; if (w.HasOpenQuote()) { if (ispunct(w.GetText()[0])) { Depth--; // одиночную кавычку знака препинания считаем закр. кавычкой (кто-то по ошибке поставил пробел) bHasCloseQuote = true;; } else Depth++; } if (w.HasCloseQuote()) { Depth--; if ((Depth == 1) // Закрывающая кавычка в конце предложения закрывает все открытые кавычки. && ((k+1 == (int)pSent->getWordsCount()) || ((k+2 == (int)pSent->getWordsCount()) && pSent->getWordRus(k+1)->IsPunct() ) ) ) { Depth = 0; } bHasCloseQuote = true; } if (w.GetText() == Wtroka::FromAscii("\"")) { if (k+1 == (int)pSent->getWordsCount() || pSent->getWordRus(k+1)->IsPunct()) { bHasCloseQuote = true; Depth--; } } if (bHasCloseQuote && Depth == 0) { if (!Add.empty() && Add[0] == '-') { const wchar16* beg = Add.begin() + 1; StripRangeBegin(beg, Add.end()); Add.assign(beg, Add.end() - beg); } if (ResultToAdd.back() == ',' && Add.size() > 0 && NStr::IsLangAlpha(Add[0], TMorph::GetMainLanguage()) && ::IsUpper(Add[0])) { ResultToAdd.erase(ResultToAdd.size() - 1); ResultToAdd += CharToWide(". "); } ResultToAdd += Add; AddFios(SentNo, QuoteWords, AddFioInQuotes); FioInQuotes.insert(FioInQuotes.end(), AddFioInQuotes.begin(), AddFioInQuotes.end()); LeadInfo.m_iLastSent = SentNo; return true; } } AddFios(SentNo, QuoteWords, AddFioInQuotes); } return false; }