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;
}
Beispiel #2
0
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);
}
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);
};
Beispiel #5
0
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;
}