#include "StdGramtab.h" // ========== This file is under LGPL, the GNU Lesser General Public Licence // ========== Dialing Lemmatizer (www.aot.ru) // ========== Copyright by Alexey Sokirko #include "RusGramTab.h" CRusGramTab :: CRusGramTab() { size_t i=0; for (; i> 8); res[1] = (0xFF & i); res[2] = 0; return res; }; bool CRusGramTab :: IsAdditionalGrammem (const char* s) const { return !strcmp (s, "прч") || !strcmp (s, "дпр") || !strcmp (s, "инф"); }; bool CRusGramTab :: ProcessPOSAndGrammems (const char* tab_str, BYTE& PartOfSpeech, QWORD& grammems) const { if (!CAgramtab::ProcessPOSAndGrammems(tab_str, PartOfSpeech, grammems)) return false; if (PartOfSpeech == VERB) if (strstr (tab_str, "прч")) PartOfSpeech = PARTICIPLE; else if (strstr (tab_str,"дпр")) PartOfSpeech = ADVERB_PARTICIPLE; else if (strstr (tab_str,"инф")) PartOfSpeech = INFINITIVE; // неизменяемые слова как будто принадлежат всем падежам if ( (_QM(rIndeclinable) & grammems) && (PartOfSpeech != PREDK ) ) grammems |= rAllCases; if ( (_QM(rIndeclinable) & grammems) && (PartOfSpeech == PRONOUN_P ) ) grammems |= rAllGenders | rAllNumbers; // слова общего рода ('сирота') могут использованы как // слова м.р., так и как слова ж.р. if (_QM(rMascFem) & grammems) grammems |= _QM(rMasculinum) | _QM(rFeminum); // слово 'пальто' не изменяется по числам, поэтому может // быть использовано в обоих числах if (PartOfSpeech != PREDK ) if ( (_QM(rIndeclinable) & grammems) && !(_QM(rSingular) & grammems)) grammems |= _QM(rPlural) | _QM(rSingular); return true; }; // Стандартное согласование между двумя именами по числу и падежу inline bool CaseNumber (QWORD g1, QWORD g2) { return ((rAllCases & g1 & g2) > 0) && ((rAllNumbers & g1 & g2) > 0) ; }; // Стандартное согласование между двумя именами по падежу, причем первый код должен // иметь граммему множественного числа inline bool CaseFirstPlural (QWORD g1, QWORD g2) { return ( ( (rAllCases & g1 & g2) > 0) && ( ((1< 0) ); }; // Стандартное согласование между двумя именами по роду и числу inline bool GenderNumber(QWORD g1, QWORD g2) { return ((rAllNumbers & g1 & g2) > 0) && ( ((g1 & g2 & _QM(rPlural)) > 0 ) || ((rAllGenders & g1 & g2) > 0) ); } // Стандартное согласование по лицу и числу (для 1 и 2 лица) inline bool PersonNumber(QWORD g1, QWORD g2) { size_t t1 = (rAllNumbers & g1 & g2) > 0; size_t t2 = ((rAllPersons & g1 & g2) > 0); return t1 && t2; } // Стандартное согласование между подлежащим и сказуемым inline bool SubjectPredicate(QWORD subj, QWORD verb) { if( !( subj & _QM(rNominativ)) ) return false; if ( ( ( verb & _QM(rPastTense)) > 0) || ( ( verb & _QM(rShortForm)) > 0) ) { // ты вышел // я вышел // ты был // я красива // мы шли // вы шли if(subj & (_QM(rFirstPerson) | _QM(rSecondPerson))) return (verb & subj & _QM(rPlural) ) || ( (verb & ( _QM(rMasculinum) | _QM(rFeminum) ) ) && (verb & subj & _QM(rSingular) ) ); else // он вышел // поезд ушел // девочка красива // девочки красивы // мальчик красив return GenderNumber(subj,verb); } else if( ( verb & _QM(rPresentTense)) || ( verb & _QM(rFutureTense )) ) { // я выйду // ты выедешь // мы выйдем if ( ( subj & (_QM(rFirstPerson) | _QM(rSecondPerson))) || (verb & (_QM(rFirstPerson) | _QM(rSecondPerson))) ) return PersonNumber(subj, verb); else return (rAllNumbers & subj & verb) > 0; } else if( verb & _QM(rImperative)) return ((subj & _QM(rSecondPerson)) > 0) && ((rAllNumbers & subj & verb) > 0); return false; } // Стандартное согласование между двумя именами по падежу inline bool Case(QWORD g1, QWORD g2) { return ((rAllCases & g1 & g2) > 0); } // Стандартное согласование между существительным и прилашательнымпо роду, числу и падежу, если // если существительное одушевленное bool GenderNumberCaseAnimRussian (QWORD gram_noun, QWORD gram_adj) { return ((rAllCases & gram_noun & gram_adj) > 0) && ((rAllNumbers & gram_noun & gram_adj) > 0) && ( ((_QM(rAnimative) & gram_adj ) > 0) || ((rAllAnimative& gram_adj) == 0) ) && ( ((rAllGenders & gram_noun & gram_adj) > 0) || ((rAllGenders & gram_noun) == 0) || ((rAllGenders & gram_adj) == 0) ); }; // Стандартное согласование между существительным и прилашательнымпо роду, числу и падежу, если // если существительное неодушевленное bool GenderNumberCaseNotAnimRussian (QWORD gram_noun, QWORD gram_adj) { return ((rAllCases & gram_noun & gram_adj) > 0) && ((rAllNumbers & gram_noun & gram_adj) > 0) && ( ((_QM(rNonAnimative) & gram_adj ) > 0) || ((rAllAnimative& gram_adj) == 0) ) && ( ((rAllGenders & gram_noun & gram_adj) > 0) || ((rAllGenders & gram_noun) == 0) || ((rAllGenders & gram_adj) == 0) ); }; // Стандартное согласование между существительным и прилашательнымпо роду, числу и падежу, если // если существительное не неодушевленное и не одушевленное // (для местоимений, например, "все это было хорошо") bool GenderNumberCaseRussian (QWORD gram_noun, QWORD gram_adj) { return ((rAllCases & gram_noun & gram_adj) > 0) && ((rAllNumbers & gram_noun & gram_adj) > 0) && ( ((rAllGenders & gram_noun & gram_adj) > 0) || ((rAllGenders & gram_noun) == 0) || ((rAllGenders & gram_adj) == 0) ); }; /* Примеры работы функции GleicheGenderNumberCase: - красивого стол; - красивых столы; - красивый пирата; - красивые пиратов; - достойных жизни; - достойные матерей; - длинные чудовищ + на этот дом; + красивую маму; + в красивый дом; + в длинное облако; + примерить его цилиндр; + все это */ QWORD CRusGramTab::GleicheGenderNumberCase(const char* common_gram_code_noun, const char* gram_code_noun, const char* gram_code_adj) const { if ( (common_gram_code_noun == 0) || !strcmp(common_gram_code_noun, "??") || (strlen (common_gram_code_noun) == 0) ) // нет сведений об одушевленности return Gleiche(GenderNumberCaseRussian, gram_code_noun, gram_code_adj); else if ((GetLine(s2i(common_gram_code_noun))->m_Grammems&_QM(rNonAnimative)) >0) // неодушевленный return Gleiche(GenderNumberCaseNotAnimRussian, gram_code_noun, gram_code_adj); else if ((GetLine(s2i(common_gram_code_noun))->m_Grammems&_QM(rAnimative)) >0) // одушевленный return Gleiche(GenderNumberCaseAnimRussian, gram_code_noun, gram_code_adj); else // нет сведений об одушевленности return Gleiche(GenderNumberCaseRussian, gram_code_noun, gram_code_adj); } bool CRusGramTab::GleicheCaseNumber(const char* gram_code1, const char* gram_code2) const { return Gleiche(CaseNumber, gram_code1, gram_code2) != 0; } bool CRusGramTab::GleicheGenderNumber(const char* gram_code1, const char* gram_code2) const { return Gleiche(GenderNumber, gram_code1, gram_code2) != 0; } bool CRusGramTab::GleicheSubjectPredicate(const char* gram_code1, const char* gram_code2) const { return Gleiche(SubjectPredicate, gram_code1, gram_code2) != 0; } bool CRusGramTab::GleicheCase(const char* gram_code1, const char* gram_code2) const { return Gleiche(Case, gram_code1, gram_code2) != 0; } const size_t CRusGramTab::GetClauseTypesCount() const { return rClauseTypesCount; }; long CRusGramTab::GetClauseTypeByName(const char* TypeName) const { for(int i = 0 ; i < rClauseTypesCount ; i++ ) { if( !strcmp(rClauseTypes[i], TypeName) ) { return i; } } return -1; } const char* CRusGramTab::GetClauseNameByType(long type) const { if (type >= rClauseTypesCount) return 0; if (type < 0) return 0; return rClauseTypes[type]; } /* истина для предикативных типов клауз. */ bool CRusGramTab::IsStrongClauseRoot(const DWORD Poses) const { return (Poses == (1< StandardParamAbbrLength) return false; for (long i = 0; i < StandardParamAbbrCount; i++) if ( !strcmp(WordStrUpper,StandardParamAbbr[i]) ) return true; return false; } bool CRusGramTab::is_morph_article(int poses) const { return false; }; BYTE CRusGramTab::GetTagId(const char* gram_code) const { BYTE TagId = GetPartOfSpeech(gram_code); switch(TagId) { case ADJ_FULL: { if ( _QM(rShortForm) & GetLine(s2i(gram_code))->m_Grammems ) return ADJ_SHORT; break; } case PARTICIPLE : { if ( _QM(rShortForm) & GetLine(s2i(gram_code))->m_Grammems ) return PARTICIPLE_SHORT; break; } } return TagId; }; string RussianCaseNumberGender(const CAgramtab* pGramTab, const string& adj, const string& common_noun_grm, const string& noun) { assert (false); //return pGramTab->GleicheGenderNumberCase(common_noun_grm.c_str(), noun.c_str(), adj.c_str()); return ""; };