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; };
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; };
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; };
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); };
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; }
bool CRusSentence::CanBeRelativeAntecedent(const CSynHomonym& H) const { return H.IsMorphNoun(); };