bool CRusSemStructure::GetClauseVariantCombination() { vector<VectorLong> Parents; Parents.resize(m_piSent->GetPrimitiveClausesCount()); m_AllClausesVariants = 0; for (long i=0; i < Parents.size(); i++) { for (long k=0; k < m_piSent->GetPrimitiveClause(i)->m_SynVariants.size(); k++) { Parents[i].push_back(k); m_AllClausesVariants++; } }; VectorLong V; // текущий вариант V.resize(Parents.size()); vector<VectorLong> Variants; GetCommonVariants(Parents, V, Variants, 0); //GetClauseVariantCombinations(Variants); if (m_ClauseVariantsCombinationNo >= Variants.size()) return false; m_Clauses.clear(); m_Clauses.resize(m_piSent->GetPrimitiveClausesCount()); for (long i=0; i < m_Clauses.size(); i++) { const CClause* pClause = m_piSent->GetPrimitiveClause(i); m_Clauses[i].m_ClauseVariantNo = Variants[m_ClauseVariantsCombinationNo][i]; CSVI pSynVar = pClause->GetSynVariantByNo(m_Clauses[i].m_ClauseVariantNo); int RootNo = pSynVar->m_ClauseTypeNo; if (RootNo != -1) { m_Clauses[i].m_ClauseType = pClause->m_vectorTypes[RootNo].m_Type; m_Clauses[i].m_RootWordNo = pClause->m_vectorTypes[RootNo].m_Root.m_WordNo; } else { m_Clauses[i].m_ClauseType = UnknownSyntaxElement; m_Clauses[i].m_RootWordNo = -1; } m_Clauses[i].m_SyntaxClauseNo = i; m_Clauses[i].m_SubjectWordNo = -1; if (!pSynVar->m_Subjects.empty()) m_Clauses[i].m_SubjectWordNo = pSynVar->m_Subjects[0]; m_Clauses[i].m_PredicateWordNo = pSynVar->m_iPredk; }; rml_TRACE ("Номер набора синтаксических вариантов клаузы %i (из %i)\n", m_ClauseVariantsCombinationNo+1, Variants.size()); m_ClauseCombinationVariantsCount = Variants.size(); m_Nodes.clear(); return true; };
static void GetCommonVariants(const vector<SmallHomonymsVec>& Parents, SmallHomonymsVec& V, vector<SmallHomonymsVec>& Variants, long Position) { if (Variants.size() > 1000) return; if (Position < V.size()) for (long i=0; i< Parents[Position].size(); i++) { V.m_Items[Position] = Parents[Position].m_Items[i]; GetCommonVariants(Parents, V, Variants, Position+1); } else Variants.push_back(V); };
bool CMAPost::SetFioFormat (const CFIOFormat* Format, CLineIter it) { vector<SmallHomonymsVec> Hypots; SmallWordsVec FioWords; Hypots.resize(Format->m_Items.size()); int CountOfVariants = 1; for (long ItemNo = 0; ItemNo < Format->m_Items.size() && it != m_Words.end(); ItemNo++, it=NextNotSpace(it)) { FioWords.Add(it); CPostLemWord& W = *it; for (int HomNo=0; HomNo < W.GetHomonymsCount(); HomNo++) { CHomonym* pH = W.GetHomonym(HomNo); // иначе "“.≈. ќ“ ј«ј“№—я" будет ‘»ќ if (IsPartOfNonSingleOborot(pH)) return false; if (IsPartFio(*this, Format->m_Items[ItemNo], W, pH)) Hypots[ItemNo].Add(pH); }; if ( Hypots[ItemNo].empty() ) return false; CountOfVariants *= Hypots[ItemNo].size(); }; if (FioWords.size() != Format->m_Items.size()) return false; // не достроилось SmallHomonymsVec V; // текущий вариант vector<SmallHomonymsVec> Variants; Variants.reserve(CountOfVariants); V.m_ItemsCount = Hypots.size(); GetCommonVariants(Hypots, V, Variants, 0); if (Format->m_GleicheCase) for (long VarNo=0; VarNo < Variants.size(); VarNo++) { QWORD Grammems = rAllCases | rAllNumbers; for (long i=0; i < Variants[VarNo].size(); i++) { Grammems &= Variants[VarNo].m_Items[i]->m_iGrammems; }; if ((Grammems & rAllCases) == 0 || (Grammems & rAllNumbers) == 0 ) { Variants.erase(Variants.begin()+VarNo); VarNo--; }; }; if (Variants.empty()) return false; for (size_t i=0; i <FioWords.size(); i++) { CPostLemWord& W = *FioWords[i]; CHomonym* pH = Variants[0].m_Items[i]; W.SetHomonymsDel(true); pH->m_bDelete = false; pH->DeleteOborotMarks(); // удал¤ем однословные оборотыб (многословных там быть не может) W.DeleteMarkedHomonymsBeforeClauses(); if (W.HasDes(OSentEnd)) { /* если ‘»ќ содержало конец предложени¤, а после ‘»ќ нет ни одной пометы конца предложени¤, тогда надо поставить SENT_END на последнюю строчку ‘»ќ. */ W.DelDes(OSentEnd); if ( W.m_strWord!="." ) FioWords.back()->AddDes(OSentEnd); } } // ставим графем. пометы FioWords[0]->AddDes(OFAM1); FioWords.back()->AddDes(OFAM2); return true; };