Exemplo n.º 1
0
bool CRusSentence::CheckCoordinationOfNounAndParticiple(const CSynHomonym& Participle, const CClause* pClause, size_t NounWordNo, size_t NounHomonymNo) const
{
	const CSynHomonym& Noun  = m_Words[NounWordNo].GetSynHomonym(NounHomonymNo);
	
	// мальчик, ушедший домой, пришел
	if(	 GetRusGramTab()->GleicheGenderNumberCase(Noun.m_CommonGramCode.c_str(), Noun.GetGramCodes().c_str(), Participle.GetGramCodes().c_str()) )
		return true;

	// мальчик и девочка, ушедшие домой, пришли
	CSVI Dummy;
	if (	(pClause->IsInThisGroup(NounWordNo, SIMILAR_NOUN_GROUPS, Dummy) != NULL)
		&&  GetRusGramTab()->GleicheCase(Participle.GetGramCodes().c_str(), Noun.GetGramCodes().c_str())
	   )
	   return true;

	//Два дома ,построенных на холме, постепенно разрушались.
	const CGroup*  pNumerNounGroup =  pClause->IsInThisGroup(NounWordNo, NUMERAL_NOUN, Dummy);
	if (	( pNumerNounGroup != NULL) 
		&&  ( pNumerNounGroup->GetGrammems() & _QM(rNominativ) )
		&&  ( Participle.HasGrammem(rGenitiv) )
		&&  ( Participle.HasGrammem(rPlural) )
	   )
	   return true;
					 
	return false;
};
Exemplo n.º 2
0
CSynWord CreateDash(CSentence* pSent)
{
	CSynWord W (pSent);
	CSynHomonym NewDashHom (pSent);
	NewDashHom.SetLemma("-");

    W.SetWordStr("-", pSent->GetOpt()->m_Language);
	W.m_bDash = true;
	W.AddDes(OPun);
    W.AddDes(OHyp);
	W.m_bArtificialCreated = true;
	W.m_Homonyms.push_back(NewDashHom);
	return W;
};
Exemplo n.º 3
0
bool CRusSentence::IsAdjDeclination (const CSynHomonym& H) const
{
	if (!H.IsMorphNoun()) return false;
	if (H.m_strLemma.length() < 3)  return false;
	if (H.m_lPradigmID == -1) return false;
	string suffix = H.m_strLemma.substr(H.m_strLemma.length()-2);
	bool bMasc = (suffix == "»…") ||  (suffix == "џ…");
	bool bFem = (suffix == "јя") ||  (suffix == "яя");
	if (!bMasc && !bFem) return false;

	CFormInfo Info;
	GetOpt()->GetLemmatizer()->CreateParadigmFromID(H.m_lPradigmID, Info);
	for (long k=0; k < Info.GetCount(); k++)
	{
		string Ancode = Info.GetAncode(k);
		QWORD  g = GetRusGramTab()->GetAllGrammems(Ancode.c_str());
		if (  g & _QM(rSingular) )
			if ( g & _QM(rGenitiv) )
			{
				string Form = Info.GetWordForm(k);
				int l = Form.length();
				if (l < 3) return false;
				if (bMasc)
					return		(Form.substr(l-3) == "≈√ќ")
							||	(Form.substr(l-3) == "ќ√ќ");
				else
					return		(Form.substr(l-2) == "ќ…")
							||	(Form.substr(l-2) == "≈…");
			};
	};
	return false;		
};
Exemplo n.º 4
0
void CRusSentence::InitHomonymMorphInfo (CSynHomonym& H)
{

    H.InitAncodePattern( );
	
	//сравнение со словниками
	H.m_bMonth = GetOpt()->GetGramTab()->is_month(H.m_strLemma.c_str());
	H.m_bAdvAdj = H.CompareWithPredefinedWords(*(GetOpt()->AdvAdj));
	H.m_bCanSynDependOnAdj = H.CompareWithPredefinedWords(*(GetOpt()->SynDependOnAdj));
	H.m_bCanSynDependOnAdv = H.CompareWithPredefinedWords(*(GetOpt()->SynDependOnAdv));
	H.m_bCanSubdueInfinitive = H.CompareWithPredefinedWords(*(GetOpt()->VerbsThatCanSubdueInfinitive));
	H.m_bCanSubdueInstr = H.CompareWithPredefinedWords(*(GetOpt()->m_pVerbsWithInstrObj));
	H.m_bNounHasAdjectiveDeclination = IsAdjDeclination(H);

	
	
};
Exemplo n.º 5
0
void InitSmallNumberSlot(CSynHomonym& H, const CLemWord* pWord)
{
	int iLen = pWord->m_strWord.length();
	assert(iLen > 0);
    H.m_bSmallNumber =    pWord->HasDes(ODigits)
	                  && (    pWord->m_strWord[iLen - 1] == '2' 
					       || pWord->m_strWord[iLen - 1] == '3'
						   || pWord->m_strWord[iLen - 1] == '4')
						   && FindFloatingPoint(pWord->m_strWord.c_str()) == -1;
	H.m_bRussianOdin =	 pWord->HasDes(ODigits)
					&&	pWord->m_strWord[iLen - 1] == '1'
					//  может заканчиватьс¤ на 01, 21,31,41,51,61,71,81,91, но не на 11
					&&	(		(iLen == 1) 
							||	(pWord->m_strWord[iLen - 2] != '1')
						)
						&& FindFloatingPoint(pWord->m_strWord.c_str()) == -1;

	//if( pWord->HasDes(ODigits) && (iLen == 1) && ( pWord->m_strWord[0] == '1') )
	//{
	//	H.m_GramCodes = "йайбйвйгйдйейжйзйийййкйлймйнйойпйрйс";
 //       H.InitAncodePattern( );
	//	
	//}

	if( (iLen > 1) && pWord->HasDes(ODigits) )
		if(pWord->m_strWord[iLen - 2] == '1')
			H.m_bSmallNumber = false;

	if( !pWord->HasDes(ODigits ))
	{
		for (long  i=0; i<SmallNumbersCount; i++)
		  if (	H.IsLemma(SmallNumbers[i]) // m_strLemma может быть равна "один-два",
			  || (   (H.m_strLemma.find('-') != string::npos) // например, "один-два дн¤", тогда надо сравнивать с последним числительным
				  && (strlen(SmallNumbers[i]) < H.m_strLemma.length())
				  && (SmallNumbers[i] == H.m_strLemma.substr(H.m_strLemma.find('-') + 1))
				 )
			  )
		  {
				H.m_bSmallNumber = true;
		  };
	};

	if( (H.m_strLemma=="ќƒ»Ќ") &&  H.GetGramCodes()[0] == 'э'/*(m_iPoses & (1 << NUMERAL))*/)
		H.m_bRussianOdin = true;
}
Exemplo n.º 6
0
bool	CRusSentence::CanBeRelativeAntecedent(const CSynHomonym& H) const
{
    return			H.IsMorphNoun();
};