TIntrusivePtr<CFactsWS> CSitFactInterpretation::Interpret(const SValenciesValues& valValues) { if (valValues.m_values.size() == 0) return NULL; TIntrusivePtr<CFactsWS> factWS(new CFactsWS()); factWS->PutAuxArticle(valValues.m_DictIndex); SWordHomonymNum val; for (size_t i = 0; i < valValues.m_values.size(); i++) { const SValencyValue& value = valValues.m_values[i]; const or_valencie_list_t& valencie = valValues.m_pArt->get_subordination(valValues.m_iSubord)[value.m_iVal]; for (size_t j = 0; j < valencie.m_interpretations.size(); j++) { const fact_field_reference_t& fact_field = valencie.m_interpretations[j]; FillDefaultFieldValue(fact_field, factWS->m_Facts, value.m_Value); FillFactField(fact_field, value.m_Value, factWS->m_Facts); val = value.m_Value; } } if (!val.IsValid()) return NULL; const CWord& w = m_Words.GetWord(val); CheckNecessaryFields(factWS->m_Facts, w.GetSourcePair()); if (factWS->GetFactsCount() == 0) return NULL; else return factWS; }
bool CQuotesFinder::CreateQuoteSubjectAsFio(SWordHomonymNum Subj, CSentenceRusProcessor* pSent, CFactFields& factFields) { if (!Subj.IsValid()) return false; const CHomonym& h = pSent->m_Words[Subj]; const CFioWordSequence* pFioWS = dynamic_cast<const CFioWordSequence*>(h.GetSourceWordSequence()); // если это не фио - пропускаем if (pFioWS != NULL) { CFioWS newFioWS(*pFioWS); newFioWS.SetMainWord(Subj); factFields.AddValue(CFactFields::Fio, newFioWS); return true; } else { const CFactsWS* pFactWS = dynamic_cast<const CFactsWS*>(h.GetSourceWordSequence()); if (pFactWS) for (int i=0; i < pFactWS->GetFactsCount(); i++) { const CFactFields& f = pFactWS->GetFact(i); const CFioWS* FioWS = f.GetFioValue(CFactFields::Fio); if (FioWS != 0) { factFields.AddValue(CFactFields::Fio, *FioWS); return true; } }; } return false; }
// функция добавляет факт цитирования во множество фактов, // на вход приходит ситуация цитирования (VerbCommunic), из которой берется субъект цитирования, // и QuoteStr - содержимое цитаты void CQuotesFinder::AddSimpleQuoteFact(const SValenciesValues& VerbCommunic, CSentenceRusProcessor* pSent, const Wtroka& QuoteStr, SLeadInfo LeadInfo) { DECLARE_STATIC_RUS_WORD(kOB, "ОБ"); DECLARE_STATIC_RUS_WORD(kSUB, "СУБ"); DECLARE_STATIC_RUS_WORD(kPO_SLOVAM, "ПО_СЛОВАМ"); CFactFields factFields("Quotes"); factFields.m_LeadInfo = LeadInfo; Wtroka ObjStr; { SWordHomonymNum Obj = VerbCommunic.GetValue(kOB); if (Obj.IsValid()) { const CHomonym& h = pSent->m_Words[Obj]; ObjStr = h.GetLemma(); } // фунция берет из ситуации VerbCommunic валентность СУБ и пытается построить по ней строку, // если это не выходит, выходим SWordHomonymNum Subj = VerbCommunic.GetValue(kSUB); if (!Subj.IsValid()) return; else CreateTextField("Fio",pSent,Subj, factFields, Wtroka()); } { SWordHomonymNum Predic = VerbCommunic.m_NodeWH; if (!Predic.IsValid()) Predic = VerbCommunic.GetValue(kPO_SLOVAM); if (Predic.IsValid()) CreateTextField("QuotePredicate", pSent, Predic, factFields, ObjStr); } if (!CreateQuoteValue(QuoteStr, factFields)) return; CFactsWS* factWS = new CFactsWS(); factWS->SetPair(0,0); factWS->PutArticle(m_MainArticle); factWS->AddFact(factFields); pSent->GetWordSequences().push_back(factWS); };
void CSentence::AddFIO(yset<Wtroka>& fioStrings, const CFIOOccurenceInText& wordsPairInText, bool bIndexed) { SWordHomonymNum num; if (wordsPairInText.m_NameMembers[Surname].IsValid()) num = wordsPairInText.m_NameMembers[Surname]; else if (wordsPairInText.m_NameMembers[FirstName].IsValid()) num = wordsPairInText.m_NameMembers[FirstName]; else if (wordsPairInText.m_NameMembers[Patronomyc].IsValid()) num = wordsPairInText.m_NameMembers[Patronomyc]; else if (wordsPairInText.m_NameMembers[InitialName].IsValid()) num = wordsPairInText.m_NameMembers[InitialName]; if (num.IsValid()) m_Words.GetWord(num).AddFio(fioStrings, bIndexed); }
void CSentence::AddFIOWS(const CFIOOccurence& fioOccurence, const SFullFIO& fio, int iSimilarOccurencesCount) { TIntrusivePtr<CFioWordSequence> fioWS(new CFioWordSequence(fio)); *(CFIOOccurence*)(fioWS.Get()) = fioOccurence; fioWS->PutWSType(FioWS); if (fio.m_Genders.any()) { THomonymGrammems gram = fioWS->GetGrammems(); gram.Replace(NSpike::AllGenders, fio.m_Genders); fioWS->SetGrammems(gram); } fioWS->m_iSimilarOccurencesCount = iSimilarOccurencesCount; bool isManualFio = true; SWordHomonymNum wh = fioOccurence.m_NameMembers[Surname]; if (wh.IsValid()) if (m_Words.GetWord(wh).IsMultiWord()) isManualFio = false; if (!fio.m_bFoundSurname && fioOccurence.m_NameMembers[Surname].IsValid() && !(fioOccurence.m_NameMembers[FirstName].IsValid() || fioOccurence.m_NameMembers[InitialName].IsValid()) && isManualFio) { CNameFinder nameFinder(m_Words); //если не смогли среди предсказанных фамилий //найти совпадающую с фамилией из fio, то вываливаемся if (!nameFinder.PredictSingleSurname(*fioWS, fio)) return; } fioWS->ClearLemmas(); if (!fio.m_strSurname.empty()) { Wtroka capLemma; if (fioOccurence.m_NameMembers[Surname].IsValid()) { const CWord& w = m_Words.GetWord(fioOccurence.m_NameMembers[Surname]); capLemma = GetCapitalizedLemma(w, -1, fio.m_strSurname); } else { capLemma = fio.m_strSurname; NStr::ToFirstUpper(capLemma); } fioWS->AddLemma(SWordSequenceLemma(fio.m_strSurname, capLemma)); } if (!fio.m_strName.empty()) { Wtroka capLemma; if (fioOccurence.m_NameMembers[FirstName].IsValid()) { const CWord& w = m_Words.GetWord(fioOccurence.m_NameMembers[FirstName]); capLemma = GetCapitalizedLemma(w, -1, fio.m_strName); } else if (fioOccurence.m_NameMembers[InitialName].IsValid()) { const CWord& w = m_Words.GetWord(fioOccurence.m_NameMembers[InitialName]); capLemma = GetCapitalizedLemma(w, -1, fio.m_strName); } else { capLemma = fio.m_strName; TMorph::ToTitle(capLemma); } fioWS->AddLemma(SWordSequenceLemma(fio.m_strName, capLemma)); } if (!fio.m_strPatronomyc.empty()) { Wtroka capLemma; if (fioOccurence.m_NameMembers[Patronomyc].IsValid()) { const CWord& w = m_Words.GetWord(fioOccurence.m_NameMembers[Patronomyc]); capLemma = GetCapitalizedLemma(w, -1, fio.m_strPatronomyc); } else if (fioOccurence.m_NameMembers[InitialPatronomyc].IsValid()) { const CWord& w = m_Words.GetWord(fioOccurence.m_NameMembers[InitialPatronomyc]); capLemma = GetCapitalizedLemma(w, -1, fio.m_strPatronomyc); } else { capLemma = fio.m_strPatronomyc; TMorph::ToTitle(capLemma); } fioWS->AddLemma(SWordSequenceLemma(fio.m_strPatronomyc, capLemma)); } TakeFioWS(fioWS); }
SWordHomonymNum CMultiWordCreator::AddMultiWordInt(CWordSequence* ws, bool takeOnwership, const TGramBitSet& newPos, const CWordsPair& searchAreaWP) { SWordHomonymNum wh = ws->GetMainWord(); Wtroka stmp; SWordHomonymNum newWH; CWord* pNewWord = GetWordForMultiWord(*ws, stmp, newWH); pNewWord->m_SourceWords.SetPair(ws->FirstWord(), ws->LastWord()); TGramBitSet art_grammems; // output grammems of article Wtroka article_title; TKeyWordType article_type = NULL; if (ws->HasGztArticle()) { const TGztArticle& gzt_article = ws->GetGztArticle(); article_title = gzt_article.GetTitle(); article_type = gzt_article.GetType(); const NGzt::TMessage* lemma = gzt_article.GetLemmaInfo(); if (lemma != NULL) art_grammems = gzt_article.GetLemmaOutputGrammems(*lemma); } else if (ws->HasAuxArticle()) { const article_t* pArt = GlobalDictsHolder->GetAuxArticle(ws->GetAuxArticleIndex()); art_grammems = pArt->get_new_pos(); article_title = pArt->get_title(); article_type = pArt->get_kw_type(); } THomonymGrammems newGram; if (!ws->GetGrammems().Empty()) { newGram = ws->GetGrammems(); if (!newGram.HasForms() && wh.IsValid()) newGram.SetPOS(m_Words[wh].Grammems.GetPOS()); } else if (wh.IsValid() && HasToAddGrammemsFromMainWord(*ws)) newGram = m_Words[wh].Grammems; MergeGrammems(newGram, art_grammems, newPos); THomonymPtr pNewHom; if (pNewWord->IsMultiWord() && (pNewWord->GetSourcePair().Size() != 1 || !wh.IsValid())) { newWH.m_HomNum = FindOrMakeMultiwordHomonym(*ws, *pNewWord, article_type, newGram, pNewHom); YASSERT(newWH.IsValid()); } if (pNewHom.Get() == NULL) { if (!pNewWord->IsMultiWord()) { if (wh.IsValid()) newWH = wh; else { // just take the first homonym newWH.m_bOriginalWord = true; newWH.m_WordNum = pNewWord->GetSourcePair().FirstWord(); newWH.m_HomNum = pNewWord->IterHomonyms().GetID(); } } YASSERT(newWH.IsValid()); //часто бывает ситуация, когда мы вынуждены клонировать абсолютно одинаковые //омонимы, различающиеся только приписанными статьями из aux_dic, //в случае с geo_thesaurus.cxx это чревато порождением огромного количества омонимов //(боле 50 для "Петров"), тогда если статьи не отличаются друг от друга полем СОСТАВ //приписываемыми граммемами, ЧР и KWType, то мы омонимы не клонируем а дополнительные статьи //записываем в CHomonym::m_KWtype2Articles. Это происходит в CWord::PutArticleIndex. //если мы считаем, что найденные статьи для одного и того же омонима ничем не отличаются, //то главное слово для неотличающихся стаей у ws одно и то же и ему приписана //первая попавшаяся среди неразличимы статья //например статьи "_петрова_2" и "_петрова_3" для нас одинаковы (отличаются только ГЕО_ЧАСТЬ //а это неважно для парсера) и незачем плодить омонимы bool bCloneAnyway = (!newGram.Empty() && !(m_Words[newWH].Grammems == newGram)) || !GlobalDictsHolder->BuiltinKWTypes().IsGeo(article_type); if (ws->HasAuxArticle()) newWH.m_HomNum = m_Words.GetWord(newWH).PutAuxArticle(newWH.m_HomNum, ws->GetAuxArticleIndex(), bCloneAnyway); else newWH.m_HomNum = m_Words.GetWord(newWH).PutGztArticle(newWH.m_HomNum, ws->GetGztArticle(), bCloneAnyway); } YASSERT(newWH.IsValid()); AddFoundArticle(article_type, article_title, newWH, searchAreaWP); CHomonym& h = m_Words[newWH]; h.SetSourceWordSequence(ws); if (!newGram.Empty()) h.SetGrammems(newGram); if (takeOnwership) { if (!ws->HasLemmas()) NormalizeMultiWordHomonym(pNewWord, &h); m_wordSequences.push_back(ws); } return newWH; }