void LemmatizatorStorage_SQLITE::Lemmatize( const lem::UCString &word, lem::MCollect<lem::UCString> &lemmas ) { lemmas.clear(); lem::MemFormatter mem; mem.printf( "SELECT L.lemma" " FROM lexemes_n X, lemmas L" " WHERE X.lexeme='%us' AND L.id=X.id_lemma", to_upper(word).c_str() ); lem::Ptr<LS_ResultSet> rs(cnx->Select(lem::to_utf8(mem.string()))); while( rs->Fetch() ) { lemmas.push_back( rs->GetUCString(0) ); } if( lemmas.empty() ) { lemmas.push_back(word); } return; }
void SynPatternResult::FilterExportedNodes(const lem::MCollect< ExportNode > & must_be_exported) { if (must_be_exported.empty()) { exported_nodes.clear(); } else { lem::MCollect< std::pair<const lem::UCString*, const Word_Form*> > filtered; for (lem::Container::size_type i = 0; i < exported_nodes.size(); ++i) { const lem::UCString & name = *exported_nodes[i].first; for (lem::Container::size_type j = 0; j < must_be_exported.size(); ++j) { if (must_be_exported[j].node_name == name) { // Нашли ссылку, которую нужно перебросить в новый список, возможно уже под другим именем filtered.push_back(std::make_pair(&must_be_exported[j].as_name, exported_nodes[i].second)); break; } } } exported_nodes = filtered; } return; }
// Ищем в справочнике набор тегов, заданный списком tags. При необходимости // вносим в БД новую запись. Возвращается ID найденной или созданной записи. int TagSets::Register( const lem::MCollect< std::pair<int,int> > &tags ) { if( tags.empty() ) { return 0; } #if defined LEM_THREADS lem::Process::CritSecLocker lock(&cs); #endif // Для устранения вариантов записи одного и того же набора тегов отсортируем элементы по id_tag. lem::MCollect< std::pair<int,int> > *sorted_tags = new lem::MCollect< std::pair<int,int> >(tags); std::sort( sorted_tags->begin(), sorted_tags->end(), tags_sorter ); // Такой кортеж есть? const int i = tag_ptr.find(*sorted_tags); if( i==UNKNOWN ) { // Нет. // Поищем в БД. lem::UFString s; if( tags.size()==1 ) { s = lem::format_str( L"%d %d", tags.front().first, tags.front().second ); } else if( tags.size()==2 ) { s = lem::format_str( L"%d %d %d %d", sorted_tags->get(0).first, sorted_tags->get(0).second, sorted_tags->get(1).first, sorted_tags->get(1).second ); } else { for( lem::Container::size_type i=0; i<sorted_tags->size(); ++i ) { if(i>0) s += L' '; s += lem::format_str( L"%d %d", sorted_tags->get(i).first, sorted_tags->get(i).second ); } } const int id = db->AddTagSet(s); id2tags.insert( std::make_pair(id,sorted_tags) ); tag_ptr.push_back( sorted_tags ); tagset_id.push_back(id); return id; } else { delete sorted_tags; return tagset_id[i]; } }
void SynPatternResult::FilterExportedCoords(const lem::MCollect<int> & must_be_exported) { if (must_be_exported.empty()) exported_coords.clear(); else { std::multimap< int /*id_coord*/, int /*id_state*/ > filtered; for (auto it = exported_coords.begin(); it != exported_coords.end(); ++it) { if (must_be_exported.find(it->first) != UNKNOWN) filtered.insert(*it); } exported_coords = filtered; } return; }
bool LA_Recognizer::ApplyForSyllabs( const lem::UCString &word, lem::Real1 word_rel, const lem::MCollect<lem::UCString> & syllabs, lem::Real1 min_bound, lem::MCollect<Solarix::Word_Coord> &found_list, lem::MCollect<ProjScore> &val_list, lem::PtrCollect<Solarix::LA_ProjectInfo> &inf_list, int id_language, LA_RecognitionTrace *trace ) { LEM_CHECKIT_Z( !syllabs.empty() ); bool matched=false; if( lem::is_quantor(id_language) ) { LoadAllLangs(); // Apply all rules. for( lem::Container::size_type j=0; j<rules.size(); ++j ) { const LA_RecognitionRules *r = rules[j]; if( r->ApplyForSyllabs( word, word_rel, syllabs, found_list, val_list, inf_list, trace ) ) matched=true; } } else { LoadRules(id_language); const LA_RecognitionRules *rules1 = GetRules(id_language); if( rules1->ApplyForSyllabs( word, word_rel, syllabs, found_list, val_list, inf_list, trace ) ) matched=true; const LA_RecognitionRules *rules2 = GetRules(UNKNOWN); if( rules2->ApplyForSyllabs( word, word_rel, syllabs, found_list, val_list, inf_list, trace ) ) matched=true; } return matched; }
Word_Form::Word_Form( const lem::MCollect<const Word_Form*> &variants ) { LEM_CHECKIT_Z( !variants.empty() ); // Первая версия становится основной, ее не копируем в альтернативы. for( lem::Container::size_type i=1; i<variants.size(); ++i ) alt.push_back( new Word_Form(*variants[i]) ); name = variants[0]->name; normalized = variants[0]->normalized; pair = variants[0]->pair; entry_key = variants[0]->entry_key; val = variants[0]->val; score=variants[0]->score; origin_pos = variants[0]->origin_pos; tokenizer_flags = variants[0]->tokenizer_flags; iversion = seq_iversion++; return; }
static bool IsHtmlClosed( const lem::UFString &tag ) { if( tags1.empty() ) { const wchar_t* stags[] = { L"br", L"hr", L"link", L"meta", L"img", L"input", NULL }; int i=0; while(stags[i]!=NULL) tags1.push_back( lem::UFString(stags[i++]) ); } for( lem::Container::size_type i=0; i<tags1.size(); ++i ) { const lem::UFString &t = tags1[i]; if( tag.eq_begi(t) && (tag.length()==t.length() || tag[ t.length() ]==L' ' ) ) return true; } return false; }
static bool IsTextDelimiterTag( const UFString &tag ) { if( tags2.empty() ) { const wchar_t* stags[] = { L"p", L"br", L"table", L"td", L"tr", L"th", L"ol", L"ul", L"li", L"dd", L"input", L"frame", L"div", NULL }; int i=0; while(stags[i]!=NULL) tags2.push_back( lem::UFString(stags[i++]) ); } for( lem::Container::size_type i=0; i<tags2.size(); ++i ) { const lem::UFString &t = tags2[i]; if( tag.eq_begi(t) && (tag.length()==t.length() || tag[ t.length() ]==L' ' ) ) return true; } return false; }