bool CSentence::GetWSLemmaString(Wtroka& sLemmas, const CWordSequence& ws, bool bLem) const { sLemmas = ws.GetCapitalizedLemma(); if (bLem) return !sLemmas.empty(); if (sLemmas.empty()) for (int j = ws.FirstWord(); j <= ws.LastWord(); j++) { if (!sLemmas.empty()) sLemmas += ' '; sLemmas += getWord(j)->GetOriginalText(); } static const Wtroka trim_chars = CharToWide(" \"\'"); TWtringBuf res = sLemmas; while (!res.empty() && trim_chars.find(res[0]) != TWtringBuf::npos) res.Skip(1); while (!res.empty() && trim_chars.find(res.back()) != TWtringBuf::npos) res.Chop(1); if (sLemmas.size() != res.size()) sLemmas = ::ToWtring(res); return true; }
bool CWord::RightPartIsSurname(int& iH, THomonymGrammems& grammems, Wtroka& strLemma) { iH = HasMorphNounWithGrammems_i(TGramBitSet(gSurname)); if (iH != -1) { CHomonym& h = GetRusHomonym(iH); grammems = h.Grammems; strLemma = h.GetLemma(); size_t ii = strLemma.find('-'); YASSERT(ii != Wtroka::npos); strLemma = strLemma.substr(ii + 1); return true; } //if this word is in morphology - do not try to predict if (IsDictionary()) return false; size_t ii = m_txt.find('-'); if (ii == Wtroka::npos) return false; Wtroka strRightPart = m_txt.substr(ii + 1); TMorph::ToLower(strRightPart); yvector<TSurnamePredictor::TPredictedSurname> out; if (!TMorph::PredictSurname(strRightPart, out)) return false; TGrammarBunch newForms; NSpike::ToGrammarBunch(out[0].StemGrammar, out[0].FlexGrammars, newForms); grammems.Reset(newForms); strLemma = out[0].Lemma; return true; }
// обычно функция возвращает clause->ToString(), // если в клаузе есть открывающая кавычка, а нет закрывающей, тогда функция добавляет к результату // все слова до закрывающей кавычки Wtroka CQuotesFinder::FindRightQuoteIfHas(const CWordsPair& PeriodToPrint, int SentNo, const CWordsPair& GroupToExclude, yvector<SFactAddress>& FioInQuotes) { FioInQuotes.clear(); CSentenceRusProcessor* pSentPrc = GetSentPrc(SentNo); yset<int> QuoteWords; Wtroka ClauseStr; static const Wtroka COMMA = Wtroka::FromAscii(","); for (int i = PeriodToPrint.FirstWord(); i <= PeriodToPrint.LastWord(); i++) { const CWord& w = pSentPrc->m_Words.GetOriginalWord(i); if (!GroupToExclude.Contains(i) && !(GroupToExclude.Contains(i - 1) && w.GetText() == COMMA) && !(GroupToExclude.Contains(i + 1) && w.GetText() == COMMA)) { ClauseStr += w.GetOriginalText() + ' '; QuoteWords.insert(i); } } size_t index = ClauseStr.find('"'); if (index != Wtroka::npos && ClauseStr.rfind('"') == index) { yset<int> AddQuoteWords; Wtroka Add; // если только одна кавычка, то пойдем искать вторую кавычку int i; for (i = PeriodToPrint.LastWord()+1; i < (int)pSentPrc->getWordsCount(); i++) { const CWord& w = pSentPrc->m_Words.GetOriginalWord(i); if (!GroupToExclude.Contains(i)) { Add += w.GetOriginalText() + ' '; AddQuoteWords.insert(i); } if (w.HasCloseQuote()) break; } if (i != (int)pSentPrc->getWordsCount()) { ClauseStr += ' '; ClauseStr += Add; QuoteWords.insert(AddQuoteWords.begin(), AddQuoteWords.end()); } } AddFios(SentNo, QuoteWords, FioInQuotes); return ClauseStr; };