Example #1
0
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;
};
Example #2
0
File: Fio.cpp Project: eamosov/lspl
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);

};
Example #3
0
File: Fio.cpp Project: eamosov/lspl
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;

};